← 返回目录

盒子模型

第 10 / 154 卷日期:

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

图 12-1
图 12-1

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

图 12-2
图 12-2
图 13-1
图 13-1

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 端三栏布局,中间一栏最先渲染实现两边宽度固定,中间自适应

效果图:

图 13-2
图 13-2

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