首页 > 其他分享 >运用webkit绘制渲染页面原理解决iscroll4闪动的问题

运用webkit绘制渲染页面原理解决iscroll4闪动的问题

时间:2023-06-04 17:06:36浏览次数:56  
标签:滚动 闪动 iscroll4 webkit article iScroll4 页面


Posted by unbug on Sep 19, 2012 in CSS3, Mobile Web App, OPOA | 1 comment



已经有不少前端同行抱怨iScroll4的各种问题,我个人并不赞同将这些问题归咎于iScroll4,因为iScroll4进无论是touch事件的捕获,还是使用transform来处理滚动,以及将cubic-bezier应用到transition上实现高效的平滑滚动,这些原理我们都是已知的。更多原理细节可以参看[译]手把手教你编写iOS上Mobile Web App实现Fixed Position和模拟滚动 一文。此文则来解释另一个被很多人误解为iScroll4 造成的问题,那就是内容多的页面闪动的问题。现象表现为:

1.滑动过程中,滚动区内的元素在释放手指时出现细微闪动

2.图片缩放过程中释放手指时明显闪动

3.iOS上从mobile safari打开或第三方应用内打开后,切回主屏幕再切回页面时明显闪动

4.页面初始时闪动

大致这些情况下会有闪动,在ipad2,new ipad上会明显看得出。

下面就来分析产生的原因和解决办法:

 

首先,我们知道iOS5给我们带来了


overflow-y: scroll ;
overflow-x: hidden ;
-webkit-overflow-scrolling: touch;



实现固定区域内的滚动,当应用这种方式实现滚动时,上面的提到的现象也会不同程度的出现尤其是1,2.是那么我们就可以断定不是iScroll4 的原因了。那么究竟是什么原因呢?

webkit在绘制页面时会将结构分为各种层,当层足够大时就会变成很大的平铺层。这各一来webkit在每次页面结构发生变化时不需要都渲染整个页面而是渲染对应层了,这对渲染速度来说相当的重要。webkit会给各种层分配一定大小的“备份存储区”在内存里缓存起来,这就是绘制层的上下文,通过这个上下文就可以很容易的实现各种效果(动画,3D变换等),“备份存储区”内存占用大小不仅依层而定,跟设备和显示方式也是有关的,假设这在普通屏幕下是1:1的,但在Retina屏幕下则是1:2的,并且放大时这个量会成倍增加;一张图片是10X10,普通屏幕分配的就是10X10,Retina初始则是20X20。这也表明Retina是更加消耗内存的。当层很大时,意味着“备份存储区”会消耗更大的内存,为了避免这点,webkit并不会绘制一个很大的层来存储一个很大的页面,比如说平铺层则会拆分成很多的块来绘制,即尽占用尽可能小的内存,只是将可视范围内的那部分渲染出来。这就是为什么我们在大页面滚动时会发现下面的内容慢慢显示,向上滚动时上面的内容还慢慢显示的原因。

以下则是webkit划分为层绘制的场景:

  1. 页面主容器永远是独立的平铺层
  2. 绘制密集型元素时,如<video>, <canvas>
  3. 应用3D transformations的元素,包括translate3d, rotate3d, translateZ
  4. 内容被加强时,如Filters, masks, reflections, opacity, transitions, animations
  5. 某些特殊的情况下也会,如position:fixed, -webkit-overflow-scroll:touch
  6. 任何在已知层上覆盖的内容

这对我们解决闪动问题有什么帮助呢?按上页的说明,和iScroll4实现原理我们很容易知道,iScroll4作用的滚动区是一个很大的独立层,webkit是不会将这么大的层整个分配内存绘制渲染的,所以,只要将滚动区域可视范围的列表项元素缓存起来就解决这个问题了。记webkit强制缓存起来即是将他们独立成一个层,而且这个层当然不会很大否则会被视为平铺层处理了。一般列表里项里的元素不会像页面主容器一样的大的。实现方式就是将列表项置身于上面的6个场景中,比如:


#wrap>section>article{-webkit-transform:translateZ(0);}/*注意这里*/
< div id = "wrap" >
     < section >
         < article >1</ article >
         < article >2</ article >
         < article >3</ article >
     </ section >
</ div >

标签:滚动,闪动,iscroll4,webkit,article,iScroll4,页面
From: https://blog.51cto.com/u_16112859/6411062

相关文章

  • Padavan网络信息页面分析
    ssh到路由,找到Main_WStatus_Content.asp,发现这一段是动态生成的:<%nvram_dump("wlan11b.log","");%>关键是nvram_dump,在githubhttps://github.com/hiboyhiboy/rt-n56u/上全文搜索源码,发现来源是rt-n56u/trunk/user/httpd/web_ex.cstructej_handlerej_handlers[]={......
  • elementUI中<el-select>下拉框选项过多的页面优化方案——多列选择
    效果展示(多列可以配置)  一、icon下拉框的多列选择:  二、常规、通用下拉框的多列选择:【注】第二种常规、通用下拉框的多列选择,是在第一种的前端代码上删除几行代码就行(把icon显示标签删去),所以下面着重介绍第一种icon下拉框的多列选择。思路  不使用下拉框标签<el-option>......
  • MAC/Razor页面应用如何使用微信认证
    @@openiddict微信二维码登入 ags:篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MAC/Razor页面应用如何使用微信认证相关的知识,希望对你有一定的参考价值。本文章演示了如何将微信集成到ABP应用程序中,使用户能够使用OAuth2.0凭据登录。创建一个沙箱账......
  • frame framset 的页面显示不了 空白
    frameframset的页面显示不了空白 例如php文件输出这样,<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><he......
  • APP-自动化定位WEB页面元素
    APP定位浏览器这种上下文嵌套的页面时,发现有的元素是无法定位 点击上面的地球图标, 点击NATIVE_APP(原生APP下面的选项),切换到web_view选项。就是使用HTML页面。 但是这个时候会报错,记住报错信息中的版本信息,这里是86.0.4240上图的报错是指缺乏对应版本的驱动;驱动的下载......
  • vue-router 4.1.4版本以上,打开新页面并隐式传参
    情景框架:Vue3+Vite4+VueRouter4.1.6需求:现需要实现点击打开新页面,并把一些数据传过去限制:数据量较大,有一定私密性,不适合用query传递;需要从session中获取token判断访问权限,因此需要用router.resolve携带session打开新页面使用params传参在4.1.4以上版本被抛弃了-->vu......
  • 前端页面之间url传参
    functiongetUrlParam(name){varreg=newRegExp("(^|&)"+name+"=([^&]*)(&|$)");varr=window.location.search.substr(1).match(reg);//ECMAScriptv3已从标准中删除了unescape()函数,并反对使用它,因此应该用decodeURI......
  • uniapp 组件中使用页面的生命周期(vue2)
    用于直接在组件中使用onLoad,onBackPress等因为之前在写App的时候有许多弹窗,希望可以在有弹窗的时候先关闭弹窗,没有弹窗在执行返回事件,因此需要在页面onBackPress里面写很多判断,因此找了一些方法,写了可以直接在组件中调用页面生命周期的方法!使用mixinthis.$children去循环查询......
  • 小程序刷新当前页面
    (6条消息)微信小程序页面刷新的方法_小程序如何刷新_fuf_xyxnxss的博客-CSDN博客......
  • 输入URL到页面渲染过程
    1.输入URL;2.浏览器查找当前URL是都存在缓存并且比较是否过期;3.DNS解析对呀的IP地址;首先会在本地的hosts文件中查看,若没有则需要通过DNS(域名分布系统)服务器查找;4.根据IP地址建立TCP链接(进行三次握手);5.发起http请求;6.服务器处理请求,浏览器接收http响应(HTML文件);7.关闭TCP连接......