position: absolute;_前端性能优化--transform与position

上个星期去yy语音面试,就有一个这样问题: transform与position:absolute 有什么区别? 我回家后查资料发现这道题目其实不简单啊,涉及到重排、重绘、硬件加速等网页优化的知识。

首先看一个用top、left实现的动画效果

<style>html,body {width: 100%;height: 100%;}.ball-running {animation: run-around 4s infinite;width: 100px;height: 100px;background-color: red;position: absolute;}@keyframes run-around {0%: {top: 0;left: 0;}25% {top: 0;left: 200px;}50% {top: 200px;left: 200px;}75% {top: 200px;left: 0;}}</style>
<body><div class="ball-running"></div></body>

在运行的时候,会隐约觉得动画的运行并不流畅,动画有些停顿的感觉。这时因为top和left的改变会触发浏览器的 reflow和 repaint 。然后整个动画过程都在不断触发浏览器的重新渲染,这个过程是很影响性能的。

下面是chrome 浏览器performance中的监测到的数据。在 chrome的rendering面板中可以看到没改变一次位置浏览器就要渲染一个。

c9374044b8bdefe0643b7891013bc243.gif

98cfdfa0cf4647b256d2964290227244.png

然后我用transform 重写一下这个动画效果

<style>html,body {width: 100%;height: 100%;}.ball-running {animation: run-around2 4s infinite;width: 100px;height: 100px;background-color: red;position: absolute;}@keyframes run-around2 {0%: {transform: translate(0, 0);}25% {transform: translate(200px, 0);}50% {transform: translate(200px, 200px);}75% {transform: translate(0, 200px);}}
</style><body><div class="ball-running"></div></body>

这时候会发现整个动画效果流畅了很多,在动画移动的过程中也没有发生repaint和reflow。

下面是chrome 浏览器performance中的监测到的数据。以及rendering面板。

b2d1b6a5251589730716ab38354fb892.png

3f6eb300ab597ff5e7c8dd932d799b5f.gif

那么,为什么 transform 没有触发 repaint 呢?原因就是,transform 动画由GPU控制,支持硬件加速。

看完以上两个例子,那么我们就要入正题了。

主线程和合成线程

现代浏览器通常由两个重要的线程组成(主线程 和 合成线程)。这两个线程一起工作完成绘制页面的任务:

主线程需要做的任务如下:

  • 运行Javascript
  • 计算HTML元素的CSS样式
  • layout (relayout)
  • 将页面元素绘制成一张或多张位图
  • 将位图发送给合成线程

合成线程主要任务是:

  • 利用GPU将位图绘制到屏幕上
  • 让主线程将可见的或即将可见的位图发给自己
  • 计算哪部分页面是可见的
  • 计算哪部分页面是即将可见的(当你的滚动页面的时候)
  • 在你滚动时移动部分页面

在很长的一段时间内,主线程都在忙于运行Javascript和绘制元素。

例如,当用户滚动一个页面时,合成线程会让主线程提供最新的可见部分的页面位图。然而主线程不能及时的响应。这时合成线程不会等待,它会绘制已有的页面位图。对于没有的部分则绘制白屏。

GPU擅长的领域:

  1. 绘制东西到屏幕上
  2. 一次次绘制同一张位图到屏幕上
  3. 绘制同一张位图到不同的位置、旋转角度和缩放比例

我们来看一个例子:将一个页面元素的高度从100px渐变到200px,方法可以是:1、height 2、transform: scale(1.0)。两个方法性能是不一样的,现在我们来从主线程和合成线程的角度来看看

传统的方法:改变 height

div {height: 100px;transition: height 1s linear;
}div:hover {height: 200px;
}

下图是一张主线程和合成线程的互相交互的时间线图。

899439e227dd8b447c380137440f1118.png
黄色盒子的操作是潜在耗时较长的,蓝色盒子的操作是很快的。

在transition动画的每一帧中,都修改元素的高度,这可能会导致子元素的大小也会变化,然后浏览器不得不进行relayout。在relayout之后主线程还需要重新生成元素的位图,加载位图到GPU内存中

css3的方法:transform

直接改变元素的高度是很耗时的,但我们可以使用 transform: scale(); 来缩放元素,实现这个改变高度的目的。

div {transform: scale(0.5);transition: transform 1s linear;
}div:hover {transform: scale(1.0);
}

c8e5adbcab148585a90a510bac339df2.png
黄色盒子的操作是潜在耗时较长的,蓝色盒子的操作是很快的。

CSS transform属性并不会触发当前元素或附近元素的relayout。浏览器将当前元素视为一个整体,它会缩放、旋转、移动这一整个元素。

浏览器只需要在动画开始之时生成位图,然后将位图发送给GPU。之后浏览器不需要做额外的relayout和repaint,甚至不需要发送位图给GPU。浏览器只需要充分发挥GPU的长处:绘制同一张位图到不同的位置、旋转角度和缩放比例。

可以使用GPU加速的CSS3属性

  • CSS transform
  • CSS opacity
  • CSS filter

感想

既然transform这个属性那么强大,我们就可以用他来优化我们平时的一下操作。例如:拖拽,在mouseover阶段就用transform,在mousedown阶段在再用position绝对定位,这样是不是就可以减少repaint和reflow的操作呢。还有就是动画。等等。

参考资料

CSS动画之硬件加速
CSS animation和transition的性能探究

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

台式计算机总是重启,台式电脑经常自动重启怎么修复

当我们的电脑出现了电脑自动重启的时候&#xff0c;我们就要注意了&#xff0c;说明我们的电脑主机出现问题了&#xff0c;怎么解决呢。下面是学习啦小编为大家整理的关于台式电脑经常自动重启的相关资料&#xff0c;希望对您有所帮助!台式电脑经常自动重启的解决方法方法/步骤…

线程执行完之后会释放吗_java多线程并发:CAS+AQS+HashMap+volatile+ThreadLocal,乐分享...

CyclicBarrier、CountDownLatch、Semaphore 的用法CountDownLatch(线程计数器 )CountDownLatch 类位于 java.util.concurrent 包下&#xff0c;利用它可以实现类似计数器的功能。比如有一个任务 A&#xff0c;它要等待其他 4 个任务执行完毕之后才能执行&#xff0c;此时就可以…

计算机应用基础考查方案,《计算机应用基础》考查方案

《计算机应用基础》考查方案 《计算机应用基础》考核方案 制订人&#xff1a;刘久红老师 计算机应用基础科任教师 制订部门&#xff1a;基础课与思政课教学部 制订时间&#xff1a;2012年12月 一&#xff1a;考核依据 计算机应用基础是面向全院各专业开设的一门重要的公共基础课…

无法启动此程序因为计算机丢失msvcr110.dll,计算机中丢失msvcr110.dll怎么办

我们在打开电脑程序的时候&#xff0c;系统提示无法启动此程序&#xff0c;因为计算机中丢失MSVCR110.dll&#xff0c;尝试重新安装该程序以解决此问题。这是什么情况呢?因为现在所有的5.5环境都是基于vc11的编译脚本下生成的&#xff0c;所以在windows下你得安装相关组件&…

anaconda pandas运行不了_学习python你必须弄懂的 Python、Pycharm、Anaconda 三者之间的关系...

Python作为深度学习和人工智能学习的热门语言&#xff0c;学习一门语言&#xff0c;除了学会其简单的语法之外还需要对其进行运行和实现&#xff0c;才能实现和发挥其功能和作用。下面来介绍运行Python代码常用到的工具总结。一.Python、Pycharm、Anaconda关系介绍1. PythonPyt…

java: 程序包com.alibaba.fastjson不存在_Java开发中的异常

NO.1 Java.alng.NullPointerException这个异常大家肯定都经常遇到&#xff0c;异常的解释是 “程序遇上了空指针 “&#xff0c;简单地说就是调用了未经初始化的对象或者是不存在的对象&#xff0c;这个错误经常出现在创建图片&#xff0c;调用数组这些操作中&#xff0c;比如图…

关于csgo的观看录像fps低_CSGO:Ququ带队击败LQ豪取五连冠,8次MVP闪耀全场

电子竞技热点资讯&#xff0c;敬请关注老年人三旬&#xff01;自从CSGO这款游戏上市之后&#xff0c;在整个FPS领域内就一直处于顶流位置&#xff0c;这款游戏对于所有热爱射击游戏的玩家来说&#xff0c;不但是经典作品《半条命》的延续&#xff0c;更是一款对玩家要求极高的游…

python 3d大数据可视化_基于Python的数据可视化库pyecharts介绍

什么是pyecharts&#xff1f; pyecharts 是一个用于生成 Echarts 图表的类库。 echarts 是百度开源的一个数据可视化 JS 库&#xff0c;主要用于数据可视化。pyecharts 是一个用于生成 Echarts 图表的类库。实际上就是 Echarts 与 Python 的对接。 使用 pyecharts 可以生成独立…

dev多行注释_Python代码注释的用法和意义

01. 注释的作用在大多数编程语言中&#xff0c;注释都是一项很有用的功能。在一些简单的程序中只包含Python代码&#xff0c;但随着程序越来越大、越来越复杂&#xff0c;就应在其中添加说明&#xff0c;对你解决问题的方法进行大致的阐述。注释让你能够使用熟悉的自然语言在程…

python的数据库_python数据库操作-mysql数据库

一&#xff1a;连接 1&#xff1a;本地连接 mysql -u用户名 -p密码 2&#xff1a;连接远程服务器 mysql -u用户名 -p密码 -hip地址 -P端口号 线下修改远程服务端上部署的mysql服务器 二&#xff1a;创建数据库 create database 名字 utf8; 三&#xff1a;显示数据库 show datab…

svn如何取消某个文件的版本管理_微服务架构如何统一管理工程配置文件

面临的问题在分布式微服务架构系统中&#xff0c;业务和系统功能被拆分成了几十甚至上百个服务实例。每个服务实例就是以往单体应用时代的一个独立部署的工程。每个工程都需要自己独立的启动加载和运行时配置文件。在项目开发的过程中&#xff0c;我们不可避免的会涉及到配置文…

linux 线程_Linux 多线程编程(不限Linux)

前言线程&#xff1f;为什么有了进程还需要线程呢&#xff0c;他们有什么区别&#xff1f;使用线程有什么优势呢&#xff1f;还有多线程编程的一些细节问题&#xff0c;如线程之间怎样同步、互斥&#xff0c;这些东西将在本文中介绍。我在某QQ群里见到这样一道面试题&#xff1…

springboot导包显示不存在_基础篇:Spring Boot入门体验(图文教程)

优质文章&#xff0c;及时送达什么是 Spring Boot&#xff1f;Spring Boot 是由 Pivotal 团队提供的全新框架。Spring Boot 是所有基于 Spring Framework 5.0 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。设计…

plsql查看用户权限_权限功能

几乎所有的后台都会有权限这个功能&#xff0c;权限也是后台管理系统很重要的一项功能&#xff0c;可以提高系统的安全性&#xff0c;也可以很好的使每个操作人员清晰地找到自己所对应的功能。一般来说&#xff0c;系统中只有最高权限、或者这只权限的管理员可以分发设置其余权…

计算机教学论研究生,课程与教学论(计算机)专业硕士学位研究生培养方案

课程与教学论(计算机)专业硕士学位研究生培养方案一、学科专业简介计算机教学论以教育科学的基本理论为指导&#xff0c;探索计算机教育的的基本理论和实践问题&#xff0c;探讨现代教育理论视野中的计算机课程与教育改革。研究内容包括&#xff1a;计算机专业课程设置和教材建…

七度空间338多少钱一包_2020黄果树香烟一包多少钱 黄果树香烟价格表图排行榜...

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都会有分享&#xff0c;都是免费订阅&#xff0c;请您放心关注。注图文来源网络&#xff0c;侵删 …

eslint vscode 自动格式化_使用 VSCode 的必备三大神器,这才是开发 Vue 的真香解决方案...

现在用 VSCode 开发 Vue.js 应用几乎已经是前端的标配了&#xff0c;但很多时候我们看到的代码混乱不堪&#xff0c;作为一个前端工程师&#xff0c;单引号双引号乱用&#xff0c;一段有分号一段没有分号&#xff0c;有的地方有逗号有的地方没有逗号&#xff0c;空格回车都对不…

eclipse复制代码连接数据库404_推荐一款免费的数据库管理工具,比Navicat还要好用,功能还很强大...

作者&#xff1a;不剪发的Tony老师blog.csdn.net/horses/article/details/89683422DBeaver 是一个基于 Java 开发&#xff0c;免费开源的通用数据库管理和开发工具&#xff0c;使用非常友好的 ASL 协议。可以通过官方网站或者 Github 进行下载。由于 DBeaver 基于 Java 开发&am…

炒菜机器人放食材的顺序_珠江新城有了首家机器人餐厅,40多台机器人提供服务...

大洋网讯 在广州最繁华的CBD珠江新城&#xff0c;历史性有了一家机器人餐厅。这是广州日报全媒体记者昨日获悉的信息。记者赶往其中看见&#xff0c;这家新开的中餐厅看起来与众不同&#xff0c;厨房里没有铛铛的切菜声&#xff0c;没有此起彼伏的传菜声&#xff0c;更没有缭绕…

c++ string类_C++|细说STL string类概貌及底层细节

C语言中的字符串称为C风格字符串&#xff0c;是一个以0结尾的字符数组&#xff0c;string.h库只提供了有限、不甚安全的字符串操作函数。char str[]只能定义编译期确定大小的字符串&#xff0c;而保存在堆内存的动态字符数组却需要考虑释放内存的问题&#xff0c;且想要实现自变…