当我们对一个文档进行布局的时候,浏览器的渲染引擎会根据标准之一的css基础的盒模型,将所有的元素表示为一个个的矩形的盒子
一个盒子又四个部分组成,content(实际内容,显示文本和图像)、padding(内边距)、border(边框)、margin(外边距)
在css中,盒子模型可以分为:
w3c标准盒子模型(默认)
怪异盒子模型
标准的盒子模型,就是浏览器默认的盒子模型
盒子总宽度 = width + margin;
盒子总高度 = height + margin;
box-sizing 属性定义了引擎应该如何计算一个元素的总宽度和总高度
语法:
box-sizing: content-box|border-box|inherit:
css选择器是css规则的第一部分
他是元素和其他部分结合起来告诉浏览器哪个html元素应当被选为应用规则中的css属性值的方式
id选择器:# 选择id为box的元素
类选择器:.
标签选择器:选择标签
后代选择器:(#box div):选择id为box元素内部的所有的div元素
子选择器:用>表示
相邻同胞选择器(.one+.two),选择紧接在.one之后的所有.two元素
群组选择器:使用,分割
伪类选择器::常见的又:hover
伪元素选择器::before :after
属性选择器:[]
内联 > ID选择器 > 类选择器 > 标签选择器
属性继承指的是我们给父级元素设置一些属性,后代元素就会自动拥有这些属性
属性继承,主要分为以下几种:
字体系列继承
文本系列属性
元素可见性
表格布局属性
列表属性
引用
光标属性
a 标签的字体颜色不能被继承
h1-h6标签字体的大下也是不能被继承的
display
文本属性:vertical-align、text-decoration
盒子模型的属性:宽度、高度、内外边距、边框等
背景属性:背景图片、颜色、位置等
定位属性:浮动、清除浮动、定位position等
生成内容属性:content、counter-reset、counter-increment
轮廓样式属性:outline-style、outline-width、outline-color、outline
页面样式属性:size、page-break-before、page-break-after
传统的项目开发中,我们只会用到px、%、em这几个单位,只适用于大部分的项目开发
从c3开始,浏览器对计量单位的支持又提升到了另一个境界,新增了rem、vh、vw、vm、一些计量单位
在css中,可以分为长度单位、绝对单位
CSS单位 | |
---|---|
相对长度单位 | em、ex、ch、rem、vw、vh、vmin、vmax、% |
绝对长度单位 | cm、mm、in、px、pt、pc |
px:像素,所谓像素就是显现在我们显示器上的一个个小点,每个像素的点都是同等大小,所以像素为计量单位被分在了绝对单位中
em:相对长度单位,相对于对当前对象内文本的字体尺寸,相对于浏览器的默认字体尺寸1em=16px
em的值不是固定的,em会继承父级元素的字体大小
em是相对长度单位
任意浏览器的默认字体高都是16px
rem:相对单位,相对的只是html根元素的font-size值,常用于自适应
vh、vw是根据窗口的宽度和高度分成了100等份,跟%容易混淆,%是相对父元素
在css中我们通常使用px作为单位,在pc浏览器中css的一个像素对应着电脑屏幕的一个物理像素
这回造成一个错觉,会认为css中的像素就是设备的物理像素
但是实际并非如此,css中的像素只是一个抽象的单位,在不同的设备和环境中,css中1px所代表的设备物理像素是不同的
这背后就涉及了css像素、设备像素、设备独立像素、dpr、ppi的概念
适应于web编程,在css中以px为后缀,是一个长度单位,px是一个相对单位,相对的是设备像素
px会受到下面的因素的影响而变化:
设备像素(device pixels),又称为物理像素
从屏幕在工厂生产出的那天起,它上面设备像素点就固定不变了,单位为pt
与设备无关的逻辑像素,代表可以通过程序控制使用的虚拟像素,是一个总体概念
设备像素比,代表设备独立像素到设备像素的转换关系
DPR=设备像素/设备独立像素
每英寸像素,表示每英寸所包含的像素点数目,更确切的说应该是像素密度
无缩放情况下,1个CSS像素等于1个设备独立像素
设备像素由屏幕生产之后就不发生改变,而设备独立像素是一个虚拟单位会发生改变
PC端中,1个设备独立像素 = 1个设备像素 (在100%,未缩放的情况下)
在移动端中,标准屏幕(160ppi)下 1个设备独立像素 = 1个设备像素
设备像素比(dpr) = 设备像素 / 设备独立像素
每英寸像素(ppi),值越大,图像越清晰
display:none:元素不可见,不占据空间,无法响应点击事件,会导致重排重绘
visibility:hidden:不会触发重排,会触发重绘
opacity:0:表示元素的透明度,不引发重排,一般会引发重绘
设置height、width模型属性为0:盒模型设置为0,可以使用overflow:hidden隐藏子元素
position:absolute:将元素移除可视区域
clip-path:裁剪形式
bfc是块级格式化上下文,他是页面中的一块渲染区域,有一套属于自己的渲染规则
- 内部的盒子会在垂直方向上一个接一个的放置
- 对于同一个BFC的俩个相邻的盒子的margin会发生重叠,与方向无关。
- 每个元素的左外边距与包含块的左边界相接触(从左到右),即使浮动元素也是如此
- BFC的区域不会与float的元素区域重叠
- 计算BFC的高度时,浮动子元素也参与计算
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然
bfc的目的就是形成一个相对于外界完全独立的空间,让内部的子元素不会影响外部的元素
bfc触发的条件不限于:
防止margin重叠(塌陷)
清除内部浮动
自适应多栏布局
利用定位+margin:auto:父相子绝
利用定位+margin:负值:
利用定位+transform:translate(-50%, -50%)
将会将元素位移自己宽度和高度的-50%
table布局设置父元素为display:table-cell
,子元素设置 display: inline-block
。利用vertical
和text-align
可以让所有的行内块级元素水平垂直居中
flex布局
display: flex时,表示该容器内部的元素将按照flex进行布局
align-items: center表示这些元素将相对于本容器水平居中
justify-content: center也是同样的道理垂直居中
grid布局:网格布局
根据元素标签的性质,可以分为:
水平居中
垂直居中
水平居中
垂直居中
无论是两栏布局还是三栏布局,使用的频率都非常高
实现的效果就是将页面分割程左右宽度不等的两列,宽度较小的列设置为固定宽度,剩余宽度由另一列撑满
实现的思路:
三栏布局按照左中右的顺序进行排列,通常中间列最宽,左右两列次之
实现三栏布局中间自适应的布局方式有:
弹性布局,可以简便,完整,响应式的实现各种页面布局
flex常用的属性可以划分为容器属性和容器成员属性
flex-direction:决定主轴的方向(即项目的排列方向)
flex-wrap:弹性元素永远沿主轴排列,那么如果主轴排不下,通过flex-wrap
决定容器内项目是否可换行
flex-flow:是flex-direction
属性和flex-wrap
属性的简写形式,默认值为row nowrap
justify-content:定义了项目在主轴上的对齐方式
align-items:定义项目在交叉轴上如何对齐
align-content:定义了多根轴线的对齐方式
order:
定义项目的排列顺序。数值越小,排列越靠前,默认为0
flex-grow:
上面讲到当容器设为flex-wrap: nowrap;
不换行的时候,容器宽度有不够分的情况,弹性元素会根据flex-grow
来决定
flex-shrink:
定义了项目的缩小比例(容器宽度<元素总宽度时如何收缩),默认为1,即如果空间不足,该项目将缩小
flex-basis:
设置的是元素在主轴上的初始尺寸,所谓的初始尺寸就是元素在flex-grow
和flex-shrink
生效前的尺寸
flex:flex
属性是flex-grow
, flex-shrink
和 flex-basis
的简写,默认值为0 1 auto
,也是比较难懂的一个复合属性
align-self:
允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items
属性
默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
移动端,小程序开发
网格布局,是一个二维的布局方式,由丛横相交的两组网格线形成的框架性布局结构,能够同时处理行于列
grid布局属性分为两大类:
容器属性:
display:grid 则该容器是一个块级元素,inline-grid 则容器元素为行内元素
grid-template-columns
属性设置列宽,grid-template-rows
属性设置行高
grid-row-gap
属性、grid-column-gap
属性分别设置行间距和列间距。grid-gap
属性是两者的简写形式
justify-content
属性是整个内容区域在容器里面的水平位置(左中右),align-content
属性是整个内容区域的垂直位置(上中下)
- grid-column-start 属性:左边框所在的垂直网格线
- grid-column-end 属性:右边框所在的垂直网格线
- grid-row-start 属性:上边框所在的水平网格线
- grid-row-end 属性:下边框所在的水平网格线
项目属性
两列布局,三列布局,页面居中
css是一种标记语言,由浏览器解释执行用来使页面更加美观
css3是css的最新标准,向后兼容,css2/1都可以在css3中使用
border-radius:创建圆角边框
box-shadow:为元素添加阴影
border-image:使用图片来绘制边框
box-shadow
设置元素阴影,设置属性如下:
background-clip:背景画
background-origin:图片对其的方向
background-size属性常用来调整背景图片的大小,主要用于设定图片本身
background-break
属性用来控制背景怎样在这些不同的盒子中显示
word-wrap:
text-overflow
设置或检索当当前行超过指定容器的边界时如何显示
text-shadow
可向文本应用阴影。能够规定水平阴影、垂直阴影、模糊距离,以及阴影的颜色
CSS3里面开始支持对文字的更深层次的渲染,具体有三个属性可供设置:
text-fill-color: 设置文字内部填充颜色
text-stroke-color: 设置文字边界填充颜色
text-stroke-width: 设置文字边界宽度
transition
属性可以被指定为一个或多个CSS
属性的过渡效果,多个属性之间用逗号进行分隔,必须规定两项内容:
transform
属性允许你旋转,缩放,倾斜或平移给定元素
颜色渐变是指在两个颜色之间平稳的过渡
CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块
css实现动画的方式,由以下几种:
transition 实现渐变动画
transition
的属性如下:
transform 转变动画
animation 实现自定义动画
属性 | 描述 | 属性值 |
---|---|---|
animation-duration | 指定动画完成一个周期所需要时间,单位秒(s)或毫秒(ms),默认是 0 | |
animation-timing-function | 指定动画计时函数,即动画的速度曲线,默认是 "ease" | linear、ease、ease-in、ease-out、ease-in-out |
animation-delay | 指定动画延迟时间,即动画何时开始,默认是 0 | |
animation-iteration-count | 指定动画播放的次数,默认是 1 | |
animation-direction 指定动画播放的方向 | 默认是 normal | normal、reverse、alternate、alternate-reverse |
animation-fill-mode | 指定动画填充模式。默认是 none | forwards、backwards、both |
animation-play-state | 指定动画播放状态,正在运行或暂停。默认是 running | running、pauser |
animation-name | 指定 @keyframes 动画的名称 |
回流:布局引擎会根据各种样式计算每个盒子在页面上的大小与位置
重绘:当计算好盒模型的位置、大小及其他属性后,浏览器根据每个盒子特性进行绘制
当我们对 DOM
的修改导致了样式的变化(color
或background-color
),却并未影响其几何属性时,浏览器不需重新计算元素的几何属性、直接为该元素绘制新的样式,这里就仅仅触发了重绘
触发回流一定会触发重绘
可以把页面理解为一个黑板,黑板上有一朵画好的小花。现在我们要把这朵从左边移到了右边,那我们要先确定好右边的具体位置,画好形状(回流),再画上它原有的颜色(重绘)
除此之外还有一些其他引起重绘行为:
颜色的修改
文本方向的修改
阴影的修改
由于每次重排都会造成额外的计算消耗,因此大多数浏览器都会通过队列化修改并批量执行来优化重排过程。浏览器会将修改操作放入到队列里,直到过了一段时间或者操作达到了一个阈值,才清空队列
当你获取布局信息的操作的时候,会强制队列刷新,包括前面讲到的offsetTop
等方法都会返回最新的数据
因此浏览器不得不清空队列,触发回流重绘来返回正确的值
避免设置多项内联样式
应用元素的动画,使用position属性的fixed或absolute值
避免应用table布局
使用css3硬件加速
避免使用css的js表达式
响应式网站设计是一种网络页面设计布局,页面的设计与开发应当根据用户行为以及设备环境进行调整
响应式网站常见的特点:
同时适配pc+平板+手机
标签导航在接近受持终端设备使改变为经典的抽屉式导航
网站的布局会根据视口来跳帧模块的大小和位置
媒体查询:使用@Media
查询,可以针对不同的媒体类型定义不同的样式
使用百分比实现响应式效果
vw/vh:相对于视图窗口的宽高度
rem:对于根元素html中font-size属性,默认浏览器的字体大小是16px,1rem=16px
响应式布局优点可以看到:
缺点:
每一个网页都离不开css,很多人认为css主要是用来完成页面布局的,像一些细节或者优化,但是这种想发是不对的
较大的css代码不适合内联,页面首要内容出现在屏幕的时间影响着用户体验,而通过内联css关键代码能够使浏览器在下载完html后就能立即渲染
在CSS
文件请求、下载、解析完成之前,CSS
会阻塞渲染,浏览器将不会渲染任何已处理的内容
前面加载内联代码后,后面的外部引用css
则没必要阻塞浏览器渲染。这时候就可以采取异步加载的方案
media
的值设为screen
或all
,从而让浏览器开始解析CSS利用webpack
、gulp/grunt
、rollup
等模块化工具,将css
代码进行压缩,使文件变小,大大降低了浏览器的加载时间
在页面发生重绘的时候,昂贵属性如box-shadow
/border-radius
/filter
/透明度/:nth-child
等,会降低浏览器的渲染性能
@import
会影响浏览器的并行下载,使得页面在加载时增加额外的延迟,增添了额外的往返耗时
而且多个@import
可能会导致下载顺序紊乱
在日常开发展示页面,如果一段文本的数量过长,受制于元素宽度的因素,有可能不能完全显示,为了提高用户的使用体验,这个时候就需要我们把溢出的文本显示成省略号
对于文本的溢出,我们可以分成两种形式:
理解也很简单,即文本在一行内显示,超出部分以省略号的形式展现
- text-overflow:规定当文本溢出时,显示省略符号来代表被修剪的文本
- white-space:设置文字在一行显示,不能换行
- overflow:文字长度超出限定宽度,则隐藏超出的内容
overflow
设为hidden
,普通情况用在块级元素的外层隐藏内部溢出元素,或者配合下面两个属性实现文本溢出省略
white-space:nowrap
,作用是设置文本不换行,是overflow:hidden
和text-overflow:ellipsis
生效的基础
text-overflow
属性值有如下:
- clip:当对象内文本溢出部分裁切掉
- ellipsis:当对象内文本溢出时显示省略标记(...)
多行文本溢出的时候,我们可以分为两种情况:
基于高度截断:伪元素 + 定位
基于行数截断
视差滚动(Parallax Scrolling)是指多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验
我们可以把网页解刨成:背景层、内容层、悬浮层
当滚动鼠标滑轮的时候,各个图层以不同的速度移动,形成视觉差的效果
使用css
形式实现视觉差滚动效果的方式有:
background-attachment
transform:translate3D
盒子模型默认情况下是一个矩形
.border {
width: 50px;
height: 50px;
border: 2px solid;
border-color: #96ceb4 #ffeead #d9534f #ffad60;
}
将border设置为50px,
.border {
width: 0;
height: 0;
border-style:solid;
border-width: 0 50px 50px;
border-color: transparent transparent #d9534f;
}
Chrome 中文版浏览器会默认设定页面的最小字号是12px,英文版没有限制
原由 Chrome 团队认为汉字小于12px就会增加识别难度
与网页语言无关,取决于用户在Chrome的设置里(chrome://settings/languages)把哪种语言设置为默认显示语言
浏览器默认设定页面的最小字号,用户可以前往 chrome://settings/fonts 根据需求更改
而我们在实际项目中,不能奢求用户更改浏览器设置
对于文本需要以更小的字号来显示,就需要用到一些小技巧
zoom
zoom
的字面意思是“变焦”,可以改变页面上元素的尺寸,属于真实尺寸
- zoom:50%,表示缩小到原来的一半
- zoom:0.5,表示缩小到原来的一半
-webkit-transform:scale()
针对
chrome
浏览器,加webkit
前缀,用transform:scale()
这个属性进行放缩注意的是,使用
scale
属性只对可以定义宽高的元素生效,所以,下面代码中将span
元素转为行内块元素
-webkit-text-size-adjust:none
该属性用来设定文字大小是否根据设备(浏览器)来自动调整显示大小
属性值:
- percentage:字体显示的大小;
- auto:默认,字体大小会根据设备/浏览器来自动调整;
- none:字体大小不会自动调整
Zoom
非标属性,有兼容问题,缩放会改变了元素占据的空间大小,触发重排
-webkit-transform:scale()
大部分现代浏览器支持,并且对英文、数字、中文也能够生效,缩放不会改变了元素占据的空间大小,页面布局不会发生变化
-webkit-text-size-adjust
对谷歌浏览器有版本要求,在27之后,就取消了该属性的支持,并且只对英文、数字生效
Css
作为一门标记性语言,语法相对简单,对使用者的要求较低,但同时也带来一些问题
需要书写大量看似没有逻辑的代码,不方便维护及扩展,不利于复用,尤其对于非前端开发工程师来讲,往往会因为缺少 Css
编写经验而很难写出组织良好且易于维护的 Css
代码
Css
预处理器便是针对上述问题的解决方案
扩充了
Css
语言,增加了诸如变量、混合(mixin)、函数等功能,让Css
更易维护、方便本质上,预处理是
Css
的超集包含一套自定义的语法及一个解析器,根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的
Css
文件
Css
预编译语言在前端里面有三大优秀的预编处理器,分别是:
sass:2007年诞生,最早也是最成熟的css预处理器,文件后缀名为.sass与scss,可以严格按照sass缩进方式省去大括号和分号
less:2009年出现,受sass影响较大,优点是简单和兼容css,缺点就是编程功能不够
stylus:2010年产生,来自node.js社区,主要是给node项目进行css预处理,是一种新型的语言,可以创建健壮的动态的,富有表现力的css
变量(variables)
less
声明的变量必须以@
开头,后面紧跟变量名和变量值,而且变量名和变量值需要使用冒号:
分隔开
sass
声明的变量跟less
十分的相似,只是变量名前面使用@
开头
stylus
声明的变量没有任何的限定,可以使用$
开头,结尾的分号;
可有可无,但变量与变量值之间需要使用=
在
stylus
中我们不建议使用@
符号开头声明变量
作用域(scope)
sass
中不存在全局变量
less
与stylus
的作用域跟javascript
十分的相似,首先会查找局部定义的变量,如果没有找到,会像冒泡一样,一级一级往下查找,直到根为止
代码混合( mixins)
在
less
中,混合的用法是指将定义好的ClassA
中引入另一个已经定义的Class
,也能使用够传递参数,参数变量为@
声明
Sass
声明mixins
时需要使用@mixinn
,后面紧跟mixin
的名,也可以设置参数,参数名为变量$
声明的形式
stylus
中的混合和前两款Css
预处理器语言的混合略有不同,他可以不使用任何符号,就是直接声明Mixins
名,然后在定义参数和默认值之间用等号(=)来连接
嵌套(nested rules):
三者的嵌套语法都是一致的,甚至连引用父级选择器的标记 & 也相同
区别只是 Sass 和 Stylus 可以用没有大括号的方式书写
代码模块化(Modules)
模块化就是将Css
代码分成一个个模块