实现点击Button,改变背景颜色(多个按钮互斥显示)

news2024/10/6 12:32:55

一 功能描述

        在界面中,有一组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 即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1895350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PowerDsigner的简单使用

目录 1.PowerDesinger 2.PD与navicat的区别&#xff1a; 3.使用 1.PowerDesinger 在实际开发中&#xff0c;数据库的设计会使用专业的建模工具——PowerDesinger &#xff08;安装及其破解大家搜选相关CSDN博客吧&#xff09; 2.PD与navicat的区别&#xff1a; navicat是…

Zabbix企业级监控系统

——监控可以帮助我们做什么&#xff1f; 作为一个运维&#xff0c;需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等&#xff0c;利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件&#xff0c;我们可以: 通过一个友好的…

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本&#xff08;helm部署&#xff09; 简介 OpenEBS 是一种开源云原生存储解决方案。OpenEBS 可以将 Kubernetes 工作节点可用的任何存储转化为本地或复制的 Kubernetes 持久卷。OpenEBS 帮助应用和平台团队轻松地部署需要…

FlinkCDC-3.1.1 DataStream Source

问题&#xff1a; Caused by: java.lang.ClassNotFoundException: org.apache.flink.table.catalog.ObjectPath 解决&#xff1a; 在poml文件中&#xff0c;导入的flink-table依赖把“ <scope>”去掉 <properties><maven.compiler.source>8</maven.compi…

ffmpeg将多个yuv文件编码为MP4视频文件

一、编码方案 在视频录制时&#xff0c;每一帧保存为一个yuv文件&#xff0c;便于纠错和修改。在编码为MP4文件时&#xff0c;我的方案是将所有yuv文件先转码为单个MP4文件&#xff0c;然后使用ffmpeg的concat功能拼接为完整的视频。 二、shell脚本 #!/bin/bash# 检查参数数量…

自己训练 PaddleOCR

打标工具 https://github.com/Evezerest/PPOCRLabel 感谢这位热心网友提供的标注工具&#xff0c;操作非常的方便 只是这个工具有个小坑get_rotate_crop_image&#xff08;&#xff09; 我的标注数据导出时&#xff0c;很多数据变成倒的 hmmmm, 你管我~ if dst_img_height …

Lesson 47 A cup of coffee

Lesson 47 A cup of coffee 词汇 like v. 喜欢&#xff0c;想要 用法&#xff1a;like 物品 / 人 喜欢……    like 动词ing 喜欢做……&#xff08;习惯性&#xff09;    like to 动词原形 喜欢做……&#xff08;一次性&#xff09; 例句&#xff1a;我喜欢小狗…

【UE5.1】Chaos物理系统基础——03 炸开几何体集

目录 步骤 一、通过径向向量将几何体集炸开 二、优化炸开效果——让破裂的碎块自然下落 三、优化炸开效果——让碎块旋转起来 四、优化炸开效果——让碎块旋转的越来越慢 步骤 一、通过径向向量将几何体集炸开 1. 打开上一篇中&#xff08;【UE5.1】Chaos物理系统基础—…

第3章.中央服务器的物联网模式--规则引擎

规则引擎 规则引擎本质上是物联网事件和需要与这些事件相关联的动作之间的映射。在物联网环境中&#xff0c;事件通常使用传感器生成&#xff0c;所需的动作由执行器采取。本书中用于该图案的符号如下图所示&#xff1a; 图3.6–“规则引擎”模式的符号 一个有趣的类比是将规则…

Vue2前端实现数据可视化大屏全局自适应 Vue实现所有页面自适应 Vue实现自适应所有屏幕

Vue自适应所有屏幕大小,目前页面自适应,尤其是数据可视化大屏的自适应更是案例很多 今天就记录一下使用Vue全局自适应各种屏幕大小的功能 在Vue.js中创建一个数据大屏,并使其能够自适应不同屏幕大小,通常涉及到布局的响应式设计、CSS媒体查询、以及利用Vue的事件系统来处理…

stm8玩耍日记1

写在前面&#xff0c;如题所示&#xff0c;这是一个stm8L051F3的玩耍记录。 环境使用的是IAR for stm8&#xff0c;使用stlink v2作为调试下载器&#xff0c;跟着st中文论坛的一个大佬的教程学习的。 整体配置下来&#xff0c;点亮了led&#xff0c;感觉和stm32的开发差不多&…

电脑鼠标一直转圈圈怎么处理?对症下药,分享6种方法

在使用电脑的过程中&#xff0c;鼠标一直转圈圈是一个常见且令人困扰的问题。这种情况通常意味着系统正在处理某些任务&#xff0c;但如果持续时间过长&#xff0c;可能表明系统存在性能问题或错误。本文将详细探讨鼠标一直转圈圈的常见原因及其解决方法。 摘要 电脑鼠标一直转…

解决Python爬虫开发中的数据输出问题:确保正确生成CSV文件

引言 在大数据时代&#xff0c;爬虫技术成为获取和分析网络数据的重要工具。然而&#xff0c;许多开发者在使用Python编写爬虫时&#xff0c;常常遇到数据输出问题&#xff0c;尤其是在生成CSV文件时出错。本文将详细介绍如何解决这些问题&#xff0c;并提供使用代理IP和多线程…

2024.7.4作业

1.梳理笔记(原创) 2. 终端输入一个日期&#xff0c;判断是这一年的第几天 scanf("%d-%d-%d",&y,&m,&d); 闰年2月29天&#xff0c;平年2月28天 #include <stdio.h> int main(int argc,const char *argv[]) { int y0,m0,d0,sum0,i0; …

打卡第2天----数组双指针,滑动窗口

今天是参与训练营第二天&#xff0c;这几道题我都看懂了&#xff0c;自己也能写出来了&#xff0c;实现思路很重要&#xff0c;万事开头难&#xff0c;希望我可以坚持下去。希望最后的结果是量变带来质变。 一、理解双指针思想 leetcode编号&#xff1a;977 不止是在卡尔这里…

FPGA学习笔记(7)——Vivado Simulator仿真软件的使用

1 仿真概述 Simulator仿真虽然不需要使用硬件资源&#xff0c;但是需要编写激励文件&#xff0c;也就是testbench代码。 仿真是设计输入后的第一个步骤&#xff0c;也是实现后的最后一个步骤&#xff0c;可以分为功能仿真&#xff08;RTL仿真&#xff09;和时序仿真。 功能仿…

【秋招突围】2024届秋招笔试-科大讯飞笔试题-04-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

数字化工厂EasyCVR视频监控智能解决方案:引领工业4.0时代新趋势

随着工业4.0的深入发展和数字化转型的浪潮&#xff0c;数字化工厂视频监控智能解决方案成为了现代工业生产中不可或缺的一部分。这一解决方案集成了先进的视频监控技术、人工智能&#xff08;AI&#xff09;和大数据分析&#xff0c;为工厂提供了更高效、更安全、更智能的监控和…

蓝牙模块的使用01,OOOLMF蓝牙模块HC05调试使用01AT设置从机,手机用软件对接

参考资料 https://blog.csdn.net/xia3976/article/details/122199162 1、实验目的 验证蓝牙模块是不是好的&#xff0c;能不能AT指令改变查询配置&#xff1b; 验证设置从机模式&#xff0c;成功之后&#xff0c;用手机现成的蓝牙软件&#xff08;实验室大群里面有&#xff09…