盒子模型
getComputedStyle()
getBoundingClientRect()
scrollTo()
修改样式的时候,最好避免使用上面列出的属性,他们都会刷新渲染队列。如果要使用它们,最好将值缓存起来。
重绘 repaint
某些元素的样式如颜色改变,但不影响其在文档流中的位置,浏览器会对元素重新绘制
不再执行布局阶段,直接进入绘制阶段
合成
利用transform、opacity和filter可实现合成效果,即GPU加速
避开布局分块和绘制阶段
优化
最小化重绘和重排:样式集中改变,使用添加新样式类名使用 absolute或 fixed使元素脱离文档流(制作复杂动画时对性能有影响)
开启GPU加速。利用css属性transform opacity will-change等,比如改变元素位置,使用translate会比使用绝对定位改变其left或top更高效,因为它不会触发重排或重绘,transform使浏览器为元素创建一个GPU
图层,这使得动画元素在一个独立的层中进行渲染,当元素内容没有改变就没必要进行渲染。
使用 visibility替换 display: none,因为前者只会引起重绘,后者会引发回流(改变了布局)
DOM 离线后修改,如:先把 DOM 设为display:none(有一次 Reflow),然后修改再显示,只会触发一次回流不要把 DOM 结点属性值放在一个循环当成循环里的变量
不要使用 table 布局,可能很小的一个小改动会造成整个 table 重新布局动画实现速度的选择,动画速度越快,回流次数越多,也可以选择使用 requestAnimationFrame
CSS 选择符从右往左匹配查找,避免节点层级过多频繁运行的动画变为图层,图层能够阻止该节点回流影响别的元素。比如对于 video 标签,浏览器会自动将
该节点变为图层通过documentFragment创建一个DOM文档片段,在它上面批量操作DOM,完成后再添加到文档中,只触
发一次回流
documentFragment不是真实DOM的一部分,它的变化不会触发DOM树的重新渲染,不会导致性能问题
效果不甚明显,因为现代浏览器会使用队列存储储存多次修改进行优化
盒子模型
1、盒模型宽度的计算
(1)普通盒模型
默认盒子属性:box-sizing: content-box;
width只包含内容宽度,不包含border和padding

box-sizing: content-box;//定义引擎如何计算元素的总高度和总宽度
content-box 默认值,元素的 width/height 不包含padding,border,与标准盒子模型表现一致 border-box 元素的 width/height 包含 padding,border,与怪异盒子模型表现一致
inherit 指定 box-sizing 属性的值,应该从父元素继承
(2)怪异盒模型
设置语句:box-sizing: border-box;
offsetWidth = width(padding 和 border 都压到内容里面)
width 和 height 包括内容区、padding 和 border,不算 margin


3、margin 负值问题
margin-top 和 margin-left 是负值,元素会向上或者向左移动
margin-right 负值,右侧元素左移,自身不受影响
margin-bottom 负值,下侧元素上移,自身不受影响
4、BFC
Block Format Context:块级格式化上下文
一块独立的渲染区域,内部元素的渲染不会影响边界以外的元素
形成 BFC 的条件:
float 不设置成 none position 是 absolute 或者 fixed
overflow 不是 visible display 是 flex 或者 inline-block 等
应用:清除浮动
5、float
(1)圣杯布局和双飞翼布局
作用:
实现 pc 端三栏布局,中间一栏最先渲染实现两边宽度固定,中间自适应
效果图:

(2)圣杯布局
HTML:
<div class="left float"></div> <div class="right float"></div>
</div>
CSS:
.container { padding: 0 200px;
background-color: #eee;
}
/* 清除浮动 */ .clearfix::after {
content: '';
display: table;
clear: both;
}
/* 关键 */ .float {
float: left;
}
.main { width: 100%;
height: 200px;
background-color: #ccc;
}
.left { width: 200px;
height: 200px;
/* ---关键--- */ position: relative;
right: 200px;
margin-left: -100%;
/* ---关键--- */ background-color: orange;
}
.right { width: 200px;
height: 200px;
/* ---关键--- */ margin-right: -200px;
(3)双飞翼布局
HTML:
<div class="float wrapper"> <div class="main"></div>
</div> <div class="left float"></div>
<div class="right float"></div>
CSS:
/* 关键 */ .float {
float: left;
}
.wrapper { width: 100%;
height: 200px;
background-color: #ccc;
}
/* 关键 */ .wrapper .main {
height: 200px;
margin-left: 200px;
margin-right: 200px;
}
.left { width: 200px;
height: 200px;
/* 关键 */ margin-left: -100%;
background-color: orange;
}
.right { width: 200px;
height: 200px;
/* 关键 */ margin-left: -200px;
background-color: skyblue;
| 属性 | 圣杯布局 | 双飞翼布局 |
|---|---|---|
| HTML | 包裹三栏 | 只包裹中间一栏 |
| 是否定位 | 相对定位 | 无需定位 |
| 左右栏的空间 | 使用padding预留 | 使用margin预留 |
| 左栏处理 | positon + margin-left | margin-left |
| 右栏处理 | margin-right | margin-left |
(5)手写clearfix
CSS:
/* 1、父级标签定义伪类 */ .clearfix::after {
content: '';
display: table;
clear: both;
} /* 兼容IE低版本 */
.clearfix { *zoom: 1;
}
/* 2、父级标签 overflow */ .clearfix {
overflow: hidden;
}
/* 3、添加空 div 标签 */ .clearfix {
clear: both;
}
6、元素居中
(1)行内元素水平垂直居中
设置父级标签。
水平居中: text-align: center
垂直居中: line-height:盒子高度
(2)块级元素水平垂直居中
水平垂直都居中
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%)
不会触发重排,因此最常用
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
容器设置:
display:flex;
justify-content: center;
align-items: center;
容器:
display: table-cell;
text-align: center;
vertical-align: middle;
子元素:
display: inline-block;
7、样式单位
em:相对于自身字体大小的单位 rem:相对于 html 标签字体大小的单位
vh:相对于视口高度大小的单位,20vh == 视口高度/10020 vw:相对于视口宽度大小的单位, 20vw == 视口宽度/10020
全站分卷索引 · 154 卷
- 1代码随想录知识星球精华(最强八股文)第五版(前端篇))
- 2html语义化
- 3src 和 href 的区别
- 4link 与 @import 的区别
- 5iframe
- 6CSS
- 7伪元素和伪类
- 8block,inline,inline-block
- 9重排、重绘和合成
- 10盒子模型
- 11margin 合并
- 12margin和padding 的值为百分比时
- 13浮动
- 14定位
- 15CSS选择器
- 16CSS选择器优先级
- 17选择器权重Specificity
- 18CSS属性继承
- 19不可/可继承属性
- 20display: none与 visibility: hidden的区别
- 21background-size
- 22client、offset&scroll
- 23CSS3新特性
- 24flex布局
- 25常见布局
- 26三栏布局
- 27垂直居中
- 28水平垂直居中
- 29CSS画三角形
- 30使chrome支持12px以下文字
- 31响应式布局
- 32媒体查询
- 33过渡与动画
- 34JavaScript 动画 和 CSS动画
- 35SCSS
- 36CSS性能优化
- 37有哪些数据类型
- 38判断数据类型
- 39类型转换
- 40parseInt&parseFloat
- 41浮点数求和步骤
- 42十进制小数转二进制
- 430.1+0.2 为什么不等于 0.3
- 44undefined 和 undeclared 的区别
- 45JavaScript NaN 属性
- 46isFinite()&isNaN()
- 47数组
- 48对原数组有影响
- 49对原数组无影响
- 50数组去重
- 51数组拍平
- 52ES6新增的数组方法
- 53判断是否存在某个值
- 54arguments为啥不是数组
- 55对象
- 56遍历对象的方法
- 57判断对象是否具有属性
- 58for in 和 for of 的区别
- 59继承方式
- 60instanceof
- 61深浅拷贝
- 62freeze属性
- 63函数
- 64函数柯里化
- 65函数的 length
- 66箭头函数和普通函数区别
- 67构造函数
- 68执行上下文
- 69作用域
- 70作用域和作用域链
- 71闭包和内存泄漏
- 72this
- 73关于 this 的指向问题
- 74改变this指向的方法(bind / call / apply)
- 75字符串
- 76DOM和事件
- 77哪些事件支持冒泡
- 78阻止冒泡
- 79HTMLCollection、NodeList
- 80dom.onclick 和 dom.addEventListener的区别
- 81e.target和e.currentTarget
- 82页面生命周期
- 83异步
- 84内存管理GC
- 85其它
- 86JavaScript 中日期时间格式转换
- 87input和object实现双向绑定
- 88JSON.stringify()
- 89escape、encodeURI&encodeURIComponent
- 90移动端滚动穿透和溢出
- 91ES6
- 92Map字典
- 93... 与rest
- 94proxy
- 95模块化
- 96Ajax、Fetch和Axios
- 97Webpack
- 98浏览器:事件循环
- 99浏览器内核
- 100浏览器同源策略
- 101输入URL回车后发生了什么
- 102HTTP
- 103HTTP 2.0
- 104浏览器存储
- 105鉴权
- 106Webstorage
- 107浏览器执行机制
- 108AST 抽象语法树
- 109性能优化
- 110CSS
- 111网络相关
- 112使用HTTP2.0
- 113图片
- 114CDN图片
- 115其他文件优化
- 116降低APP首页开屏渲染时间
- 117页面白屏
- 118HTTPS中间人攻击
- 119Web Worker
- 120Service Worker
- 121微前端
- 122Vue
- 123v-show 和 v-if 的区别
- 124双向数据绑定的原理
- 125Vue中的插槽使用
- 126Vue中的key
- 127Vue过滤器
- 128Vue中Scoped原理
- 129Vue中$nextTick的使用
- 130Vue中实现组件通信的方式
- 131Vue-router
- 132Vue路由传参
- 133前端路由
- 134Vuex
- 135虚拟DOM
- 136DIFF 算法
- 137Vue3和Vue2有哪些区别
- 138说一说你对React的理解
- 139React事件机制
- 140说一说你对react refs的理解
- 141react中key的作用
- 142组件开发
- 143有状态组件和无状态组件
- 144函数式组件和类组件的区别
- 145PureComponent&Component
- 146常见 Hooks
- 147状态管理
- 148redux toolkit
- 149React18新特性
- 150client中的createRoot取代以前的ReactDOM.render
- 151Suspense
- 152新的Hooks
- 153VDom一定更快吗
- 154Fiber