如果类包含值,则更改背景颜色

Posted

技术标签:

【中文标题】如果类包含值,则更改背景颜色【英文标题】:Change background-color if class contains a value 【发布时间】:2022-01-06 13:34:02 【问题描述】:

我想知道当一个类具有特定值时是否可以更改它的背景颜色。

示例:如果元素包含 '1',则将 bg-color 更改为红色,如果包含 '2',则将 bg-color 更改为绿色,等等。

html

<div class="skill-points"> 1 </div> <!-- BG color = red -->
<div class="skill-points"> 2 </div> <!-- BG color = green -->
<div class="skill-points"> 3 </div> <!-- BG color = yellow -->

CSS:

.skill-points 
width: 50px;
padding: 4px;
margin: 4px;
border: 1px solid #000;
text-align: center;

我应该如何编写我的 javascript 代码来实现这个效果?

【问题讨论】:

【参考方案1】:

您可以在集合中获取所有相关的class 元素(使用getElementsByClassName),然后将其转换为array(使用spread 运算符)。然后,您可以使用 style.backgroundColor 属性分配背景颜色。

我使用了一个映射对象,它很有用,否则您也可以进行单独的if 检查。 innerText 是您可以用来比较 HTML 元素的内部 Text 的属性。

let mapping = 
'1' : 'red', '2' : 'green' , '3': 'blue' ;

[...document.getElementsByClassName('skill-points')].forEach( x => 
x.style.backgroundColor = mapping[x.innerText];
);
.skill-points 
width: 50px;
padding: 4px;
margin: 4px;
border: 1px solid #000;
text-align: center;
<div class="skill-points"> 1 </div> <!-- BG color = red -->
<div class="skill-points"> 2 </div> <!-- BG color = green -->
<div class="skill-points"> 3 </div>

【讨论】:

【参考方案2】:

...几乎所有人都这么说。这是我的方法:

const valueClassMap = 
  1: "bg-red",
  2: "bg-green",
  3: "bg-yellow"
;
  
document.querySelectorAll(".skill-points").forEach(el => 
  const content = el.textContent.trim();
  if(valueClassMap.hasOwnProperty(content))
    el.classList.add(valueClassMap[content]);
   
);
.bg-red background: red 
.bg-green background: green 
.bg-yellow background:yellow 
<div class="skill-points"> 1 </div> <!-- BG color = red -->
<div class="skill-points"> 2 </div> <!-- BG color = green -->
<div class="skill-points"> 3 </div> <!-- BG color = yellow -->

【讨论】:

【参考方案3】:

首先你需要检查 class 是否有 value 。 你必须知道 getElementsByClassName() 返回一个数组,因此您必须访问第一个元素(如果有的话)。然后尝试通过这个 javascript 代码访问 value 属性,该代码根据值的长度检测值。

  var id = document.getElementsByClassName("classname");
  if (id.length > 0) 
  var x = id[0].value;
  alert(id[0].value);
  

然后是您要更改检测到的类的背景的部分。 您可以将 if 条件设为

   if x = x 
   document.getElementsByClassName('classname').style.backgroundColor = "red";
   

【讨论】:

【参考方案4】:

只需遍历您的元素,检查innerText,然后设置元素样式。

document.querySelectorAll('.skill-points').forEach(div => 
  if (div.innerText.contains('1')) div.style.backgroundColor = 'red';
  ...
);

【讨论】:

HTMLCollection 没有 forEach 方法。 @Unmitigated 正确,谢谢 - 更新【参考方案5】:

1)您可以使用textContent获取文本并将其匹配并将颜色设置为

const allSkillPoints = document.querySelectorAll(".skill-points");

allSkillPoints.forEach(el => 
  const text = +el.textContent.trim();
  if (text === 1) el.style.backgroundColor = "red";
  else if (text === 2) el.style.backgroundColor = "green";
  else if (text === 3) el.style.backgroundColor = "yellow";
)
.skill-points 
  width: 50px;
  padding: 4px;
  margin: 4px;
  border: 1px solid #000;
  text-align: center;
<div class="skill-points"> 1 </div>
<!-- BG color = red -->
<div class="skill-points"> 2 </div>
<!-- BG color = green -->
<div class="skill-points"> 3 </div>
<!-- BG color = yellow -->

2) 你也可以在这里使用Map

const allSkillPoints = document.querySelectorAll(".skill-points");

const map = new Map()
map.set(1, "red")
  .set(2, "green")
  .set(3, "yellow");

allSkillPoints.forEach(el => 
  const text = +el.textContent.trim();
  el.style.backgroundColor = map.has(text) ? map.get(text) : "white";
)
.skill-points 
  width: 50px;
  padding: 4px;
  margin: 4px;
  border: 1px solid #000;
  text-align: center;
<div class="skill-points"> 1 </div>
<!-- BG color = red -->
<div class="skill-points"> 2 </div>
<!-- BG color = green -->
<div class="skill-points"> 3 </div>
<!-- BG color = yellow -->

【讨论】:

您无需将NodeList 转换为数组即可调用forEach @Unmitigated 是的,谢谢。

以上是关于如果类包含值,则更改背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何使用从wpf中的数据库中获取的值更改datagrid行背景颜色

iOS:如果背景图像与按钮颜色相同,则更改我的 UIButton 的颜色

访问:检查文本框是不是为空,如果是则更改文本框背景颜色

单击android时更改TextView背景颜色

Swift - 在 tableView.selectRow 中更改背景颜色

SwiftUI 多行文本背景颜色