1.说说你对盒子模型的理解,如何切换
当对一个文档进行布局的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型,
将所有元素表示为一个个矩形的盒子
•
content,即实际内容,显示文本和图像
•
boreder,即边框,围绕元素内容的内边距的一条或多条线,由粗细、样式、颜色三
部分组成
•
padding,即内边距,清除内容周围的区域,内边距是透明的,取值不能为负,受盒
子的 background 属性影响
•
margin,即外边距,在元素外创建额外的空白,空白通常指不能放其他元素的区域
盒子模型可以分成:
•
W3C 标准盒子模型,是浏览器默认的盒子模型
o
盒子总宽度 = width + padding + border + margin;
o
盒子总高度 = height + padding + border + margin
o
也就是,width/height 只是内容高度,不包含 padding 和 border 值
•
IE 怪异盒子模型
o
盒子总宽度 = width + margin;
o
盒子总高度 = height + margin;
o
也就是,width/height 包含了 padding 和 border 值
Box-sizing
定义了引擎应该如何计算一个元素的总宽度和总高度
•
content-box
默认值,元素的 width/height 不包含 padding,border,与标准盒子
模型表现一致
•
border-box
元素的 width/height 包含 padding,border,与怪异盒子模型表现一
致
•
inherit
指定 box-sizing 属性的值,应该从父元素继承
2. css 选择器有哪些?优先级?哪些属性可以继承?
css 选择器
•
id 选择器(#box),选择 id 为 box 的元素
•
类选择器(.one),选择类名为 one 的所有元素
•
标签选择器(div),选择标签为 div 的所有元素
•
后代选择器(#box div),选择 id 为 box 元素内部所有的 div 元素
•
子选择器(.one>one_1),选择父元素为.one 的所有.one_1 的元素
•
相邻同胞选择器(.one+.two),选择紧接在.one 之后的所有.two 元素
•
群组选择器(div,p),选择 div、p 的所有元素
•
还有一些使用频率相对没那么多的选择器:
•
伪类选择器
o
:link:选择未被访问的连接
o
:visited:选取已被访问的链接
o
:active:选择活动链接
o
:hover:鼠标指针浮动在上面的元素
o
:focus:选择具有焦点的
o
:first-child:父元素的首个子元素
•
伪元素选择器
o
:first-letter :用于选取指定选择器的首字母
o
:first-line :选取指定选择器的首行
o
:before : 选择器在被选元素的内容前面插入内容
o
:after : 选择器在被选元素的内容后面插入内
•
属性选择器
o
[attribute]选择带有 attribute 属性的元素
o
[attribute=value]选择所有使用 attribute=value 的元素
o
[attribute~=value]选择 attribute 属性包含 value 的元素
o
[attributel=value]:选择 attribute 属性以 value 开头的元素
•
在 CSS3 中新增的选择器有如下:
o
层次选择器(p~ul),选择前面有 p 元素的每个 ul 元素
o
伪类选择器
▪
:first-of-type 表示一组同级元素中其类型的第一个元素
▪
:last-of-type 表示一组同级元素中其类型的最后一个元素
▪
:only-of-type 表示没有同类型兄弟元素的元素
▪
:only-child 表示没有任何兄弟的元素
▪
:nth-child(n) 根据元素在一组同级中的位置匹配元素
▪
:nth-last-of-type(n) 匹配给定类型的元素,基于它们在一组兄弟元
素中的位置,从末尾开始计数
▪
:last-child 表示一组兄弟元素中的最后一个元素
▪
:root 设置 HTML 文档
▪
:empty 指定空的元素
▪
:enabled 选择可用元素
▪
:disabled 选择被禁用元素
▪
:checked 选择选中的元素
▪
:not(selector) 选择与 <selector> 不匹配的所有
元素
•
属性选择器
o
[attribute*=value]:选择 attribute 属性值包含 value 的所有元素选择
o
[attribute^=value]: attribute 属性开头为 value 的所有元素
o
[attribute$=value]:选择 attribute 属性结尾为 value 的所有元素
优先级
内联 > ID 选择器 > 类选择器 > 标签选择器
•
如果存在内联样式,那么 A = 1, 否则 A = 0
•
B 的值等于 ID 选择器出现的次数
•
C 的值等于 类选择器 和 属性选择器 和 伪类 出现的总次数
•
D 的值等于 标签选择器 和 伪元素 出现的总次数
比较规则:
•
从左往右依次进行比较 ,较大者优先级更高
•
如果相等,则继续往右移动一位进行比较
•
如果 4 位全部相等,则后面的会覆盖前面的
内联样式的优先级最高,如果外部样式需要覆盖内联样式,就需要使用!important
继承属性
•
字体系列属性
o
font:组合字体
o
font-family:规定元素的字体系列
o
font-weight:设置字体的粗细
o
font-size:设置字体的尺寸
o
font-style:定义字体的风格
o
font-variant:偏大或偏小的字体
•
文本系列属性
o
text-indent:文本缩进
o
text-align:文本水平对刘
o
line-height:行高
o
word-spacing:增加或减少单词间的空白
o
letter-spacing:增加或减少字符间的空白
o
text-transform:控制文本大小写
o
direction:规定文本的书写方向
o
color:文本颜色
•
元素可见性
o
visibility
•
表格布局属性
o
caption-side:定位表格标题位置
o
border-collapse:合并表格边框
o
border-spacing:设置相邻单元格的边框间的距离
o
empty-cells:单元格的边框的出现与消失
o
table-layout:表格的宽度由什么决定
•
列表属性
o
list-style-type:文字前面的小点点样式
o
list-style-position:小点点位置
o
list-style:以上的属性可通过这属性集合
•
引用
o
quotes:设置嵌套引用的引号类型
•
光标属性
o
cursor:箭头可以变成需要的形状
继承中比较特殊的几点:
•
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
3. 元素水平垂直居中的方法有哪些?如果元素不定宽高呢?
实现元素水平垂直居中的方式:
• 使用 Flexbox 布局:
o
将父容器的 display 属性设置为 flex,
o
然后使用 align-items 和 justify-content 属性分别设置为 center,
• 使用绝对定位和负边距:
o
父级设置为相对定位,子级绝对定位,
o
并将 left 和 top 属性设置为 50%,
o
然后使用负边距将子级向左和向上移动自身宽度和高度的一半
o
不要求父元素的高度
• 使用 table 布局:
o
设置父元素为 display:table-cell,
o
子元素设置 display: inline-block。
o
父元素利用 vertical 和 text-align 可以让所有的行内块级元素水平垂直居中
o
vertical-align: middle;
o
text-align: center
• 使用 grid 布局:
o
将父容器的 display 属性设置为 grid,
o
并使用 justify-items 和 align-items 属性分别设置为 center,
• 使用 transform 和 translate 方法:
o
不需要知道自身元素的宽高
o
父级设置为相对定位,子级绝对定位
o
translate(-50%, -50%)将子级水平和垂直方向上平移自身宽度和高度的一半
• 利用定位+margin:auto
o
父级设置为相对定位,子级绝对定位
o
四个定位属性的值都设置了 0
o
如果子级没有设置宽高,则会被拉开到和父级一样宽高
o
子元素设置了宽高,实际上子级的虚拟占位已经撑满了整个父级
o
margin:auto 就可以上下左右都居中
• 内联元素居中布局
o 水平居中
▪
行内元素可设置:text-align: center
▪
flex 布局设置父元素:display: flex; justify-content: center
o 垂直居中
▪
单行文本父元素确认高度:height === line-height
▪
多行文本父元素确认高度:display: table-cell; vertical-align: middle
• 块级元素居中布局
o 水平居中
▪
定宽: margin: 0 auto
▪
绝对定位+left:50%+margin:负自身一半
o 垂直居中
▪
position: absolute 设置 left、top、margin-left、margin-top(定高)
▪
display: table-cell
▪
transform: translate(x, y)
▪
flex(不定高,不定宽)
▪
grid(不定高,不定宽),兼容性相对比较
4. 怎么理解回流跟重绘?什么场景下会触发?如何减少回流和重回
Html 的渲染流程:dom 节点 dom 树 css 生成 OM Html 分为 dom+css
回流(重排):获取尺寸大小 生成几何 重绘:根据像素渲染 回流一定重绘
•
回流:
布局引擎会根据各种样式计算每个盒子在页面上的大小与位置
•
重绘:
当计算好盒模型的位置、大小及其他属性后,浏览器根据每个盒子特性进行绘制
浏览器解析渲染机制:
⚫
解析 HTML,生成 DOM 树,解析 CSS,生成 CSSOM 树
⚫
将 DOM 树和 CSSOM 树结合,生成渲染树(Render Tree)
⚫
Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小)
⚫
Painting(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝对像素
⚫
Display:将像素发送给 GPU,展示在页面上
回流触发时机
•
添加或删除可见的 DOM 元素
•
元素的位置发生变化
•
元素的尺寸发生变化(包括外边距、内边框、边框大小、高度和宽度等)
•
内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代
•
页面一开始渲染的时候(这避免不了)
•
浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)
重绘触发时机
•
触发回流一定会触发重绘
•
颜色的修改
•
文本方向的修改
•
阴影的修改
减少回流和重回
• 想设定元素的样式,通过改变元素的 class 类名 (尽可能在 DOM 树的最里层)
• 避免设置多项内联样式
•
应用复杂的元素动画,使用 position 属性 fixed 值或 absolute 值
•
避免使用 table 布局,每个元素的大小以及内容的改动,导致整个 table 的重新计算
•
使用 css3 硬件加速,可以让 transform、opacity、filters 这些动画不会引起回流重绘
•
避免使用 CSS 的 JavaScript 表达式
5. 什么是响应式设计?响应式设计的基本原理是什么?如何做?
适配 rem(根元素字体大小) em(父元素字体大小)媒体查询 vw/vh(性能问题) %
响应式网站设计
是一种网络页面设计布局,页面的设计与开发应当根据用户行为以及设备环
境(系统平台、屏幕尺寸、屏幕定向等)进行相应的响应和调整
响应式设计的基本原理
是通过媒体查询检测不同的设备屏幕尺寸做处理,为了处理移动端,
页面头部必须有 meta 声明 viewport
属性对应:
•
width=device-width: 是自适应手机屏幕的尺寸宽度
•
maximum-scale:是缩放比例的最大值
•
inital-scale:是缩放的初始化
•
user-scalable:是用户的可以缩放的操作
实现响应式布局的方式有如下:
• 媒体查询
o
设置不同类型的媒体条件,并根据对应的条件,
o
给相应符合条件的媒体调用相对应的样式表
o
当视口在 375px - 600px 之间,设置特定字体大小 18px
@media screen (min-width: 375px) and (max-width: 600px) {
body {
font-size: 18px;
}
}
• 百分比
o
当浏览器的宽度或者高度发生变化时,通过百分比单位
o
浏览器中的组件的宽和高随着浏览器的变化而变化,从而实现响应式的效果
• vw/vh
o
vw 表示相对于视图窗口的宽度,
o
vh 表示相对于视图窗口高度。
o
任意层级元素,在使用 vw 单位的情况下,1vw 都等于视图宽度的百分之一
• rem
o
rem 是相对于根元素 html 的 font-size 属性
o
默认情况下浏览器字体大小为 16px,此时 1rem = 16px
6. 如果要做优化,CSS 提高性能的方法有哪些?
• 内联首屏关键 CSS
o
使浏览器在下载完 html 后就能立刻渲染
o
注意:较大的 css 代码并不合适内联(初始拥塞窗口、没有缓存)
• 异步加载 CSS
o
使用 javascript 将 link 标签插到 head 标签最后
o
设置 link 标签 media 属性为 noexist
▪ 浏览器认为当前样式表不适用当前类型,会在不阻塞页面渲染的情
况下再进行下载。
▪ 加载完成后,将 media 的值设为 screen 或 all,从而让浏览器开始解
析 CSS
o
通过 rel 属性将 link 元素标记为 alternate 可选样式表,
▪ 加载完成之后,将 rel 设回 stylesheet
• 资源压缩
o
利用 webpack、gulp/grunt、rollup 等模块化工具
o
将 css 代码进行压缩,使文件变小,大大降低了浏览器的加载时间
• 合理使用选择器
o
不要嵌套使用过多复杂选择器,最好不要三层以上
o
使用 id 选择器就没必要再进行嵌套
o
通配符和属性选择器效率最低,避免使用
• 减少使用昂贵的属性
o
如 box-shadow/border-radius/filter/透明度/:nth-child 等,
o
在页面发生重绘的时候,昂贵属性会降低浏览器的渲染性能
• 不要使用@import
o
css 样式文件有两种引入方式,一种是 link 元素,另一种是@import
o
@import 会影响浏览器的并行下载,使得页面在加载时增加额外的延迟,增
添了额外的往返耗时
o
而且多个@import 可能会导致下载顺序紊乱