JavaScript 设置CSS与注意事项

算法聆风人
• 阅读 2098

JavaScript设置CSS的几种方法及注意事项

JS设置CSS样式

  • 直设置内联style属性

    el.style.color = 'red';
    el.style['font-size'] = '16px';
    el.style.fontSize = '16px';
  • cssText设置内联样式

    el.style.cssText = 'color: red'; //替换内联css
    el.style.cssText += 'color: red' //追加
  • setProperty设置内联样式

    el.style.setProperty('color', 'red', '!important'); //第三个参数可 以省略  
    

以上3中方法都是基于内联样式,用他们来获取Dom元素的样式是同样只能获取到内联样式。

  • addRule、insertRule
    二者区别 ,addRule:在原有css规则中加入样式; insertRule:

       document.styleSheets[0].addRule('.class', 'color: red');
       document.styleSheets[0].insertRule('.class{color: red}', 0);  //参数:rules,index(cssRules 数组中的位置)
        

注意事项

先看下面这段代码:预期执行结果是第三行不有出现过度效果,但实际还是上出现了过度效果

let con = document.getElementsByClassName('container')[0];
con.style.transitionDuration = '0s';
con.style.transform = 'translateX(0)';
con.style.transitionDuration = '.2s';
这是来自轮播图功能中的代码段,目的是为了从最后一张图跳到第一张图时不显示过渡动画。
为了找到是什么原因接下来打上debuger看看调试的情况:
function prev(offsetWidth) {
        if(con.style.transform == maxWidth){
            // 开始
            debugger;     
            con.style.transitionDuration = '0s';
            // 运行到此处:样式transition-during没有被渲染到DOM上
            con.style.transform = 'translateX(0)';
            // 运行到此处:样式transition-during、translateX都没有被渲染到DOM上
            initWidth = -600;
            offsetWidth = initWidth;
            con.style.transitionDuration = '.2s';
            // 运行到此处:样式transition-during、translateX都没有被渲染到DOM上
        }
        setTimeout(function () {
            // 运行到此处:样式transition-during、translateX都没有被渲染到DOM上,且transition-during:.2s
            con.style.transform = 'translateX('+offsetWidth+'px)';
        },2);
    }

原来浏览器为了优化会将css操作当一起执行相同的元素上属性的样式会被覆盖,也就是上面这个例子中con.style.transitionDuration = '0s';这句被覆盖了,但是如果你在这句之后将加上一句console.log(con.style.transitionDuration)是可以获取到0s的,所以只是浏览器没有渲染出来而已,并不是没有执行。
为了处理这个现象可以给这句加上延迟 
    setTimeout(function () {
            con.style.transitionDuration = '.2s';
        },1)

完整例子代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #carousel{
            width: 600px;
            height: 400px;
            margin: 100px auto;
            overflow: hidden;
        }
        .container{
            transition-duration: .2s;
        }
        .container{
            transform: translateX(-600px);
        }
        .container>div{
            width: 600px;
            height: 400px;
            vertical-align: middle;
            text-align: center;
            border: 1px solid blue;
            box-sizing: border-box;
            line-height: 398px;
            font-size: 32px;
            float: left;
        }
    </style>
</head>
<body>
    <div id="carousel">
        <div class="container">
            <!--第一张为了过度-->
            <div>5</div>
            <div>1</div>
            <div>2</div>
            <div>3</div>
            <div>4</div>
            <div>5</div>
        </div>
    </div>
</body>
<script>
    let carousel = document.getElementById('carousel');
    let imgWidth = carousel.offsetWidth;
    let conWidth = imgWidth * 6 + 'px';     //总宽度
    let con = document.getElementsByClassName('container')[0];
    let initWidth = -600;   //初始位置
    let maxWidth = 'translateX('+initWidth*5+'px)';
    con.style.width = conWidth;
    function prev(offsetWidth) {
        if(con.style.transform == maxWidth){
            // debugger;
            con.style.transitionDuration = '0s';
            con.style.transform = 'translateX(0)';
            initWidth = -600;
            offsetWidth = initWidth;
            // con.style.transitionDuration = '.2s';
            setTimeout(function () {
                con.style.transitionDuration = '.2s';
            },1)
        }
        setTimeout(function () {
            con.style.transform = 'translateX('+offsetWidth+'px)';
        },2);
    }

    let play = setInterval(function () {
        initWidth -=600;
        prev(initWidth);
    },1000);
</script>
</html>
点赞
收藏
评论区
推荐文章
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
CSS基本语法及页面引用
css基本语法及页面引用(1)css基本语法css的定义方法是:选择器{属性:值;属性:值;属性:值;}选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个值。代码示例:/css注释ctrlshift"/"/d
Easter79 Easter79
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
3年前
Sass
嵌套规则(NestedRules)Sass允许将一套CSS样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器mainp{color:00ff00;width:97%;.redbox{
Wesley13 Wesley13
3年前
CSS基础知识整理
1什么是CSS?CSS通常称为CSS样式表或层叠样式表(级联样式表),主要用于设置HTML页面中的文本内容(字体、大小、对齐方式等)、图片的外形(宽高、边框样式、边距等)以及版面的布局等外观显示样式。CSS以HTML为基础,提供了丰富的功能,如字体、颜色、背景的控制及整体排版等,而且还可以针对不同的浏览器设置不同的样式。
Wesley13 Wesley13
3年前
JS和CSS加载(渲染)机制不同
一、结论CSS可以在页面加载完成后随时渲染。举个例子:通过js给某个元素加一个id或者css,只要这个id或者css有对应的样式,此元素的样式就会自动生效。JS不可以在页面加载完成后生效。最明显的例子就是使用EasyUI的时候,iframe中哪些样式无效(EasyUi是依靠JS进行样式处理的,所以无法运行JS,那么样式也就无法设置。简单点说
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
DOM设置css样式
<!DOCTYPEhtml<html<headlang"en"<metacharset"UTF8"<titleDOM设置css样式</title<!p.style.fontSize100px;解
Stella981 Stella981
3年前
CSS 分类 (Classification)
★★CSS分类属性(Classification)★★⑴CSS分类属性允许你控制如何显示元素,设置图像显示于另一元素中的何处,相对于其正常位置来定位元素,使用绝对值来定位元素,以及元素的可见度。⑵下面是常用的属性以及描述:!(https://oscimg.oschina.net/oscnet/00cb565
Wesley13 Wesley13
3年前
CSS学习笔记——最基础的定义与使用
1、最近看看一些CSS的东西,发现每次看过就忘记,做起东西来就会非常的慢,所以有时间的话可以抽空多看看别人的网站,然后想想自己能不能做出这种效果。2、有哪几种设置样式的方式:浏览器缺省设置外部样式表<head<linkrel"stylesheet"type"text/css"href"mystyle.css