Open Adamwu1992 opened 6 years ago
元素的宽高(width
/height
)+ 内边距(padding
)+ 边框(border
)+ 滚动条宽度。
offsetParent
的坐标位置offsetParent
是body
如果是相对于body
的定位,offsetTop
指的是:目标元素的border
的外框到html
元素padding
的外框;
如果存在特定的offsetParent
,offsetTop
指的是:目标元素border
的外框到parent元素padding
的外框。
元素的宽高(width
/height
)+ 内边距(padding
)。
目标元素padding
的外框到margin
的外框,可以理解为border
的宽度,如果有滚动条也包含其宽度。
元素的宽高(width
/height
)+ 内边距(padding
)+ 内容溢出宽高。如果内容没有溢出,scrollWidth和clientWidth相等。
元素滚动条的位置,可读写。
现代浏览器大多可以用GPU来加速页面渲染,在GPU的众多特性中,它可以储存一定数量的纹理(一个矩形的像素点集合)并且高效地操作这些纹理(比如进行特定的移动、缩放和旋转操作)。这些特性在实现一个流畅的动画时特别有用。浏览器不会在动画的每一帧都绘制一次,而是生成DOM元素的快照,并作为GPU纹理(也被叫做层)存储起来。之后浏览器只需要告诉GPU去转换指定的纹理来实现DOM元素的动画效果。这就叫做GPU合成,也经常被称作『硬件加速』。
由于使用GPU加速的动画效果不会频繁的触发repaint,所以会大大减少CPU的压力,不会在动画过程中掉帧,移动端native应用很好里的利用里GPU的渲染能力,所以流畅程度往往超出web应用很多。 但是,如果要利用GPU渲染,就会在内存中储存需要渲染的图层(纹理),如果一个页面上有太多元素使用里GPU加速会过多的占用内存。 所以需要找到一个平衡点,在必要的动画中触发GPU加速,并且避免意料之外的图层的形成。
<video>
和 <canvas>
标签z-index
属性transform和transform3d的区别就是,当元素具有3d变化属性时,会自动创建一个图层,之后这个元素的所有动画效果都在这个图层内渲染,不会触发repaint;而transform作为一个连续的动画属性时,会在开始和结束的时候触发repaint,此时应该时创建图层的过程,中间的动画都是在图层中渲染。
.ball-running {
animation: run-around-smooth 4s infinite;
}
@keyframes run-around-smooth {
0% {
transform: translate(0, 0);
}
25% {
transform: translate(400px, 0);
}
50% {
transform: translate(400px, 400px);
}
100% {
transform: translate(0, 400px);
}
}
上面的动画在Chrome中运行时,如果打开开发者工具中的Rendering - Paint Flashing,会发现只有在开始动画的瞬间会在元素上出现绿色框框(表示该区域内重绘了)
table
最关键的部分是设置table的text-align为center实现单元格内容水平居中,因为垂直居中是td的天然属性。
table-cell
上一种方法缺点在于需要包裹许多不必要的元素,利用table-cell属性也可以模拟td的垂直居中,而且不需要额外添加元素。
这种方法的缺点是,table-cell这个属性只有IE8及以上的浏览器才支持,遇到IE8以下的没有办法只能用回第一种table方法。
flex布局
这是我最喜欢用的方式,非常简洁,当然也需要考虑的felx布局的兼容问题。
absolute布局
这种方法需要用到transform属性,IE10以下的全都不支持,所以同样有兼容性的问题。
vertical-align
水平居中总是用text-align为center来实现,这个在绝大部分浏览器都是直接支持的。垂直居中需要用到vertical-align为middle来实现,对于vertical-align需要了解以下几点:
.wapper { width: 200px; height: 200px; background: #92b922; margin: 10px; } .inner { padding: 20px; background: #de3168; } .wapper4 { text-align: center; font-size: 0; } .wapper4::after, .wapper4 span { display:inline-block; width:0; height:100%; vertical-align:middle; content:''; } .inner4 { display:inline-block; vertical-align:middle; }