解决动态添加样式导致的元素闪烁

元素闪烁很丑,难解决。

修改 Class 而不是 Style

我在不久前做过一个导航栏,要求其滚动到屏幕顶端后固定。很常见。开始的时候没问题,很快就可以搞定。

nav {
    position: absolute;
    top: 60px;
}
var scroll=0;
var nav=$("nav");
var navST=60; //该元素距离网页顶端60px
 $(window).scroll(function(){
    if($(document).scrollTop()>navST && scroll==0){
        nav.css({position: "fixed",top: "0"});
        scroll=1;
    }
    else if($(document).scrollTop()<=navST && scroll==1){
        nav.removeAttr("style");
        scroll=0;
    }
});
运行很流畅。

做好,我自然就忙着网页内容去了。没曾想,随着页面 JS 的不断增加,导航栏在固定时出现了可怕的闪动。

唔,就是 一下看得见 一下看不见 的东西!

应该有不少人和我一样。百度,无果。谷歌,看不懂,翻译也不行。

不知道真相的我,眼泪 流下来。

哦!一道莫名的亮光从我的眼前闪过!这道亮光里,有希望,,有兴奋,,组成了四个大字:

元素重绘

就在这千万分之一秒,亿万分之一秒 里,我理解了:

nav.css({position: "fixed",top: "0"});
这一句 JS 产生了两次 DOM 写入,影响浏览器渲染页面两次。

使用 $.addClass 语句可以解决。

nav {
    position: absolute;
    top: 60px;
}
.fixed {
    position: fixed;
    top: 0;
}
var scroll=0;
var nav=$("nav");
var navST=60; //该元素距离网页顶端60px
 $(window).scroll(function(){
    if($(document).scrollTop()>navST && scroll==0){
        nav.addClass("fixed");
        scroll=1;
    }
    else if($(document).scrollTop()<=navST && scroll==1){
        nav.removeClass("fixed");
        scroll=0;
    }
});
闪烁问题得到了临时解决。

采用不可见元素减少 DOM 变更产生的运算

“临时” 说法的原因是当 JS 数量再次增加,达到又一新高度后,闪烁问题再现。

原因大概是 $.addClass 时浏览器需要重新计算该元素位置, JS 数量过多使计算过程明显。

不多说,在 HTML 里多放一个包含 .fixed 的宽高为 0 的元素即可解决。

<div class="fixed"></div>
<nav>something...</nav>
别让这个 div.fixed 显示出来。

至此,全面解决 “动态添加样式导致的元素闪烁” 。

原生 JS 进一步加快速度避免闪烁

jQuery 是个好东西。原生 JS 更是个好东西。

有些 jQuery 代码,被转化为好多条原生 JS 才实现效果。

然而其实只需要一条。

将 jQuery 代码转化为原生 JS 是个加快速度,避免闪烁的不二选择。

var scroll=0;
var navST=60; //该元素距离网页顶端60px
 window.onscroll = function(){
    if(document.documentElement.scrollTop || document.body.scrollTop>navST && scroll==0){
        document.getElementsByTagName("nav")[0].classList.add("fixed");
        scroll=1;
    }
    else if(document.documentElement.scrollTop || document.body.scrollTop<=navST && scroll==1){
        document.getElementsByTagName("nav")[0].classList.remove("fixed");
        scroll=0;
    }
};

时间: 2024-11-10 07:10:22

解决动态添加样式导致的元素闪烁的相关文章

给Ajax返回的HTML标签动态添加样式的方法

今天在做项目时,在页面中用ajax返回了另一个页面,突然发现返回页面中的表格把页面给顶了出去,经过一番研究,终于解决了. 先准备好要返回内容的容器 <div class="container"> </div> 预定义一个样式,以便返回的内容能直接套用 比如,我们希望返回的表格不会太过分,把页面给顶开了... <style> .container table{ width:100%; } </style> 最后直接在容器中用ajax返回内容

asp.net在后端动态添加样式表调用的方法

  asp.net在后端动态添加样式表调用的方法         本篇文章主要介绍了asp.net在后端动态添加样式表调用的方法,涉及asp.net操作样式表的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了asp.net在后端动态添加样式表调用的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 HtmlLink CssControl = new HtmlLink(); CssControl.Href = url; CssControl.Attribut

JQuery动态添加Select的Option元素实现方法_jquery

如下所示: var selector=$('<select></select>'); for(var i=0;i<5;i++){ selector.append('<option value="'+i+'">'+i+'</option>'); } 以上这篇JQuery动态添加Select的Option元素实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持. 以上是小编为您精心准备的的内容,在的博客.问答

asp.net在后端动态添加样式表调用的方法_实用技巧

本文实例讲述了asp.net在后端动态添加样式表调用的方法.分享给大家供大家参考.具体实现方法如下: HtmlLink CssControl = new HtmlLink(); CssControl.Href = url; CssControl.Attributes.Add("rel", "stylesheet"); CssControl.Attributes.Add("type", "text/css"); page.Hea

再谈javascript 动态添加样式规则 W3C校检_javascript技巧

毫无疑问,基于表现与结构相分离的原则,直接导入一个新的样式表是最好的选择,但有些情况就行不通,如我们做一个能拖动的DIV,从设置样式的角度看,就是把它绝对定位,以防影响原来的文档流,然后一点点改变其top与left的值实现移动的效果.由于拖动是有时间概念的,一秒24帧,样式表不可能面面俱到都把它们写进去.因此动态生成样式规则与快速修改样式规则是非常有必要的,W3C为此做了大量的工作,在DOM2.0中,扩充了不少接口. 退一步说,表现与结构相分离也不止导入样式表这一条路.要知道,一共有三种样式类型

javascript动态添加样式(行内式/嵌入式/外链式等规则)_javascript技巧

添加CSS的方式有行内式.嵌入式.外链式.导入式 a)动态引入样式表文件: 复制代码 代码如下: function loadLink(url){ var link = document.createElement("link"); link.type = "text/css"; link.rel = "stylesheet"; link.href = url; var head = document.getElmentsByTagName(&qu

css样式的动态添加及显示和隐藏等零碎用法

 样式的动态添加: (其中红色字体是动态添加样式的语句),这是一个动态生成无序列表的函数,用来显示搜索到的wifi信号,其中有3个参数,wifi的名称.加密方式.信号强度. 代码如下: // create a network list item function newListItem(network, averageSignalStrength) { /** * A Wi-Fi list item has the following HTML structure: * <li> * <

使用bootstrapValidator插件进行动态添加表单元素并校验_javascript技巧

一.前言 实际工作中,要实现表单元素的动态增加,并使用bootstrapValidator插件对动态添加的表单元素进行前台校验.在以前的工作中也使用过bootstrapValidator对表单元素进行校验,但涉及到的表单元素都是固定的,所以在页面载入时,对表单元素进行初始化就可以实现.虽然思路很明确,但由于对bootstrapValidator的用法不熟悉,在这个问题上还是浪费了很多时间,现在就把解决方法和功能效果图贴出来,希望对大家有所帮助. 思路:动态添加表单元素,并调用bootstrapV

JavaScript动态添加css样式和script标签_javascript技巧

[动态添加css样式] <html> <head> <script type="text/javascript"> window.onload=function(){ var head=document.getElementsByTagName('head')[0]; //获取到head元素 var link=document.createElement('link'); //创建link元素节点,也就是link标签 link.rel="s