内容简介: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交流以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- WPF从代码后面设置命名样式元素?
- 使用CSS定义页面元素的外观样式
- 「前篇」JavaScript如何获取一个元素的样式信息
- c# – .NET WebBrowser – FireBug样式检查HTML元素
- 微软对 Chromium 新贡献:为 HTML 元素引入更现代化样式
- 1.6 常用CSS样式2:其它样式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Coming of Age in Second Life
Tom Boellstorff / Princeton University Press / 2008-04-21 / USD 29.95
The gap between the virtual and the physical, and its effect on the ideas of personhood and relationships, is the most interesting aspect of Boellstorff's analysis... Boellstorff's portrayal of a virt......一起来看看 《Coming of Age in Second Life》 这本书的介绍吧!