题目
面试官:页面上有三个按钮,红黄绿,点击任何一个按钮,该按钮颜色由之前变为白色,再点击其他按钮,颜色恢复为原来颜色,注意不能使用js
解答
这道题刚拿到手是一脸得意,心想这还不简单,于是:
<head>
...
<style>
* {
margin: 0;
padding: 0;
}
button {
width: 100px;
height: 40px;
border-radius: 10px;
background-color: chartreuse;
/* border: none; */
}
button:nth-of-type(2){
background-color: brown;
}
button:nth-of-type(3){
background-color: lightpink;
}
</style>
</head>
<body>
<div id="fa">
<button id="a"></button>
<button id="b"></button>
<button id="c"></button>
</div>
<script>
let aBg = a.style.backgroundColor
a.addEventListener('focus', (e) => {
console.log(e, 'focus')
e.target.style.backgroundColor = 'white'
})
a.addEventListener('blur', (e) => {
e.target.style.backgroundColor = aBg
})
let bBg = b.style.backgroundColor
b.addEventListener('focus', (e) => {
console.log(e, 'focus')
e.target.style.backgroundColor = 'white'
})
b.addEventListener('blur', (e) => {
e.target.style.backgroundColor = aBg
})
let cBg = c.style.backgroundColor
c.addEventListener('focus', (e) => {
console.log(e, 'focus')
e.target.style.backgroundColor = 'white'
})
c.addEventListener('blur', (e) => {
e.target.style.backgroundColor = aBg
})
</script>
</body>
监听按钮的focus和blur事件,在focus的时候改变颜色为白色,blur的时候改回原来颜色。
面试官:不能使用js!!!
啊这,不好好审题自罚读题五十遍~
那么不使用js该怎么解决呢?开始在我贫瘠的大脑知识库中全力搜索,就在我行将放弃的时候,忽然想到一个伪类:focus,大概是控制按钮激活的,还有个:active好像也行,先整:focus试试吧,死马当活马医了
<head>
...
<style>
* {
margin: 0;
padding: 0;
}
button {
width: 100px;
height: 40px;
border-radius: 10px;
background-color: chartreuse;
/* border: none; */
}
button:nth-of-type(2){
background-color: brown;
}
button:nth-of-type(3){
background-color: lightpink;
}
button:focus{
background-color: #fff;
}
</style>
</head>
<body>
<div id="fa">
<button id="a"></button>
<button id="b"></button>
<button id="c"></button>
</div>
</body>
神奇的事情发生了,用这一行css样式,竟然能替代十几行的js代码,完成了一模一样的功能!
button:focus{
background-color: #fff;
}
再去试试那个:active
button:active{
background-color: blue;
}
原来,:active控制鼠标在按钮上方按下期间样式表现
总结
- button标签上的
:focus伪类控制按钮聚焦样式,不需要额外事件处理情况下,可以实现js的focus和blur事件效果。 - button标签上的
:active伪类控制按钮被鼠标按下的样式,可以实现js的mouseDown和mouseUp事件 - 常见的伪类要多用用,说不定哪天面试就遇到了~ (本文完)