一 功能描述
在界面中,有一组button,现在需要实现下面功能:点击其中一个,改变被点击button的背景颜色。当点击下一个之后,之前点击过的按钮背景颜色还原,当前被点击的button背景色又被改变。效果如下图:
当点击了test1,test1的背景色变为了红色。再继续点击test2,test2的背景色变为了红色,而test1的背景色还原。
二 功能实现(以React代码为例,其他框架逻辑类似)
1. 方式一:使用 className和动态的onClick事件。
import {Button, Space} from "antd";
import React, {useEffect} from "react";
const ButtonClick = () => {
const changeColorMethod = () => {
let but = document.getElementsByClassName("buttonColor");
for (let i = 0; i < but.length; i++) {
but[i].onclick = function () {
for (var i = 0; i < but.length; i++) {
but[i].style.backgroundColor = '';
}
this.style.backgroundColor = 'red';
}
}
}
useEffect(() => {
changeColorMethod()
}, []);
return <div>
<Space>
<Button className={`buttonColor`}>
test1
</Button>
<Button className={`buttonColor`}>
test2
</Button>
<Button className={`buttonColor`}>
test3
</Button>
</Space>
</div>
};
export default ButtonClick;
2. 方式二:使用 className和手动添加的onClick事件。
import {Button, Space} from "antd";
import React from "react";
const ButtonClick = () => {
const changeColorMethod = (e) => {
let button = document.getElementsByClassName("buttonColor");
for (let i = 0; i < button.length; i++) {
button[i].style.backgroundColor = '';
}
e.currentTarget.style.backgroundColor = "red";
}
return <div>
<Space>
<Button className={`buttonColor`} onClick={changeColorMethod}>
test1
</Button>
<Button className={`buttonColor`} onClick={changeColorMethod}>
test2
</Button>
<Button className={`buttonColor`} onClick={changeColorMethod}>
test3
</Button>
</Space>
</div>
};
export default ButtonClick;
3. 方式三:使用useState、button的id和onClick事件。
import {Button, Space} from "antd";
import React, {useState} from "react";
const ButtonClick = () => {
const [lastNode, setLastNode] = useState("");
// 使用id
const changeColorMethod = (e) => {
// 还原上一个
if (lastNode) {
const oldNodeInfo = document.getElementById(lastNode);
if (oldNodeInfo) {
oldNodeInfo.style.backgroundColor = '';
}
}
const currentId = e.currentTarget.id;
const newNodeInfo = document.getElementById(currentId);
if (newNodeInfo) {
newNodeInfo.style.backgroundColor = 'red';
}
setLastNode(currentId)
}
return <div>
<Space>
<Button id={"test1"} onClick={changeColorMethod}>
test1
</Button>
<Button id={"test2"} onClick={changeColorMethod}>
test2
</Button>
<Button id={"test3"} onClick={changeColorMethod}>
test3
</Button>
</Space>
</div>
};
export default ButtonClick;
三 备注和延申
背景颜色还原的时候一定要写”空字符串“ 。
backgroundColor的值如果写成了 white 或者 transparent ,那么。button的hover事件中设置【backgroundColor】的功能就对已点击过的button 无效。
如果在这种情况下,非要实现hover中的backgroundColor功能,那么就给 backgroundColor 颜色添加 !important 属性 。
但是这样便会出现一个问题:加上了 !important ,那么被点击后的button也会出现 hover 效果,这样就不太符合功能设定(按理说,被点击后的button不管怎样,都会保持点击时候的颜色,即使 hover ,也不会变色)。
因此,为了不要出现这个问题,就一定注意,重设背景颜色,一定要写成【空字符串】。
以上也得出,想要 hover事件的背景颜色 效果 覆盖点击时候的背景颜色,给 hover 中的backgroundColor 属性加上 !important 即可。