博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浏览器重绘和回流
阅读量:6224 次
发布时间:2019-06-21

本文共 1460 字,大约阅读时间需要 4 分钟。

以前写代码不太注意浏览器回流和重绘问题,这次掉坑里了,必须解决这个问题.

在项目中,用angular的derective写了一个组件,组件的background-image随着选中变化,并且组件的大小也会变化 ,之前的代码使用了下面写法:

dragBoxElement.style.top = "" + (newVal*$scope.dragModel.top) + "px"; //造成浏览器回流

dragBoxElement.style.left = "" + (newVal*$scope.dragModel.left) + "px";
dragBoxElement.style.width = "" + (newVal*$scope.dragModel.width) + "px";
dragBoxElement.style.height = "" + (newVal*$scope.dragModel.height) + "px";

然后再给background: url( {

{dragModel.thumbnail}}中的dragModel.thumbnail赋值,修改背景图片,

这段代码会让浏览器先回流,再重绘,重绘的时候背景图片的大小就不会使用之前设置的大小,而是按照渲染准则(css中初始规定)的大小显示。

最终的解决办法就是让将这些引起回流和重绘的操作,构建为一个一个整体样式,让浏览器只 回流重绘一次,修改如下:

var top = "" + ($scope.scaleRatio*$scope.dragModel.top) + "px"; //按照比例显示素材宽高

var left = "" + ($scope.scaleRatio*$scope.dragModel.left) + "px";
var width = "" + ($scope.scaleRatio*$scope.dragModel.width) + "px";
var height = "" + ($scope.scaleRatio*$scope.dragModel.height) + "px";
var thumbnail= $scope.dragModel.materials[i].type==="IMAGE"?$scope.dragModel.materials[i].originalFilePath:$scope.dragModel.materials[i].filePath;
var cssText="top:"+top+";left:"+left+";width:"+width+";height:"+height+";background-image:"+"url("+thumbnail+");"+"background-size: 100% 100%;";
dragBoxElement.style.cssText=cssText;

dragBoxElement.style.cssText的使用可以减少回流重绘的次数;

关于重绘和回流请参考:http://www.css88.com/archives/4996

select中option选项的上下移动,添加、删除操作参考代码:

http://blog.csdn.net/jadyer/article/details/16804279

 

转载于:https://www.cnblogs.com/liangxin/p/6773778.html

你可能感兴趣的文章
.net 4.5如何使用Async和Await进行异步编程
查看>>
Android实现系统重新启动
查看>>
C++面向对象程序设计的一些知识点(3)
查看>>
DEDECMS网站管理系统Get Shell漏洞
查看>>
linux概念之分区与文件系统
查看>>
《practical Java》读书笔记
查看>>
ZOJ--3631--Watashi's BG【枚举】
查看>>
MySQL数据库学习笔记(五)----MySQL字符串函数、日期时间函数
查看>>
NPOI 导出excel带图片,可控大小
查看>>
算法数据结构(一)-B树
查看>>
阿里云官方教程 Linux 系统挂载数据盘
查看>>
(数组)众数问题
查看>>
如何写一个简单的手写识别算法?
查看>>
JavaScript学习笔记——函数
查看>>
atitit.基于 Commons CLI 的命令行原理与 开发
查看>>
Blog CSS
查看>>
git workflow 原文 以及缺点
查看>>
QT对话框中show和exec的区别
查看>>
Android和C#实时视频传输Demo
查看>>
java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)...
查看>>