改变某HTML元素样式,有多种方法,各有优缺。推荐方法二:通过添加或切换元素的类来改变其样式。
知识储备
1.正则表达式
双斜杠中,第一个为转义字符。
alert("\\b");
2.Syntax上需要注意的问题
box1.style.width = "200px";
box1.style.backgroundColor = "#bfa";
3.属于多个类的情况下,样式的覆盖情况
<div id="box1" class="b1 b2"> </div>
表示既属于类b1,又属于类b2。按照排列顺序,靠后的类的CSS样式,会覆盖掉相对靠前的类中与之重合的CSS样式,比如width 和background-color ;但是不同的样式不会被覆盖掉,比如下图中的height
方法一:改变内联样式
- 优点:
- 缺点:
- 每执行一句
element.style.styleName = " "; ,都会重新进行一次整个页面的渲染,在网络拥堵的情况下效果巨差,不符合异步更新策略。因此不推荐使用。
<style>
.b1{
width:100px;
height:100px;
background-color: coral;
}
.b2{
width:200px;
background-color:darkseagreen;
}
</style>
<body>
<div id = 'box1' class = 'b1'>
</div>
<br>
<button id="btn01">测试一下</button><br><br>
<script >
const btn01 = document.getElementById('btn01');
const box1 = document.getElementById('box1');
btn01.onclick = function(){
box1.style.width = "200px";
box1.style.backgroundColor = "#bfa";
};
</script >
</body>
方法二: classList 属性配合add() 、remove() 、toggle() ,添加或删除元素的类来改变其样式。
<style>
.b1{
width:100px;
height:100px;
background-color: coral;
}
.b2{
width:200px;
background-color:darkseagreen;
}
.b3{
width:200px;
border-radius: 2px;
background-color:lightslategray;
}
</style>
<body>
<div id = 'box1' class = 'b1'>
</div>
<br>
<button id="btn01">add</button>
<button id="btn02">remove</button>
<button id="btn03">toggle</button>
<script >
const btn01 = document.getElementById('btn01');
const btn02 = document.getElementById('btn02');
const btn03 = document.getElementById('btn03');
const box1 = document.getElementById('box1');
btn01.addEventListener("click", function(){
box1.classList.add("b2");
},false);
btn02.addEventListener("click",function(){
box1.classList.remove("b2");
},false);
btn03.addEventListener("click",function(){
box1.classList.toggle("b3");
},false);
</script>
</body>
</html>
方法三:利用正则表达式、自定义addClass()、removeClass()、toggleClass()函数
首先说明一下,方法三为尚硅谷课程的笔记,课程比较老了,但是老师为大家提供了正则表达式在容错方面的巨大作用。方法二为JS内置函数,自然有容错机制,但是学习方法三也是非常必要的。实际开发中,建议使用方法二。
首先说明一下
<style>
.b1{
width:100px;
height:100px;
background-color: coral;
}
.b2{
width:200px;
background-color:darkseagreen;
}
</style>
<body>
<div id = 'box1' class = 'b1'>
</div>
<br>
<button id="btn01">add</button>
<button id="btn02">remove</button>
<button id="btn03">toggle</button>
<script >
const btn01 = document.getElementById('btn01');
const btn02 = document.getElementById('btn02');
const btn03 = document.getElementById('btn03');
const box1 = document.getElementById('box1');
btn01.addEventListener("click", function(){
addClass(box1, "b2");
},false);
btn02.addEventListener("click",function(){
removeClass(box1, "b2");
},false);
btn03.addEventListener("click",function(){
toggleClass(box1, "b2");
},false);
function hasClass(obj,cn){
var reg = new RegExp("\\b"+ cn + "\\b");
return reg.test(obj.className);
}
function addClass(obj,cn){
if(!hasClass(obj,cn)){
obj.className += " " + cn;
}
}
function removeClass(obj, cn){
if(hasClass(obj,cn)){
var reg = new RegExp("\\b"+cn+"\\b");
obj.className = obj.className.replace(reg, "");
}
}
function toggleClass(obj, cn){
if(hasClass(obj, cn)){
remove(obj, cn);
}else{
addClass(obj, cn);
}
}
</script>
</body>
removeClass()这么写,在多次操作同一个类后会有空格遗留问题
function removeClass(obj, cn){
if(hasClass(obj,cn)){
var reg = new RegExp("\\b"+cn+"\\b");
obj.className = obj.className.replace(reg, "");
}
}
上述方法会在add和remove同一个类多次之后,造成空格遗留问题。
CSS样式优先级
1.在不考虑继承的情况下,从上到下优先级递减:
-
属性后插有 !important 的属性拥有最高优先级;,且不会被覆盖掉。 .b1{
width:100px;
height:100px;
background-color: coral !important;
}
-
内联样式
<div id = 'box1' style="background-color: cadetblue; width: 300px;"></div>
-
样式表样式 .b1{
width:100px;
height:100px;
background-color: coral !important;
}
2.单论样式的继承优先级,从上到下依次递减:
- 直接样式
<div style="color: red">
<div style="color: blue">
<div class="son" style="color: coral"></div>
</div>
</div>
- 最近的祖先样式
<div style="color: red">
<div style="color: blue">
<div class="son"></div>
</div>
</div>
- 较远的祖先样式
<div style="color: red">
<div>
<div class="son"></div>
</div>
</div>
关于CSS样式优先级更详细的讲解,详见菜鸟教程
|