You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

纯JavaScript实现单选式评分组件:仅允许单个class为number的div被点击变色

纯JavaScript实现单选式评分组件:仅允许单个class为number的div被点击变色

嘿,我来帮你搞定这个单选评分的问题!你现在的代码能让每个数字块点击变色,但没法做到单选——其实核心思路很简单:每次点击新的数字块时,先把所有数字块的样式重置回默认状态,再给当前点击的元素设置选中样式,这样就只会有一个块保持选中状态啦。

先看看问题出在哪:你当前的代码只给点击的元素添加样式,但从来没清除过之前选中元素的样式,所以点一个就多一个变色的块。接下来我给你两种实现方式,一种直接适配你现有代码,另一种更优雅的用CSS类来管理样式。

方式一:直接修改行内样式(适配你现有代码)

你的HTML结构不用改动:

<div class="number icon"><h2>1</h2></div>
<div class="number icon"><h2>2</h2></div>
<div class="number icon"><h2>3</h2></div>
<div class="number icon"><h2>4</h2></div>
<div class="number icon"><h2>5</h2></div>

修改JavaScript代码,新增一个重置所有样式的函数,每次点击前先调用它:

const numbers = document.getElementsByClassName('number');

// 重置所有数字块的样式回默认状态
function resetStyles() {
  for (let i = 0; i < numbers.length; i++) {
    // 清空行内样式,恢复CSS里设置的默认样式
    numbers[i].style.backgroundColor = '';
    numbers[i].style.color = '';
    // 如果你的默认样式是固定值,也可以直接写具体值,比如:
    // numbers[i].style.backgroundColor = 'hsl(213, 19%, 18%)';
    // numbers[i].style.color = 'hsl(217, 12%, 63%)';
  }
}

function setupClickHandler(element) {
  element.addEventListener('click', () => {
    resetStyles(); // 先把所有已选中的块重置
    // 再给当前点击的块设置选中样式
    element.style.backgroundColor = 'hsl(216, 12%, 54%)';
    element.style.color = 'white';
  });
}

// 给每个数字块绑定点击事件
for (let i = 0; i < numbers.length; i++) {
  setupClickHandler(numbers[i]);
}

方式二:用CSS类管理样式(更推荐,维护更方便)

这种方式把样式都放在CSS里,JS只负责添加/移除类,后期修改样式不用动JS,更符合前端最佳实践。

先写CSS:

/* 默认样式 */
.number {
  background-color: hsl(213, 19%, 18%); /* 示例默认背景色,可按需修改 */
  color: hsl(217, 12%, 63%); /* 示例默认文字色,可按需修改 */
  /* 加上你需要的其他样式,比如圆角、padding、cursor等 */
}

/* 选中状态样式 */
.number.selected {
  background-color: hsl(216, 12%, 54%);
  color: white;
}

HTML结构不变,JS代码简化成这样:

const numbers = document.getElementsByClassName('number');

// 移除所有数字块的选中类
function resetSelection() {
  for (let i = 0; i < numbers.length; i++) {
    numbers[i].classList.remove('selected');
  }
}

function setupClickHandler(element) {
  element.addEventListener('click', () => {
    resetSelection();
    element.classList.add('selected');
  });
}

// 绑定所有点击事件
for (let i = 0; i < numbers.length; i++) {
  setupClickHandler(numbers[i]);
}

这样不管你后期要改选中状态的颜色,还是默认样式,直接修改CSS就行,不用碰JS代码,是不是更省心?

备注:内容来源于stack exchange,提问作者Dejan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:10:28