一 功能描述
在界面中,有一组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("");// 使用idconst 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 即可。