JS 的平凡之路 -- 我们到底可以通过多少种方式修改元素样式

栏目: CSS · 发布时间: 7年前

内容简介:JS 的平凡之路 -- 我们到底可以通过多少种方式修改元素样式

本篇文章主要介绍JS操作CSS的各种方法。

一、前言

一般我们在项目中引入CSS样式,可以通过link标签引入外部样式表,也可以通过style标签引入样式,最后可以直接在元素的行内设置style属性值,不过这里有一点要注意:

  • style和link多有一个media属性,默认是screen值,我们可以这样赋值:media="screen and (max-width: 1000px)";当屏幕的宽度小于1000像素时,此段样式生效。
  • media常见的属性还有print,只有在打印或者打印预览的时候样式才会生效。

下面我们来聊聊用JS有多少种方式来修改一个元素的样式。

二、style属性

const demo = document.querySelector('.demo');
    demo.style.width = "400px";
    demo.style.background = "yellow";

当你采用这种方式修改元素的样式时,如果原先设置的css样式没有用!important修饰的话,它的优先级是最高的,这段样式将插入到元素的style属性中:

<div class="demo" style="width: 400px; background: yellow;"></div>

如果你对性能敏感的话,这样多次的操作,显然不是一个很好的习惯。所以这里又来了个cssText:

demo.style.cssText = "background: blue;";

当我们使用cssText时,如果我们直接赋值的话,会覆盖掉之前在style属性里面的值,所以这里我们可以这样:

demo.style.cssText += "background: blue;";

采用cssText减少了频繁的赋值操作。

三、class属性

我们多知道元素的class属性也是影响元素样式的要素之一,所以这里我们想到了这种方法修改样式:

demo.setAttribute('class','demo1');

这样的确是个方法,但是同样会覆盖原先的类名,这里我们需要这样处理一下:

const attr = demo.getAttribute('class');
    demo.setAttribute('class',attr + ' demo1');

这里一定要注意,类名之间要用空格分开。

这里我们也是费了一番周折修改了class属性,实际上在标准已经为什么我们添加了className的快捷属性。

demo.className += " demo1";

这里我们同样要用空格分隔类名,仔细思考这两种方法弊端还是不少:

  • 需要采用空格分隔类名;
  • 可能会添加重复的类名;
  • 各种不舒服。。。。。。。

这里就要引出我们的classList:

  • add(classname): 添加类名;
  • remove(classname): 删除类名;
  • item(n): 得到列表中的第n个类名;
  • toggle(classname): 如果类名存在则删除,否则添加;
  • contains(classname): 判断类名是不是存在。

这么多快捷的方法,是不是很爽,自己玩去吧,我就不一一介绍了。通过类名更改元素样式必须要了解类名的CSS优先级,不然你就算添加一堆类名也没有什么用处。

四、style标签

元素的style属性,class属性我们多动刀了,那么我们还剩下什么?修改link标签的href属性值,这未必有点太牵强了。那我们来修改style标签吧。

我们可以通过哪些方式获取style标签的内容呢?

1、通过元素属性获取

我们可以给style标签加上一个id:

<style id="demostyle">
        .demo {
            width: 200px;
            height: 100px;
            background: red;
        }
    </style>

然后我们就可以通过innerHTML、outerHTML和innerText获取style标签内容了。这里我就采用innerText了:

document.getElementById('demostyle').innerText = ".demo {width: 1000px; height: 200px;background: yellow;}";

这里我只是简单的赋值,如果你要处理的很好的话,得用正则去处理这些字符串,才能达到更好的效果。

2、通过document.styleSheets

除了上面这种方式获取style标签,我们还可以通过document.styleSheets,这个就要解决我们上面用innerText带来的各种不方便,它有两个方法:

  • deleteRule(n): 删除第n条cssRule;
  • insertRule(rule, n): 在第n处插入一条cssRule。

对于上面的style标签,我们可以这样操作:

const style = document.styleSheets[0];
    style.insertRule('div.demo {background: blue}',1);

这里我们更要考虑CSS的优先级问题,虽然我们向style中添加了一条cssRule,但是style中并不会显示这条cssRule。我们只能通过document.styleSheets[0]来查看新增的cssRule。

五、总结

折腾了半天,终于告一段落。二和三的方法主要运用于单个元素的样式修改,而四应该可以用来修改一些公共样式。

参考资料来源于MDN文档

觉得不错的同学,来一波关注吧,您的关注就是我写作的动力。

GitHub交流

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

PHP&MySQL Web数据库应用开发指南

PHP&MySQL Web数据库应用开发指南

Hugb E. Williams、David Lane / 谢君英 / 中国电力出版社 / 2003-5 / 69.00元

一起来看看 《PHP&MySQL Web数据库应用开发指南》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具