- 企业IT架构能力,是企业IT管理的核心能力之一
xibusj
业内资讯金融电信工作
随着中古哦企业信息化成都与IT管理水平的提高,企业IT架构规划会受到越来越多的企业所重视,IT架构能力是企业核心IT管理能力之一。在80年代未,美国的政府部门与大型企业就已经把企业IT架构作为提高IT管理水平的核心能力来做,如:美国的国防部与财政部已经通过企业IT架构的规划,建立了完善的IT标准规范体系,在IT项目的招标时,这些IT标准规范就是技术方案选择的依据,不符合IT标准规范的方案的供应商就
- 深度学习(1)-简单神经网络示例
yyc_audio
深度学习人工智能
我们来看一个神经网络的具体实例:使用Python的Keras库来学习手写数字分类。在这个例子中,我们要解决的问题是,将手写数字的灰度图像(28像素×28像素)划分到10个类别中(从0到9)。我们将使用MNIST数据集,图2-1给出了MNIST数据集的一些样本。在机器学习中,分类问题中的某个类别叫作类(class),数据点叫作样本(sample),与某个样本对应的类叫作标签(label)。你不需要现
- 【PyQt】工具栏(QToolBar)与动作按钮(QAction)使用指南
shanks66
pyqtpython开发语言
PyQt工具栏(QToolBar)与动作按钮(QAction)使用指南️一、基础用法示例classMainWindow(QMainWindow):def__init__(self):super().__init__()#创建工具栏self.toolbar=self.addToolBar("主工具栏")#创建动作集合self._create_actions()#设置工具栏图标尺寸self.toolb
- DeepSeek 如何获取数据库中的表信息(表名和字段名称)
Python测试之道
数据库python
问题背景在测试或开发过程中,了解数据库的表结构(包括表名和字段名称)是非常重要的一环,尤其是当我们需要测试数据库相关的功能或验证数据时。然而,手动查看数据库结构可能耗时且容易出错。如果能够通过DeepSeek与数据库直接交互,自动获取表名和字段信息,将大大提升测试效率。本文将介绍如何利用DeepSeek模型结合数据库查询,自动生成表结构信息(包括表名和字段名称)。此外,还会展示如何通过自然语言描述
- spring boot整合kettle调用数据库资源库中的job
机智的小小岳
kettle
前言上篇文章记录了springboot如何调用文件资源库下的job,这篇文章会记录如何调用数据库资源库的job1.导入jar包在调用文件路径下的job需要导入如下jar包而调用数据库资源库的job需要多导入2个jar包否则会报http错误,jar包如下2.运行代码代码如下:@TestpublicvoidexcuteDBTrans()throwsKettleException{//初始环境EnvUt
- 李志军老师操作系统实验
JHFeng_white&black
ubuntulinux运维
李志军老师操作系统实验_环境搭建准备工作宿主机:macOSMonterey12.2.1虚拟机:我选择的虚拟机是vmwarefusionpro(之前用的是免费版本的vmwarefusion,但是安装了ubuntu后发现始终安装不了vmwaretools)ubuntu18.04.6,这里附上我的网盘链接链接:https://pan.baidu.com/s/1bHpi-PWaqJSUAM_7BXPaLQ
- 【Stable Diffusion部署至Google Colab】
星星点点洲
stablediffusion
GoogleColab中快速搭建带GPU加速的StableDiffusionWebUIfromgoogle.colabimportdrivedrive.mount('/content/drive')!mkdir/content/drive/MyDrive/sd-webui-files!pipinstalltorch==1.13.1+cu116torchvision==0.14.1+cu116tor
- python创建sqlite3数据库_SQLite – Python | 菜鸟教程
weixin_39683144
SQLite-Python安装SQLite3可使用sqlite3模块与Python进行集成。sqlite3模块是由GerhardHaring编写的。它提供了一个与PEP249描述的DB-API2.0规范兼容的SQL接口。您不需要单独安装该模块,因为Python2.5.x以上版本默认自带了该模块。为了使用sqlite3模块,您首先必须创建一个表示数据库的连接对象,然后您可以有选择地创建光标对象,这将
- 宋红康 MySQL高级篇 学习笔记
偷偷儿
mysql学习笔记
架构篇1.sql的执行流程查询缓存:有就直接返回了。解析器进行解析:检查sql合不合语法优化器:对sql语句进行逻辑优化,看是否使用索引,生成执行计划。存贮引擎:myisam,innodb去执行上述计划当然返回的时候也会在缓存一下结果。索引及调优篇1.InnoDBB+树索引的注意事项(页分裂的场景)1.根页面万年不动(页分裂):创建后,用户数据用完可用空间,就会新产生一个页a,并将根节点的数据复制
- 大厂学院 雷丰阳 JUC 学习笔记
偷偷儿
学习笔记java
基础篇synchronized和lock的区别1.从本质上:synchronized是Java内的一个关键字,lock是一个接口。2.从代码的形式上:synchronized在发生异常时会主动释放锁,lock需要我们在finally语句中释放,不然会死锁;通过lock可以知道锁有没有获取成功,synchronied不行3.从性能上:在1.6前没提出锁升级过程时,重量级锁在被系统检测到后会阻塞尝试获
- Python根据日历 算排班表
装小蜜监理王志峰
python开发语言
Python,开发者相关视频讲解:python的or运算赋值用法用python编程Excel有没有用处?011_编程到底好玩在哪?查看python文件_输出py文件_cat_运行python文件_shel如何实现Python根据日历算排班表简介作为一名经验丰富的开发者,我将教你如何用Python根据日历来算排班表。这是一个常见且实用的功能,在很多公司和组织都有类似的需求。在这篇文章中,我将通过步骤
- 使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)指南
web13688565871
nginxhttps运维
在网络应用中,代理服务器是用于中转用户请求和服务端响应的工具。正向代理主要用于客户端与外部服务器之间的访问代理,帮助客户端隐藏其IP地址或访问受限资源。本文将详细介绍如何使用Nginx搭建正向代理服务器,特别是针对HTTPS网站的代理。一、正向代理与反向代理的区别1.1正向代理正向代理位于客户端和服务器之间,代表客户端向服务器发起请求。其主要功能是隐藏客户端信息,代理客户端进行网络访问,尤其是访问
- 【MySQL】 常见数据类型
web13688565871
面试学习路线阿里巴巴mysql数据库
MySQL常见数据类型1.整数类型2.浮点数类型3.定点数类型4.bit类型5.字符串类型5.1char和varchar类型5.2日期类型和时间类型5.3enum和set类型1.整数类型整数类型默认都是有符号整数类型名称字节数类型说明tinyint1带符号的范围-128127,无符号范围0255smallint2带符号的范围-2^15~2^15-1,无符号2^16-1mediumint3带符号的范
- C语言分支和循环语句
止水编程 water_proof
c语言开发语言
C语言中的语句分为三种结构:1.顺序结构2.选择结构:if、switch、case等等3.循环结构:while、for、dowhile等等本章主要讲:分支语句:if、switch循环语句:while、for、dowhile、goto语句一.什么是语句?C语句可分为以下五类:1.表达式语句2.函数调用语句3.控制语句4.复合语句5.空语句本章后面介绍的是控制语句C语言中有九种控制语句,可分为以下三类
- AI创业:数据管理的策略与对策分析
AI天才研究院
【精选大厂面试题详解】大厂Offer收割机面试题简历程序员读书硅基计算碳基计算认知计算生物计算深度学习神经网络大数据AIGCAGILLMJavaPython架构设计Agent程序员实现财富自由
AI创业:数据管理的策略与对策分析1.如何评估一个创业公司所收集的数据的价值?题目:请解释如何评估一个创业公司所收集的数据的价值,并提供几个关键指标。答案:评估数据的价值通常涉及以下几个方面:数据质量:数据是否准确、完整、及时和一致。数据独特性:数据是否具有独特性,是否能提供独有的洞察。数据量:数据的总量,更多的数据往往意味着更多的分析机会。数据相关性:数据与业务目标的相关性,能否直接支持业务决策
- C 语言模块化编程中的头文件
Dola_Pan
C语言c语言单片机stm32
前面我们在演示多文件编程时创建了main.c和module.c两个源文件,并在module.c中定义了一个函数和一个全局变量,然后在main.c中进行了声明。不过实际开发中很少这样做,一般是将函数和变量的声明放到头文件,再在当前源文件中#include进来。如果变量的值是固定的,最好使用宏来代替。下面的例子是改进后的代码main.c源码:1.#include2.#include"module.h"
- 简化版奇异值分解(SVD)方法详解
DuHz
数理统计学知识机器学习人工智能算法信息与通信信号处理
简化版奇异值分解(SVD)方法详解奇异值分解(SVD)是一个强大的矩阵分解工具,广泛应用于数据降维、图像压缩、机器学习等领域。然而,对于大规模数据或高维矩阵,计算和存储的开销非常大,因此提出了多种简化版的SVD方法。这些简化版方法在保证解的精度的同时,能够显著减少计算量和内存占用。本文将详细介绍几种简化版SVD方法,包括经济型SVD、随机化SVD、增量SVD、分块SVD和偏最小二乘法(PLS),并
- 私有AI对话系统实战:基于Ollama+OpenWebUI的DeepSeek-R1本地化部署手把手教学(可共享访问)
Developer-YC
DeekSeek-R1大模型解读与实战教学人工智能pythonjavagithubnode.js语言模型后端
引言:为什么选择本地部署大模型?在数据隐私日益重要的今天,云端AI服务的局限性逐渐显现——敏感信息泄露风险、网络延迟依赖、定制化能力不足。而通过**Ollama(模型管理框架)和OpenWebUI(可视化交互工具)**的组合,开发者可以轻松实现大模型(如DeepSeek-R1)的本地部署,兼顾性能与安全。本文将以DeepSeek-R1为例,详解从环境配置到实战应用的全流程。一、工具与模型简介1.O
- 性能测试的类型有哪些?
Feng.Lee
漫谈测试测试工具性能优化
目录1.基准测试2.负载测试3.压力测试4.峰值测试5.并发测试6.容积测试7.稳定性测试8.可扩展性测试9.配置测试性能测试是为测量或评估被测软件系统与性能效率相关的特性而实施的一类测试,它关注被测系统在不同负载下的各种性能效率。软件系统的性能效率相关特性的覆盖面非常广泛,包括系统的执行效率、资源占用、系统容量等。性能测试是一个广泛的领域,它包括多种类型的测试,每种类型都有其特定的目标和应用场景
- 腾讯HunyuanVideo-HD:高清视频处理技术的革新
IT·小灰灰
音视频自动化人工智能深度学习数据挖掘图像处理数据分析
在数字化时代,视频内容已成为信息传播的主要形式之一。随着用户对视频质量要求的不断提高,高清视频处理技术成为了各大科技公司竞相研发的重点。腾讯作为中国领先的互联网科技公司,一直致力于推动视频处理技术的创新。最近,腾讯推出了HunyuanVideo-HD,这是一项旨在提升高清视频处理效率和质量的技术。本文将深入探讨HunyuanVideo-HD的技术特点、应用场景、使用方法及其对行业的影响。目录一、技
- Python爬虫——网站基本信息
IT·小灰灰
python爬虫开发语言网络
在智能时代,数据是新的石油。Python爬虫技术赋予了我们成为数据猎人的能力,让我们能够在网络的广袤土地上狩猎,为机器学习和人工智能的发展提供燃料目录一、介绍——Python二、介绍——Python爬虫1.请求库2.解析库3.数据存储4.多线程/多进程5.异步编程6.代理和反爬虫7.爬虫框架8.爬虫的法律和道德问题9.异常处理10.日志记录三、爬虫示例代码一、介绍——PythonPython是一种
- 【Spring Boot】Spring Boot解决循环依赖
m0_54851477
面试学习路线阿里巴巴springbootjavaspring
目录循环依赖一、前言二、Bean的创建过程三、循环依赖检测机制3.1实例化阶段3.2属性填充阶段3.3依赖注入循环依赖一、前言环依赖是指两个或者多个bean互相依赖对方,从而形成一个闭环。例如:BeanA依赖于BeanB,而BeanB又依赖于BeanA。可能会导致Spring在尝试创建这些bean实例时出现问题,因为他们互相等待对方被创建,最终导致应用程序无法启动。Spring是如何发现这种循环依
- 推荐开源备份神器:BackupPC,企业级数据守护者
徐耘馨
推荐开源备份神器:BackupPC,企业级数据守护者项目地址:https://gitcode.com/gh_mirrors/ba/backuppc在数字时代,数据如同企业的生命线,重要性不言而喻。为了保障这份“生命线”的安全,今天我们来探讨一个高效且成熟的备份解决方案——BackupPC。项目介绍BackupPC是一款基于Perl编写的高性价比企业级备份系统,专为Linux、Windows和Mac
- MyBatis-Plus介绍及基本使用
墨鸦_Cormorant
#Java持久层mybatismybatis-plusmybatisPlus
文章目录概述介绍MyBatis-Plus常用配置分页插件配置类注解配置快速入门maven依赖编写配置文件编写启动类编写MybatisPlus配置类代码生成器:MybatisPlusGeneratormaven依赖代码生成器核心类概述介绍MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。主页:传送门引入MyBati
- 使用Wiki.js配置LDAP认证的编程学习
飘逸徜徉在自由的云端
javascript学习前端编程学习
在本文中,我们将探讨如何使用Wiki.js配置LDAP认证。LDAP(轻量级目录访问协议)是一种常用的用于身份验证和授权的协议,它可以让我们将用户凭据存储在中央目录服务器上,以便在不同的应用程序中进行身份验证。Wiki.js是一款功能强大的开源知识管理和文档协作平台,它提供了许多扩展功能,其中之一就是支持LDAP认证。通过配置LDAP认证,我们可以让用户使用他们在LDAP服务器上的凭据登录Wiki
- 【JavaScript】异步编程汇总
秀秀_heo
JavaScriptjavascript开发语言ecmascript
异步编程解决方案:回调函数PromiseGeneratorawait/async回调函数回调函数是早期处理异步编程的主要方式,虽然它本身存在很多的缺陷,比如那个时候对于复杂的异步处理常常会出现回调地狱。但是因为JavaScript中当时并没有很好的API来帮助我们以比较优雅的方式编写代码,所以依然应用非常广泛。functionfetchData(url,callback){setTimeout((
- 利用VBA+SQL查询Excel工作表数据(模糊查询)
VBAMatrix
VBA代码sqlexcel数据库
续前2篇:1.利用VBA+SQL查询Excel工作表数据(基本查询)2.利用VBA+SQL查询Excel工作表数据(条件查询)本文将继续使用VBA+SQL查询的模板,并详细介绍SQL模糊查询语句在VBA中的使用。VBA+SQL查询的模板题[员工花名册$A1:I65536]SQL模糊查询的关键词是like、notlike,通常结合通配符使用,从而实现模糊查询的功能。通配符见下表:通配符含义%匹配一个
- 在Excel中创建与使用自定义函数
VBAMatrix
excel
Excel内置了很多丰富的函数,大大方便我们进行数据处理等日常操作。但如果一个单元格内函数嵌套太多,不仅不直观,而且不易理解。同时,对于一些数据处理的需求,Excel内置函数或难以实现。此刻,我们可以自定义函数,方便自己调用。例如,我们可以编写自定义函数,根据填写的身份证号码,判断位数是否正确,或者提取出生日期,判断性别,获取籍贯信息等个人信息。再如,产品编号“P-11-305-22”这字符串,我
- deepseek本地部署指南(解决下载速度慢)
灶龙
人工智能deepseek人工智能本地部署
很多人都照着网上的教程去下载,但是网上的下载Ollama模型都下载不了,所以我打算写一篇不同的deepseek本地部署指南。第一步:下载奇游加速器奇游加速器下载网址下载奇游加速器后进行安装,然后搜索Deepseek点击进去,不要着急充值,点击右上角口令,输入奇游111就可以白嫖三天的有效期。第二步:下载Ollama框架点进Deepseek后,先点击一键加速(中途不要关闭),在点击右边的游戏服务中的
- 使用Docker搭建Flink集群
O_1CxH
Flink大数据Kafka大数据dockerflink容器
目录使用Docker搭建Flink集群docker-compose一键搭建步骤附录参考资料使用Docker搭建Flink集群在学习大数据框架的时候,需要一个真实的环境。我们知道,像spark、flink这些计算框架都有多种运行模式:在本地使用多线程模拟集群真正的分布式集群如果直接在IDE(Intellj)里面编译和运行写好的程序,实际上是用的前一种运行模式;如果想尝试真正的生产环境中任务的提交和管
- SQL的各种连接查询
xieke90
UNION ALLUNION外连接内连接JOIN
一、内连接
概念:内连接就是使用比较运算符根据每个表共有的列的值匹配两个表中的行。
内连接(join 或者inner join )
SQL语法:
select * fron
- java编程思想--复用类
百合不是茶
java继承代理组合final类
复用类看着标题都不知道是什么,再加上java编程思想翻译的比价难懂,所以知道现在才看这本软件界的奇书
一:组合语法:就是将对象的引用放到新类中即可
代码:
package com.wj.reuse;
/**
*
* @author Administrator 组
- [开源与生态系统]国产CPU的生态系统
comsci
cpu
计算机要从娃娃抓起...而孩子最喜欢玩游戏....
要让国产CPU在国内市场形成自己的生态系统和产业链,国家和企业就不能够忘记游戏这个非常关键的环节....
投入一些资金和资源,人力和政策,让游
- JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
商人shang
jvm内存
jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。
HotSpot虚拟机GC算法采用分代收
- 页面上调用 QQ
oloz
qq
<A href="tencent://message/?uin=707321921&Site=有事Q我&Menu=yes">
<img style="border:0px;" src=http://wpa.qq.com/pa?p=1:707321921:1></a>
- 一些问题
文强chu
问题
1.eclipse 导出 doc 出现“The Javadoc command does not exist.” javadoc command 选择 jdk/bin/javadoc.exe 2.tomcate 配置 web 项目 .....
SQL:3.mysql * 必须得放前面 否则 select&nbs
- 生活没有安全感
小桔子
生活孤独安全感
圈子好小,身边朋友没几个,交心的更是少之又少。在深圳,除了男朋友,没几个亲密的人。不知不觉男朋友成了唯一的依靠,毫不夸张的说,业余生活的全部。现在感情好,也很幸福的。但是说不准难免人心会变嘛,不发生什么大家都乐融融,发生什么很难处理。我想说如果不幸被分手(无论原因如何),生活难免变化很大,在深圳,我没交心的朋友。明
- php 基础语法
aichenglong
php 基本语法
1 .1 php变量必须以$开头
<?php
$a=” b”;
echo
?>
1 .2 php基本数据库类型 Integer float/double Boolean string
1 .3 复合数据类型 数组array和对象 object
1 .4 特殊数据类型 null 资源类型(resource) $co
- mybatis tools 配置详解
AILIKES
mybatis
MyBatis Generator中文文档
MyBatis Generator中文文档地址:
http://generator.sturgeon.mopaas.com/
该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。
本文使用Markdown进行编辑,但是博客显示效
- 继承与多态的探讨
百合不是茶
JAVA面向对象 继承 对象
继承 extends 多态
继承是面向对象最经常使用的特征之一:继承语法是通过继承发、基类的域和方法 //继承就是从现有的类中生成一个新的类,这个新类拥有现有类的所有extends是使用继承的关键字:
在A类中定义属性和方法;
class A{
//定义属性
int age;
//定义方法
public void go
- JS的undefined与null的实例
bijian1013
JavaScriptJavaScript
<form name="theform" id="theform">
</form>
<script language="javascript">
var a
alert(typeof(b)); //这里提示undefined
if(theform.datas
- TDD实践(一)
bijian1013
java敏捷TDD
一.TDD概述
TDD:测试驱动开发,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完全部功能的开发。
- [Maven学习笔记十]Maven Profile与资源文件过滤器
bit1129
maven
什么是Maven Profile
Maven Profile的含义是针对编译打包环境和编译打包目的配置定制,可以在不同的环境上选择相应的配置,例如DB信息,可以根据是为开发环境编译打包,还是为生产环境编译打包,动态的选择正确的DB配置信息
Profile的激活机制
1.Profile可以手工激活,比如在Intellij Idea的Maven Project视图中可以选择一个P
- 【Hive八】Hive用户自定义生成表函数(UDTF)
bit1129
hive
1. 什么是UDTF
UDTF,是User Defined Table-Generating Functions,一眼看上去,貌似是用户自定义生成表函数,这个生成表不应该理解为生成了一个HQL Table, 貌似更应该理解为生成了类似关系表的二维行数据集
2. 如何实现UDTF
继承org.apache.hadoop.hive.ql.udf.generic
- tfs restful api 加auth 2.0认计
ronin47
目前思考如何给tfs的ngx-tfs api增加安全性。有如下两点:
一是基于客户端的ip设置。这个比较容易实现。
二是基于OAuth2.0认证,这个需要lua,实现起来相对于一来说,有些难度。
现在重点介绍第二种方法实现思路。
前言:我们使用Nginx的Lua中间件建立了OAuth2认证和授权层。如果你也有此打算,阅读下面的文档,实现自动化并获得收益。SeatGe
- jdk环境变量配置
byalias
javajdk
进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置:
1、下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是:jdk-7u79-windows-x64.exe
2、安装jdk-7u79-windows-x64.exe
3、配置环境变量:右击"计算机"-->&quo
- 《代码大全》表驱动法-Table Driven Approach-2
bylijinnan
java
package com.ljn.base;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.uti
- SQL 数值四舍五入 小数点后保留2位
chicony
四舍五入
1.round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位。
2.numeric 函数的2个参数,第一个表示数据长度,第二个参数表示小数点后位数。
例如:
select cast(round(12.5,2) as numeric(5,2))  
- c++运算符重载
CrazyMizzz
C++
一、加+,减-,乘*,除/ 的运算符重载
Rational operator*(const Rational &x) const{
return Rational(x.a * this->a);
}
在这里只写乘法的,加减除的写法类似
二、<<输出,>>输入的运算符重载
&nb
- hive DDL语法汇总
daizj
hive修改列DDL修改表
hive DDL语法汇总
1、对表重命名
hive> ALTER TABLE table_name RENAME TO new_table_name;
2、修改表备注
hive> ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comm
- jbox使用说明
dcj3sjt126com
Web
参考网址:http://www.kudystudio.com/jbox/jbox-demo.html jBox v2.3 beta [
点击下载]
技术交流QQGroup:172543951 100521167
[2011-11-11] jBox v2.3 正式版
- [调整&修复] IE6下有iframe或页面有active、applet控件
- UISegmentedControl 开发笔记
dcj3sjt126com
// typedef NS_ENUM(NSInteger, UISegmentedControlStyle) {
// UISegmentedControlStylePlain, // large plain
&
- Slick生成表映射文件
ekian
scala
Scala添加SLICK进行数据库操作,需在sbt文件上添加slick-codegen包
"com.typesafe.slick" %% "slick-codegen" % slickVersion
因为我是连接SQL Server数据库,还需添加slick-extensions,jtds包
"com.typesa
- ES-TEST
gengzg
test
package com.MarkNum;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation
- 为何外键不再推荐使用
hugh.wang
mysqlDB
表的关联,是一种逻辑关系,并不需要进行物理上的“硬关联”,而且你所期望的关联,其实只是其数据上存在一定的联系而已,而这种联系实际上是在设计之初就定义好的固有逻辑。
在业务代码中实现的时候,只要按照设计之初的这种固有关联逻辑来处理数据即可,并不需要在数据库层面进行“硬关联”,因为在数据库层面通过使用外键的方式进行“硬关联”,会带来很多额外的资源消耗来进行一致性和完整性校验,即使很多时候我们并不
- 领域驱动设计
julyflame
VODAO设计模式DTOpo
概念:
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对
- 单例设计模式
hm4123660
javaSingleton单例设计模式懒汉式饿汉式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
&nb
- logback
zhb8015
loglogback
一、logback的介绍
Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-class
- 整合Kafka到Spark Streaming——代码示例和挑战
Stark_Summer
sparkstormzookeeperPARALLELISMprocessing
作者Michael G. Noll是瑞士的一位工程师和研究员,效力于Verisign,是Verisign实验室的大规模数据分析基础设施(基础Hadoop)的技术主管。本文,Michael详细的演示了如何将Kafka整合到Spark Streaming中。 期间, Michael还提到了将Kafka整合到 Spark Streaming中的一些现状,非常值得阅读,虽然有一些信息在Spark 1.2版
- spring-master-slave-commondao
王新春
DAOspringdataSourceslavemaster
互联网的web项目,都有个特点:请求的并发量高,其中请求最耗时的db操作,又是系统优化的重中之重。
为此,往往搭建 db的 一主多从库的 数据库架构。作为web的DAO层,要保证针对主库进行写操作,对多个从库进行读操作。当然在一些请求中,为了避免主从复制的延迟导致的数据不一致性,部分的读操作也要到主库上。(这种需求一般通过业务垂直分开,比如下单业务的代码所部署的机器,读去应该也要从主库读取数
本文是内部的一次分享沉淀,偏向基础但是涉及了一些有意思的细节,文笔有限,才疏学浅,文中若有不正之处,万望告知。
前端的一大工作内容就是去兼容页面在不同内核的浏览器,不同的设备,不同的分辨率下的行为,使页面的能正常工作在各种各样的宿主环境当中。
而本文的主题 -- 移动端开发的兼容适配与性能优化,就是希望能从一些常见的移动端开发问题出发,厘清 Web 移动端开发的前前后后,一些技术的发展过程,一些问题的优化手段以及给出一些常见的兼容性问题的解决方案。
什么是响应式设计
首先先聊聊响应式设计,这个与移动端开发有着密切的联系。
响应式设计即是 RWD,Responsive Web Design。
这里百度或者谷歌一下会有各种各样的答案。这里一段摘自知乎上我觉得很棒的一个答案:什么是响应式布局设计?
根据维基百科及其参考文献,理论上,响应式界面能够适应不同的设备。描述响应式界面最著名的一句话就是“Content is like water”,翻译成中文便是“如果将屏幕看作容器,那么内容就像水一样”。
为什么要设计响应式界面
为什么要费神地尝试统一所有设备呢?
响应式界面的四个层次
响应式界面的基本规则
可伸缩的内容区块:内容区块的在一定程度上能够自动调整,以确保填满整个页面
![](https://camo.githubusercontent.com/d4c2ad4e808f254cecba903db20531565625648a/68747470733a2f2f706963342e7a68696d672e636f6d2f76322d33633734376563313632336164663563623061393539376638653362363461345f722e6a7067)
可自由排布的内容区块:当页面尺寸变动较大时,能够减少/增加排布的列数
![](https://camo.githubusercontent.com/d7158e20d6535037daf2e338a8a66a447ba5c941/68747470733a2f2f706963332e7a68696d672e636f6d2f76322d63396661663334316335343732343039656332373737393531396131386532625f722e6a7067)
适应页面尺寸的边距:到页面尺寸发生更大变化时,区块的边距也应该变化
![](https://camo.githubusercontent.com/faec035913c4e247941eac04e8c6e00f80e98e5f/68747470733a2f2f706963322e7a68696d672e636f6d2f76322d39323634616263383132663430343339613335363137366165616365366263365f722e6a7067)
能够适应比例变化的图片:对于常见的宽度调整,图片在隐去两侧部分时,依旧保持美观可用
![](https://camo.githubusercontent.com/f9bf4d445a1c6fabf33c5e8057b646224774c3d5/68747470733a2f2f706963342e7a68696d672e636f6d2f76322d32353666333139613466626638313538663633373963323665303063396165615f722e6a7067)
能够自动隐藏/部分显示的内容:如在电脑上显示的的大段描述文本,在手机上就只能少量显示或全部隐藏
![](https://camo.githubusercontent.com/d678021e90fb3972d216c6dcf677ccca7b789b2f/68747470733a2f2f706963342e7a68696d672e636f6d2f76322d61383632356539363161336533346131663133336266393137336134393330645f722e6a7067)
能自动折叠的导航和菜单:展开还是收起,应该根据页面尺寸来判断
![](https://camo.githubusercontent.com/9376c757901765f0f76b36aa1412d6a1be09feb5/68747470733a2f2f706963332e7a68696d672e636f6d2f76322d66663238316166626565373832613934663463376635386530326437663035645f722e6a7067)
放弃使用像素作为尺寸单位:用dp(对于前端来说,这里可能是rem)尺寸等方法来确保页面在分辨率相差很大的设备上,看起来也能保持一致。同时也要求提供的图片应该比预想的更大,才能适应高分辨率的屏幕
上面一段我觉得已经涵盖了响应式设计的绝大部分,简单总结起来,可以概括为:
响应式 vs. 自适应
响应式设计是 Responsive Web Design(RWD),自适应设计是 Adaptive Web Design(AWD)。经常有人会将两者混为一谈,或者其实根本也区分不了所谓的响应式与自适应。
其实在我写这篇文章的时候,我也无法很好的去区分两者。
RWD 和 AWD 两者都是为了适配各种不同的移动设备,致力于提升用户体验所产生的的技术。核心思想是用技术来使网页适应从小到大(现在到超大)的不同分辨率的屏幕。通常认为,RWD 是 AWD 的子集。
RWD:Ethan Marcote 的文章是大家认为 RWD 的起源。他提出的 RWD 方案是通过 HTML 和 CSS 的媒体查询技术,配合流体布局实现。RWD 倾向于只改变元素的外观布局,而不大幅度改变内容。Jeffrey Zeldman 总结说,我们就把 RWD 定义为一切能用来为各种分辨率和设备性能优化视觉体验的技术。
AWD:Adaptive Design 是 Aaron Gustafson 的书的标题。他认为 AWD 在包括 RWD 的 CSS 媒体查询技术以外,也要用 Javascript 来操作 HTML 来更适应移动设备的能力。AWD 有可能会针对移动端用户减去内容,减去功能。AWD 可以在服务器端就进行优化,把优化过的内容送到终端上。
一图胜千言。
从定义上而言,RWD 是一套代码,适用于所有屏幕。而 AWD 则是多端多套代码。本文不会过多去纠结响应式与自适应区别,我觉得这两者的本质都是致力于适配不同设备,更好地提升用户体验。
Quora - Responsive Design vs. Adaptive Design?
zhihu -- Responsive design 和 Adaptive design 的区别
渐进增强 vs. 优雅降级
渐进增强(progressive enhancement):针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
优雅降级(graceful degradation):一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
区别:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。
渐进增强/优雅降级通常是 AWD 会牵扯到的另一个技术术语。本质上而言即是随着屏幕的大小的改变,功能会一点一点增强。
也通常会用在一些高级 CSS3 属性上,我们对一些 CSS 属性进行特性检测,甚至不进行特性检测直接使用。后果是在支持它的网页上该属性正常展示,而不支持它的网页该属性不生效,但也不影响用户的基本使用。
典型的例子是 CSS3 逐渐被大众认可并被使用,PC端页面开始由 IE678 向兼容性更好的IE9+,chrome,firefox浏览器转变的时期。我们可以对页面元素直接使用阴影,圆角等属性。对于不支持它的低版本 IE 而言,没有什么损失,而对于支持它的高级浏览器而言,带给了用户更好的交互视觉体验,这就是渐进增强。
移动端屏幕适配方案
下面会针对一些具体的案例,展开讲讲。第一个是高保真还原设计稿,也就是如何适配移动端繁杂的屏幕大小。
通常而言,设计师只会给出单一分辨率下的设计稿,而我们要做的,就是以这个设计稿为基准,去适配所有不同大小的移动端设备。
在此之前,有一些基础概念需要理解。
设备独立像素
以 iPhone6/7/8为例,这里我们打开 Chrome 开发者工具:
这里的
375 * 667
表示的是什么呢,表示的是设备独立像素(DIP),也可以理解为 CSS 像素,也称为逻辑像素:设备独立像素 = CSS 像素 = 逻辑像素
如何记忆呢?这里使用 CSS 像素来记忆,也就是说。我们设定一个宽度为 375px 的 div,刚好可以充满这个设备的一行,配合高度 667px ,则 div 的大小刚好可以充满整个屏幕。
物理像素
OK,那么,什么又是物理像素呢。我们到电商网站购买手机,都会看一看手机的参数,以 JD 上的 iPhone7 为例:
可以看到,iPhone7 的分辨率是
1334 x 750
,这里描述的就是屏幕实际的物理像素。物理像素,又称为设备像素。显示屏是由一个个物理像素点组成的,
1334 x 750
表示手机分别在垂直和水平上所具有的像素点数。通过控制每个像素点的颜色,就可以使屏幕显示出不同的图像,屏幕从工厂出来那天起,它上面的物理像素点就固定不变了,单位为pt。设备像素 = 物理像素
DPR(Device Pixel Ratio) 设备像素比
OK,有了上面两个概念,就可以顺理成章引出下一个概念。DPR(Device Pixel Ratio) 设备像素比,这个与我们通常说的视网膜屏(多倍屏,Retina屏)有关。
设备像素比描述的是未缩放状态下,物理像素和设备独立像素的初始比例关系。
简单的计算公式:
DPR = 物理像素 / 设备独立像素
我们套用一下上面 iPhone7 的数据(取设备的物理像素宽度与设备独立像素宽度进行计算):
iPhone7’s DPR = iPhone7’s 物理像素宽度 / iPhone7's 设备独立像素宽度 = 2
可以得到 iPhone7 的 dpr 为 2。也就是我们常说的视网膜屏幕。
视网膜(Retina)屏幕是苹果公司"发明"的一个营销术语。 苹果公司将
dpr > 1
的屏幕称为视网膜屏幕。在视网膜屏幕中,以 dpr = 2 为例,把 4(2x2) 个像素当 1 个像素使用,这样让屏幕看起来更精致,但是元素的大小本身却不会改变:
OK,我们再来看看 iPhone XS Max:
它的物理像素如上图是
2688 x 1242
,它的 CSS 像素是
896 x 414
,很容易得出 iPhone XS Max 的 dpr 为 3。OK,到这里我们就完成了一个小的里程碑。我们通常说的H5手机适配也就是指的这两个维度:
适配不同屏幕大小
适配不同屏幕大小,也就是适配不同屏幕下的 CSS 像素。最早移动端屏幕 CSS 像素适配方案是CSS媒体查询。但是无法做到高保真接近 100% 的还原。
适配不同屏幕大小其实只需要遵循一条原则,确保页面元素大小的与屏幕大小保持一定比例。也就是:按比例还原设计稿
假设我们现在拿到标注为
375*667
的大小的设计稿,其中一个元素的标注如下:以页面宽度为基准的话,那么,
209/375 = 55.73%
80/375 = 21.33%
这样,无论屏幕的 CSS 像素宽度是 320px 还是 375px 还是 414px,按照等量百分比还原出来的界面总是正确的。
然而,理想很丰满,现实很骨感。实现上述百分比方案的核心需要一个全局通用的基准单位,让所有百分比展示以它为基准,但是在 CSS 中,根据CSS Values and Units Module Level 4的定义:
具体来说:
宽度(width)、间距(maring/padding)支持百分比值,但默认的相对参考值是包含块的宽度;
高度(height)百分比的大小是相对其父级元素高的大小;
边框(border)不支持百分值;
边框圆角半径(border-radius)支持百分比值,但水平方向相对参考值是盒子的宽度,垂直方向相对参考值是盒子的高度;
文本大小(font-size)支持百分比值,但相对参考值是父元素的font-size的值;
盒阴影(box-shadow)和文本阴影(text-shadow)不支持百分比值;
首先,支持百分比单位的度量属性有其各自的参照基准,其次并非所有度量属性都支持百分比单位。所以我们需要另辟蹊径。
rem 适配方案
在 vw 方案出来之前,最被大众接受的就是使用 rem 进行适配的方案,因为 rem 满足上面说的,可以是一个全局性的基准单位。
flexible
基于此,淘宝早年推行的一套以 rem 为基准的适配方案:lib-flexible。其核心做法在于:
标签,设置 viewport 的缩放
元素添加 data-dpr 属性,并且动态改写 data-dpr 的值
document.documentElement.clientWidth
动态修改的 font-size ,页面其他元素使用 rem 作为长度单位进行布局,从而实现页面的等比缩放
hotcss
hotcss 不是一个库,也不是一个框架。它是一个移动端布局开发解决方案。使用 hotcss 可以让移动端布局开发更容易。本质的思想与 flexible 完全一致。
对于 rem 方案的一些总结
使用 flexible/hotcss 作为屏幕宽度适配解决方案,是存在一些问题的:
innerWidth/innerHeight
也会随之发生变化,如果业务逻辑有获取此类高宽进行其他计算的,可能会导致意想不到的错误;vw 适配方案
严格来说,使用 rem 进行页面适配其实是一种 hack 手段,rem 单位的初衷本身并不是用来进行移动端页面宽度适配的。
到了今天,有了一种更好的替代方案,使用 vw 进行适配 。
百分比适配方案的核心需要一个全局通用的基准单位,rem 是不错,但是需要借助 Javascript 进行动态修改根元素的
font-size
,而 vw/vh(vmax/vmin) 的出现则很好弥补 rem 需要 JS 辅助的缺点。根据 CSS Values and Units Module Level 4:
vw
等于初始包含块(html元素)宽度的1%,也就是1vw
等于window.innerWidth
的数值的 1%1vh
等于window.innerHeight
的数值的 1%再以上面设计稿图的元素为例,那么,
209/375 = 55.73% = 55.73vw
80/375 = 21.33% = 21.33vw
根据相关的测试,可以使用 vw 进行长度单位的有:
简单的一个页面,看看效果,完全是等比例缩放的效果:
CodePen Demo(移动端打开):使用 vw 进行页面适配
自动转换插件
当我们使用 rem 作为长度单位的时,通常会有借助 Sass/Less 实现一个转换函数,像是这样:
同理,在 vw 方案下,我们只需要去改写这个方法:
当然,我们还可以借助一些插件包去实现这个自动转换,提高效率,譬如 postcss-px-to-viewport
vw polyfill
vw 现在毕竟还是存在兼容问题的,看看兼容性:
其实已经覆盖了绝大部分设备,那么如果业务使用了且又真的出现了兼容问题,应该怎么处理呢?有两种方式可以进行降级处理:
对于 vw 方案的一些总结
vw 确实看上去很不错,但是也是存在它的一些问题:
当然,两个方案现阶段其实都可以使用甚至一起搭配使用,更多详情可以读读:
1px线
上面说到使用 vw 适配屏幕大小方案,其中有一个缺点就是在 Retina 屏下,无法很好的展示真正的 1px 物理像素线条。
设计师想要的 retina 下
border: 1px
,其实是 1 物理像素宽,而不是 1 CSS 像素宽度,对于 CSS 而言:border-width: 1px
这里的 1px 其实是 1 CSS像素宽度,等于 2 像素物理宽度,设计师其实想要的是border-width: 0.5px
;然而,并不是所有手机浏览器都能识别
border-width: 0.5px
,在 iOS7 以下,Android 等其他系统里,小于 1px 的单位会被当成为 0px 处理,那么如何实现这 0.5px、0.33px 呢?这里介绍几种方法:
Retina 屏幕下 1px 线的实现
图片适配及优化
图像通常占据了网页上下载资源绝的大部分。优化图像通常可以最大限度地减少从网站下载的字节数以及提高网站性能。
通常可以,有一些通用的优化手段:
本文重点关注如何在不同的 dpr 屏幕下,让图片看起来都不失真。
首先就是上述的第二点,尽可能利用 CSS3\SVG 矢量图像替代某些光栅图像。某些简单的几何图标,可以用 CSS3 快速实现的图形,都应该尽量避免使用光栅图像。这样能够保证它们在任何尺寸下都不会失真。
其次,实在到了必须使用光栅图像的地步,也是有许多方式能保证图像在各种场景下都不失真。
无脑多倍图
在移动端假设我们需要一张 CSS 像素为
300 x 200
的图像,考虑到现在已经有了 dpr = 3 的设备,那么要保证图片在 dpr = 3 的设备下也正常高清展示,我们最大可能需要一张900 x 600
的原图。这样,不管设备的 dpr 是否为 3,我们统一都使用 3 倍图。这样即使在 dpr = 1,dpr = 2 的设备上,也能非常好的展示图片。
当然这样并不可取,会造成大量带宽的浪费。现代浏览器,提供了更好的方式,让我们能够根据设备 dpr 的不同,提供不同尺寸的图片。
srcset 配合 1x 2x 像素密度描述符
简单来说,srcset 可以根据不同的 dpr 拉取对应尺寸的图片:
上面
srcset
里的 1x,2x 表示 像素密度描述符,表示images/illustration-small.png
这张图images/illustration-big.png
这张图srcset 属性配合 sizes 属性 w 宽度描述符
上面 1x,2x 的写法比较容易接受易于理解。
除此之外,srcset属性还有一个 w 宽度描述符,配合 sizes 属性一起使用,可以覆盖更多的面。
以下面这段代码为例子:
解析一下:
sizes = “(min-width: 600px) 600px, 300px"
的意思是,如果屏幕当前的 CSS 像素宽度大于或者等于 600px,则图片的 CSS 宽度为 600px,反之,则图片的 CSS 宽度为 300px。也就是 sizes 属性声明了在不同宽度下图片的 CSS 宽度表现。这里可以理解为,大屏幕下图片宽度为 600px,小屏幕下图片宽度为 300px。(具体的媒体查询代码由 CSS 实现)
srcset = “[email protected] 300w, [email protected] 600w, [email protected] 1200w
里面的 300w,600w,900w 叫宽度描述符。怎么确定当前场景会选取哪张图片呢?1. 当前屏幕 dpr = 2 ,CSS 宽度为 375px。
当前屏幕 CSS 宽度为 375px,则图片 CSS 宽度为 300px。分别用上述 3 个宽度描述符的数值除以 300。
上面计算得到的 1、 2、 4 即是算出的有效的像素密度,换算成和 x 描述符等价的值 。这里 600w 算出的 2 即满足 dpr = 2 的情况,选择此张图。
2. 当前屏幕 dpr = 3 ,CSS 宽度为 414px。
当前屏幕 CSS 宽度为 414px,则图片 CSS 宽度仍为 300px。再计算一次:
因为 dpr = 3,2 已经不满足了,则此时会选择 1200w 这张图。
3. 当前屏幕 dpr = 1 ,CSS 宽度为 1920px。
当前屏幕 CSS 宽度为 1920px,则图片 CSS 宽度变为了 600px。再计算一次:
因为 dpr = 1,所以此时会选择 600w 对应的图片。
具体的可以试下这个 Demo:CodePen Demo -- srcset属性配合w宽度描述符配合sizes属性
此方案的意义在于考虑到了响应性布局的复杂性与屏幕的多样性,利用上述规则,可以一次适配 PC 端大屏幕和移动端高清屏,一箭多雕。
了解更多细节,推荐看看:
字体适配方案
字体大小
字体是很多前端开发同学容易忽略的一个点,但是其中也是有很多小知识点。
首先要知道,浏览器有最小字体限制:
如果小于最小字体,那么字体默认就是最小字体。
字体的选择展示
在字体适配上面,我们需要从性能和展示效果两个维度去考虑。
完整的一个字体资源实在太大了,所以我们应该尽可能的使用用户设备上已有的字体,而不是额外去下载字体资源,从而使加载时间明显加快。
而从展示效果层面来说,使用系统字体能更好的与当前操作系统使用的相匹配,得到最佳的展示效果。所以我们在字体使用方面,有一个应该尽量去遵循的原则,也是现在大部分网站在字体适配上使用的策略:
使用各个支持平台上的默认系统字体。
兼顾各个操作系统
常见的操作系统有 Windows、Windows Phone、Mac OS X、iPhone、Android Phone、Linux。当然对于普通用户而言,无须关注 Linux 系统。
下面就以 CSS-Trick 网站最新的 font-family 为例,看看他们是如何在字体选择上做到适配各个操作系统的
font-family 关键字
对于 CSS 中的
font-family
而言,它有两类取值。一类是类似这样的具体的字体族名定义:
font-family: Arial
这里定义了一个具体的字体样式,字体族名为Arial
;一类是通用字体族名,它是一种备选机制,用于在指定的字体不可用时给出较好的字体,类似这样:
font-family: sans-serif
。其中,
sans-serif
表无衬线字体族,例如, "Open Sans", "Arial" "微软雅黑" 等等。关于通用字体族名,在 CSS Fonts Module Level 3 -- Basic Font Properties 中,定义了 5 个,也就是我们熟知的几个通用字体族名:
新增通用字体族关键字
而在 CSS Fonts Module Level 4 -- Generic font families 中,新增了几个关键字:
我们看看用的最多的
system-ui
。system-ui
简单而言,
font-family: system-ui
的目的就是在不同的操作系统的 Web 页面下,自动选择本操作系统下的默认系统字体。默认使用特定操作系统的系统字体可以提高性能,因为浏览器或者 webview 不必去下载任何字体文件,而是使用已有的字体文件。
font-family: system-ui
字体设置的优势之处在于它与当前操作系统使用的字体相匹配,对于文本内容而言,它可以得到最恰当的展示。San Francisco Fonts
OK,简单了解了
system-ui
字体族。但是像-apple-system
、BlinkMacSystemFont
没有在最新的标准里出现。它们又代表什么意思呢?在此之前,先了解下
San Francisco Fonts
。San Francisco Fonts
又叫旧金山字体,是一款西文字体。随着 iOS 9 更新面世,在 WatchOS 中随 Apple Watch 一起悄然发售,并且还将在 Apple TV 上的新 tvOS 中使用。San Francisco Fonts
在 iOS 系统上用于替代升级另外一款西文字体Helvetica Neue
。Apple 做了一些重要的改变,使其成为平台上更好的, 甚至是完美的西文字体。-apple-system/BlinkMacSystemFont
话说回来。正如每个前端开发人员都知道的那样,将一个功能纳入规范是一回事,将其纳入浏览器又是另一回事。
幸运的是,
system-ui
的普及很快。 Chrome 和 Safari 都可以在各种平台上完全支持它。只有 Mozilla 和 Windows 相对落后。看看
system-ui
的兼容性,Can i Use -- system-ui(图片截取日 2019-08-13):仔细看上图的最后两行:
考虑到不同平台及向后兼容,在 macOS 和 iOS 上,我们需要使用
-apple-system
及BlinkMacSystemFont
来兼容适配system-ui
标准。Segoe UI
Segoe UI 是 Windows 从 Vista 开始的默认西文字体族,只有西文,不支持汉字,属于无衬线体。
它也表示一个系列而不是某一款单一字体。使用
font-family: Segoe UI
可以在 Windows 平台及 Windows Phone 上选取最佳的西文字体展示。Roboto
Roboto 是为 Android 操作系统设计的一个无衬线字体家族。Google 描述该字体为“现代的、但平易近人”和“有感情”的。
这个字体家族包含Thin、Light、Regular、Medium、Bold、Black六种粗细及相配的斜体。
总结一下
到此,我们可以总结一下了。以 CSS-Tricks 网站的 font-family 定义为例子:
上述 5 个字体族定义,优先级由高到底,可以看到,它们 5 个都并非某个特定字体,基本的核心思想都是选择对应平台上的默认系统字体。
涵盖了 iOS、MAC OS X、Android、Windows、Windows Phone 基本所有用户经常使用的主流操作系统。
使用系统默认字体的主要原因是性能。字体通常是网站上加载的最大/最重的资源之一。如果我们可以使用用户机器上已有的字体,我们就完全不需要再去获取字体资源,从而使加载时间明显加快。
并且系统字体的优点在于它与当前操作系统使用的相匹配,因此它的文本展示必然也是一个让人舒适展示效果。
当然,上述
font-family
的定义不一定是最佳的。譬如天猫移动端在font-family
最前面添加了"PingFang SC",miui,..
必定也有他们的业务上的考虑。但是一些 fallback 方案向后兼容的思想都是一致的,值得参考学习。更多的关于字体方面的细节知识,可以看看这几篇文章:
前端布局的兼容适配
前端工程师的一大工作内容就是页面布局。无论在PC端还是移动端,页面布局的兼容适配都是重中之重。在整个前端发展的历程中,布局的方法也在不断的推陈出新。
布局发展历程
简单来说,前端的布局发展历程经历了下面几个过程:
表格布局 --> 定位布局 --> 浮动布局 --> flexbox布局 --> gridbox布局
每一种布局在特定时期都发挥了重要的作用,而每一种新的布局方式的出现,往往都是因为现有的布局方式已经在该时期已经无法很好的满足开发者的需求,无法满足越来越潮流的页面布局的方式。
以 Flexbox 的出现为例子,在 Flexbox 被大家广为接受使用之前。我们一直在使用定位+浮动的布局方式。像下面这个布局:
容器宽度不定,内部三个元素,均分排列且占满整个空间,并且垂直居中。如果使用定位+浮动的布局方式,你无法很快想到最佳的解决方式。三个元素并排那么必然需要浮动或者绝对定位,容器宽度不定且中间元素始终居中,需要顾虑的方面就很多了。也许使用
text-align: justufy
可以 hack 实现,等等等等。然而,使用 flexbox 布局的话,只需要:
flexbox 的出现,一次性解决了流动布局,弹性布局,排列方式等多个问题。并且它是简洁的,可控的。
再来看一个例子,水平垂直居中一个元素。使用 flexbox 也许是最便捷的:
最便捷的垂直居中方式
CSS Grid Layout
OK,flexbox 已经足够优秀了,为什么 gird 网格布局的出现又是为什么?它解决了什么 flex 布局无法很好解决的问题?
看看下面这张图:
flexbox 是一维布局,他只能在一条直线上放置你的内容区块;而grid是一个二维布局。它除了可以灵活的控制水平方向之外,还能轻易的控制垂直方向的布局模式。对于上图那样的九宫格布局,它就可以轻而易举的完成。
一图以蔽之,flexbox:
gridbox:
在现阶段,移动端布局应当更多使用 flexbox 去完成(相对那些还在使用 float 布局的),而考虑到未来页面布局的推陈出新。对于 Grid 布局我们应当像前几年对待 flexbox 一样,重视起来,随着兼容性的普及,Grid 布局也会慢慢成为主流。
最后
好了,本文到此结束,希望对你有帮助 :)
更多精彩技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。