我的编程空间,编程开发者的网络收藏夹
学习永远不晚

浏览器怎么实现移动端高性能css3动画

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

浏览器怎么实现移动端高性能css3动画

本篇内容主要讲解“浏览器怎么实现移动端高性能css3动画”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“浏览器怎么实现移动端高性能css3动画”吧!

高性能移动Web相较PC的场景需要考虑的因素也相对更多更复杂,我们总结为以下几点: 流量、功耗与流畅度。 在PC时代我们更多的是考虑体验上的流畅度,而在Mobile端本身丰富的场景下,需要额外关注对用户基站网络流量使用的情况,设备耗电量的情况。

关于流畅度,主要体现在前端动画中,在现有的前端动画体系中,通常有两种模式:JS动画与CSS3动画。 JS动画是通过JS动态改写样式实现动画能力的一种方案,在PC端兼容低端浏览器中不失为一种推荐方案。 而在移动端,我们选择性能更优浏览器原生实现方案:CSS3动画。
然而,CSS3动画在移动多终端设备场景下,相比PC会面对更多的性能问题,主要体现在动画的卡顿与闪烁。
目前对提升移动端CSS3动画体验的主要方法有几点:

尽可能多的利用硬件能力,如使用3D变形来开启GPU加速

代码如下:


-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);

如动画过程有闪烁(通常发生在动画开始的时候),可以尝试下面的Hack:

代码如下:


-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;

-webkit-perspective: 1000;
-moz-perspective: 1000;
-ms-perspective: 1000;
perspective: 1000;

如下面一个元素通过translate3d右移500px的动画流畅度会明显优于使用left属性:

代码如下:


#ball-1 {
 transition: -webkit-transform .5s ease;
 -webkit-transform: translate3d(0, 0, 0);
}
#ball-1.slidein {
 -webkit-transform: translate3d(500px, 0, 0);
}

#ball-2 {
 transition: left .5s ease;
 left:0;
}
#ball-2.slidein {
 left:500px;
}

注:3D变形会消耗更多的内存与功耗,应确实有性能问题时才去使用它,兼在权衡

尽可能少的使用box-shadows与gradients

box-shadows与gradients往往都是页面的性能杀手,尤其是在一个元素同时都使用了它们,所以拥抱扁平化设计吧。
尽可能的让动画元素不在文档流中,以减少重排

代码如下:


position: fixed;
position: absolute;

优化 DOM layout 性能

我们从实例开始描述这个主题:

代码如下:


var newWidth = aDiv.offsetWidth + 10;
aDiv.style.width = newWidth + 'px';
var newHeight = aDiv.offsetHeight + 10;
aDiv.style.height = newHeight + 'px';

var newWidth = aDiv.offsetWidth + 10;
var newHeight = aDiv.offsetHeight + 10;
aDiv.style.width = newWidth + 'px';
aDiv.style.height = newHeight + 'px';

这是两段能力上完全等同的代码,显式的差异正如我们所见,只有执行顺序的区别。但真是如此吗?下面是加了说明注释的代码版本,很好的阐述了其中的进一步差异:

代码如下:


// 触发两次 layout
var newWidth = aDiv.offsetWidth + 10;   // Read
aDiv.style.width = newWidth + 'px';     // Write
var newHeight = aDiv.offsetHeight + 10; // Read
aDiv.style.height = newHeight + 'px';   // Write

// 只触发一次 layout
var newWidth = aDiv.offsetWidth + 10;   // Read
var newHeight = aDiv.offsetHeight + 10; // Read
aDiv.style.width = newWidth + 'px';     // Write
aDiv.style.height = newHeight + 'px';   // Write

从注释中可找到规律,连续的读取offsetWidth/Height属性与连续的设置width/height属性,相比分别读取设置单个属性可少触发一次layout。
从结论看似乎与执行队列有关,没错,这是浏览器的优化策略。所有可触发layout的操作都会被暂时放入 layout-queue 中,等到必须更新的时候,再计算整个队列中所有操作影响的结果,如此就可只进行一次的layout,从而提升性能。
关键一,可触发layout的操作,哪些操作下会layout的更新(也称为reflow或者relayout)?
我们从浏览器的源码实现入手,以开源Webkit/Blink为例, 对layout的更新,Webkit 主要通过 Document::updateLayout 与Document::updateLayoutIgnorePendingStylesheets 两个方法:

代码如下:


void Document::updateLayout()
{
   ASSERT(isMainThread());

   FrameView* frameView = view();
   if (frameView && frameView->isInLayout()) {
       ASSERT_NOT_REACHED();
       return;
   }

   if (Element* oe = ownerElement())
       oe->document()->updateLayout();

   updateStyleIfNeeded();

   StackStats::LayoutCheckPoint layoutCheckPoint;

   if (frameView && renderer() && (frameView->layoutPending() || renderer()->needsLayout()))
       frameView->layout();

   if (m_focusedNode && !m_didPostCheckFocusedNodeTask) {
       postTask(CheckFocusedNodeTask::create());
       m_didPostCheckFocusedNodeTask = true;
   }
}

void Document::updateLayoutIgnorePendingStylesheets()
{
   bool oldIgnore = m_ignorePendingStylesheets;

   if (!haveStylesheetsLoaded()) {
       m_ignorePendingStylesheets = true;

       HTMLElement* bodyElement = body();
       if (bodyElement && !bodyElement->renderer() && m_pendingSheetLayout == NoLayoutWithPendingSheets) {
           m_pendingSheetLayout = DidLayoutWithPendingSheets;
           styleResolverChanged(RecalcStyleImmediately);
       } else if (m_hasNodesWithPlaceholderStyle)
           recalcStyle(Force);
   }

   updateLayout();

   m_ignorePendingStylesheets = oldIgnore;
}

从 updateLayoutIgnorePendingStylesheets 方法的内部实现可知,其也是对 updateLayout 方法的扩展,并且在现有的 layout 更新模式中,大部分场景都是调用 updateLayoutIgnorePendingStylesheets 来进行layout的更新。
搜索 Webkit 实现中调用 updateLayoutIgnorePendingStylesheets 方法的代码, 得到以下可导致触发 layout 的操作:

Element: clientHeight, clientLeft, clientTop, clientWidth, focus(), getBoundingClientRect(), getClientRects(), innerText, offsetHeight, offsetLeft, offsetParent, offsetTop, offsetWidth, outerText, scrollByLines(), scrollByPages(), scrollHeight, scrollIntoView(), scrollIntoViewIfNeeded(), scrollLeft, scrollTop, scrollWidth

Frame, HTMLImageElement: height, width

Range: getBoundingClientRect(), getClientRects()

SVGLocatable: computeCTM(), getBBox()

SVGTextContent: getCharNumAtPosition(), getComputedTextLength(), getEndPositionOfChar(), getExtentOfChar(), getNumberOfChars(), getRotationOfChar(), getStartPositionOfChar(), getSubStringLength(), selectSubString()

SVGUse: instanceRoot

window: getComputedStyle(), scrollBy(), scrollTo(), scrollX, scrollY, webkitConvertPointFromNodeToPage(), webkitConvertPointFromPageToNode()

到此,相信大家对“浏览器怎么实现移动端高性能css3动画”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

浏览器怎么实现移动端高性能css3动画

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么判断当前浏览器是否是微信浏览器或者移动端

怎么判断当前浏览器是否是微信浏览器或者移动端,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1,用JS代码判断浏览器是否为微信浏览器function is_weixn(){
2023-06-20

使用Html5怎么在移动端实现一个无缝滚动动画

使用Html5怎么在移动端实现一个无缝滚动动画?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。html骨架其实很简单,最外面的
是做固定的窗口,里面的
    控制运动,<
2023-06-09

怎么在HTML5中实现一个移动端弹幕动画效果

怎么在HTML5中实现一个移动端弹幕动画效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。思路1.把单个内容编辑好,计算自身宽度,确定初始位置 2.移动的距离是屏幕宽度3.js
2023-06-09

使用Html5怎么实现一个移动端弹幕动画效果

这期内容当中小编将会给大家带来有关使用Html5怎么实现一个移动端弹幕动画效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。思路把单个内容编辑好,计算自身宽度,确定初始位置移动的距离是屏幕宽度js动态的添
2023-06-09

怎么在HTML5中实现移动端复制功能

本篇文章为大家展示了怎么在HTML5中实现移动端复制功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用clipboard.js实现移动端粘贴复制 clipboard.js是一款很强大的粘贴复制的
2023-06-09

python selenium webdriver怎么实现多线程启动多个浏览器

这篇文章主要讲解了“python selenium webdriver怎么实现多线程启动多个浏览器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python selenium webdriv
2023-06-05

怎么用PHP+Ajax实现手机移动端发红包功能

本篇内容介绍了“怎么用PHP+Ajax实现手机移动端发红包功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本流程:当输入完红包数量和总金
2023-06-04

HTML5如何实现手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能

小编给大家分享一下HTML5如何实现手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!H5手指下滑弹出负一屏, 阻止
2023-06-09

JavaScript怎么实现完全容错和浏览器自动最大化

这篇文章主要讲解了“JavaScript怎么实现完全容错和浏览器自动最大化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript怎么实现完全容错和浏览器自动最大化”吧!错误代码的
2023-06-03

怎么使用Vue实现移动端图片裁剪组件功能

本篇内容主要讲解“怎么使用Vue实现移动端图片裁剪组件功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Vue实现移动端图片裁剪组件功能”吧!  一、组件的初始化参数  1、图片img(
2023-07-04

怎么使用SAP SAT事务码对通过浏览器启动的应用的性能测量和分析方式

怎么使用SAP SAT事务码对通过浏览器启动的应用的性能测量和分析方式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。三个产品都有登录语言的选择:CRMC4C:Hybris:
2023-06-04

编程热搜

目录