图片抖动问题的原因及解决办法

3,968 阅读2分钟

在项目开发中遇到的问题。
从下面图中,可以发现存在明显的抖动现象。

bug

原因分析

为什么会出现这样的问题呢? 因为图片是在DOM结构渲染完成以后调用的,这时候网页中一些资源还没有加载,比如图片等资源,但是DOM结构已经渲染成功了 。DOM结构在渲染时,进行了以下的工作:

渲染引擎组成

layout布局时,有了Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系,从而去计算出每个节点在屏幕中的位置。换句话说,在layout时,已经知道了各个节点的尺寸和坐标。 对于img标签,根据以下例子,我们可以知道img标签宽高是按原图尺寸大小自适应的,设置了宽就能得到高,设置了高就能得到宽。在同时设置宽高的条件下,会按照设置的宽高进行显示。

DOM结构渲染完成时,img图片尚未加载,此时我们并不知道图片的宽高比,高度会默认为0。当图片加载完成后,已经知道图片的信息了,会重新计算,并进行重绘,所以会出现抖动现象。

如何解决

paddingmargin的值为百分比时,无论padding-top||padding-bottom||padding-left||padding-right是根据父元素的宽度进行设置的。根据这个性质,可以利用padding-toppadding-bottom作为占位符。

做法很简单,就是img外面加一个wrapper,并进行如下设置,widthpadding-bottom设置图片的宽高比。(项目中图片的宽高比是100%:38%)

        .wrapper
        width:100%
        height:0
        padding-bottom:38%

实现效果如图所示: