渲染优化 之fixed与返回顶部

fixed元素,常见网站右侧出现一个返回顶部的按钮,滚动的时候,会发现返回顶部这个区域在不停的进行重绘,而返回顶部是position:fixed定位的。这也解释了为什么fixed定位是最耗性能的属性之一

如何查看元素在不停的重绘呢?Chrome渲染分析工具 Rendering;

如上图,按F12调出开发者工具,然后按“ESC”(按2次)  调出Rendering界面。

1、Show paint rectangles 显示绘制矩形

2、Show composited layer borders 显示层的组合边界(注:蓝色的栅格表示的是分块)

3、Show FPS meter 显示FPS帧频

4、Enable continuous page repainting 开启持续绘制模式 并 检测页面绘制时间

5、Show potential scroll bottlenecks 显示潜在的滚动瓶颈。

观察上图本案例;箭头所指示的;(绿色块)元素表示在不停的发生重绘;

那么如何解决呢?

通过css3的-webkit-transform:translateZ(0) 的属性启动 硬件GPU加速

-webkit-transform:translateZ(0)

再次观察;myFixed 元素没有发现没有绿色块重绘

影响页面重绘的因素

主要有2大类:

1、页面滚动

2、互动操作
1).Dom节点被Javascript改变,导致Chrome重新计算页面的layout。

2).动画不定期更新。

3).用户交互,如hover导致页面某些元素页面样式的变化。

4).调整窗口大小 和 改变字体

5).内容变化,比如用户在input框中输入文字

6).激活 CSS 伪类,比如 :hover

7).计算 offsetWidth 和 offsetHeight 属性

8).增加或者移除样式表

另外一个情况;fixed元素在滚动条滚动时候,ie7版本 有抖动情况;除了background-attachment: fixed\9; (我的ie8浏览器切换ie7渲染发现还是有抖动现象); 我一般是这样处理的

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8"  />

当我点  击回到顶部  时候,页面 scrollTop:0;jQuery为了兼容一般是这样写:

$(‘#myFixed‘).on("click",function(){
          $(‘html, body‘).animate({scrollTop:0},"slow",function(){
		   console.log(‘我回到了顶部‘);
		  });

	 }); 

实际上,仔细观察控制台,你会发现;实际上渲染了2次;

主要原因 webkit 内核的浏览器使用body 进行滑动,而其他浏览器则使用html进行滑动

如何优化:

var userAgent=window.navigator.userAgent.toLowerCase();
       isWebkit = userAgent.indexOf(‘webkit‘) !== -1,
	$(‘#myFixed‘).on("click",function(){//webkit 内核的浏览器使用body 进行滑动,而其他浏览器则使用html进行滑动
		 $(!!isWebkit?"body":"html").animate({scrollTop:0},"slow",function(){
		   console.log(‘我回到了顶部‘);
		  });

	 }); 
 

	

再次,观察控制台,这回只选染一次;

附上代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8"  />
<meta http-equiv="X-UA-Compatible" content="edge,chrome=1"  />
<title>渲染优化之 fixed 与 返回顶部</title>
</head>

<body>
<style>
*{ margin:0; padding:0;}
body{
_background-image: url(about:blank);     /*用浏览器空白页面作为背景*/
background-attachment: fixed\9;/* 确保滚动条滚动时,元素不闪动*/
text-overflow:ellipsis;}

p{ color:#fff;}
#text{height:2500px; margin:0 auto; width:1000px; border:2px solid #999; background:#333 url(../images/TaylorSwift.jpg) no-repeat; }
#myFixed{-webkit-transform:translateZ(0); position:fixed; left:50%;top:70%; *position:absolute;*top:expression(eval(documentElement.scrollTop +550));  margin-left:550px; width:50px;  height:50px; border:2px solid red;background-attachment: fixed\9;/*IE=EmulateIE8" 才有效果*/}
#myFixed:hover{ cursor:pointer; border-color:#FF0;  }
</style>

<div id="text">我是滚动的区块</div>
<div id="myFixed"  style="">回到顶部</div>
<script src="../js/jquery-1.8.2.min.js"></script>
<script>

   var userAgent=window.navigator.userAgent.toLowerCase();
       isWebkit = userAgent.indexOf(‘webkit‘) !== -1,
       texts=document.getElementById("text"),
       str=‘‘, i=0;

      for(;i<120;i++){
        str+=‘<p>我是第‘+i+‘行</p>‘
        }
      texts.innerHTML=str;

    $(‘#myFixed‘).on("click",function(){//webkit 内核的浏览器使用body 进行滑动,而其他浏览器则使用html进行滑动
         $(!!isWebkit?"body":"html").animate({scrollTop:0},"slow",function(){
           console.log(‘优化后我回到了顶部‘);
          });

     });
</script>

</body>
</html>

时间: 2024-10-13 16:19:36

渲染优化 之fixed与返回顶部的相关文章

javascript返回顶部几种代码总结

纯js代码 /** * 回到页面顶部 * @param acceleration 加速度 * @param time 时间间隔 (毫秒) **/ function goTop(acceleration, time) { acceleration = acceleration || 0.1; time = time || 16; var x1 = 0; var y1 = 0; var x2 = 0; var y2 = 0; var x3 = 0; var y3 = 0; if (document.

返回顶部/底部3

<!DOCTYPE html> <html lang="en"> <head> <title>返回顶部/底部</title> <meta charset="UTF-8"> <script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"

返回顶部和底部(动画)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

我要返回顶部

我觉得一个网站最不可少的小功能就是返回顶部了吧,尤其是那些长的要命,拉都拉不到尽头的,简直丧心病狂,如果没有返回顶部的按钮的话,鬼愿意原路拉回去,直接关掉走人.所以一个返回顶部的按钮还是需要的,当然,返回顶部也可以做出很多花样,本文只讨论如何返回,不管具体的外观样式,那都是后话. 以下是一些方法: 1. <a href='#'>返回顶部</a> ok,搞定,是不是觉得很坑爹,但我刚开始接触的时候就是用这个方法的,简单暴力直接,就是硬生生的直接跳回去,不好看,没有美感,而且直接这样不

jquery返回顶部,支持手机

效果体验:http://hovertree.com/texiao/mobile/6/ 在pc上我们很容易就可以用scrollTop()来实现流程的向上滚动的返回到顶部的动画,然后用到web移动端却没什么卵用,会出现滚动不流畅,卡顿,失灵等等现象. 这是因为移动端的scroll事件触发不频繁,有可能检测不到有<=0的情况 为此,移动端判断次数好些,下面是具体实现代码,兼容pc: <!DOCTYPE html> <html> <head> <meta http-

20款网页常用的返回顶部代码

jQuery网页滚动显示浮动导航带返回顶部按钮 css3悬浮返回顶部按钮悬停显示二维码特效 jQuery网页返回顶部固定层微信二维码代码 jQuery绿色的qq在线客服点击返回顶部代码 div css网页右侧返回顶部样式代码 jQuery响应式网页返回顶部按钮代码 jQuery win8扁平风格返回顶部和在线客服网站侧边栏代码 jquery扁平风格带二维码的页面滑动返回顶部按钮代码 jQuery仿威锋商城网站右侧悬浮层返回顶部代码 jQuery带微信二维码网页侧边返回顶部效果 jquery wi

javascript 返回顶部

<style>#linGoTopBtn {    POSITION: fixed; TEXT-ALIGN: center; LINE-HEIGHT: 30px; WIDTH: 30px; BOTTOM: 35px; HEIGHT: 33px; FONT-SIZE: 12px; CURSOR: pointer; RIGHT: 0px;}</style><script>function linGoTop(){    var obj = document.getElement

JS-特效 ~ 02. 屏幕滚动事件、 DTD、scroll、顶部悬浮导航、两侧跟随广告、返回顶部小火煎

ceil 向上取整 floor 向下取整 round 四舍五入 缓动动画 动画原理 = 盒子位置 + 步长 清除定时器 步长越来越小 盒子位置 = 盒子本身位置 + (目标位置-本身位置)/n(最好为10) 最后10像素容易 容易出现问题 所以要向上取整 400-396 = 4  4/10 = 0.4   四舍五入 = 0 400-396 = 4  4/10 = 0.4   四舍五入 = 0 要用定时器 先清除定时器 7.  offsetLest取值为四舍五入 8.  差值大于0的时候向上取整

python:HTML + CSS 优先级 返回顶部

优先级 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .a1 { background-color: aqua; height: 58px; } .a2 { font-size: 30px; background-color: indianred;