我正在网站上创建膳食定制功能,客户可以选择各种不同的食材来配置他们的膳食。我的后端工作完美,但前端遇到了一些问题。
我使用了各种 ID、类和函数来创建悬停叠加层,然后在单击(选择)食物图像时在它们周围应用边框,但这是一个相当长的方法。它有效,但由于成分比这多得多(另外 30 种),我有点担心函数会变得太长。
HTML
<img id="food" onclick="select()" src="https://website.com/uploads/2020/03/Curried-Chicken-Breast-1-scaled.jpg" style="width:250px;">
<img id="food1" onclick="select1()" src="https://website.com/uploads/2020/03/Curried-Chicken-Breast-1-scaled.jpg" style="width:250px;">
CSS:
#food:hover, #food1:hover, #food2:hover, #food3:hover, #food4:hover, #food5:hover, #food6:hover, #food7:hover{
filter: brightness(75%); !important;
}
.selected {
border: 3px solid #186472 !important;
}
JavaScript
<script>
function select(){
document.getElementById("food").classList.add('selected');
document.getElementById("food1").classList.remove('selected');
document.getElementById("food2").classList.remove('selected');
document.getElementById("food3").classList.remove('selected');
document.getElementById("food4").classList.remove('selected');
document.getElementById("food5").classList.remove('selected');
document.getElementById("food6").classList.remove('selected');
document.getElementById("food7").classList.remove('selected');
}
function select1(){
document.getElementById("food").classList.remove('selected');
document.getElementById("food1").classList.add('selected');
document.getElementById("food2").classList.remove('selected');
document.getElementById("food3").classList.remove('selected');
document.getElementById("food4").classList.remove('selected');
document.getElementById("food5").classList.remove('selected');
document.getElementById("food6").classList.remove('selected');
document.getElementById("food7").classList.remove('selected');
}
function select2(){
document.getElementById("food").classList.remove('selected');
document.getElementById("food1").classList.remove('selected');
document.getElementById("food2").classList.add('selected');
document.getElementById("food3").classList.remove('selected');
document.getElementById("food4").classList.remove('selected');
document.getElementById("food5").classList.remove('selected');
document.getElementById("food6").classList.remove('selected');
document.getElementById("food7").classList.remove('selected');
}
function select3(){
document.getElementById("food").classList.remove('selected');
document.getElementById("food1").classList.remove('selected');
document.getElementById("food2").classList.remove('selected');
document.getElementById("food3").classList.add('selected');
document.getElementById("food4").classList.remove('selected');
document.getElementById("food5").classList.remove('selected');
document.getElementById("food6").classList.remove('selected');
document.getElementById("food7").classList.remove('selected');
}
function select4(){
document.getElementById("food").classList.remove('selected');
document.getElementById("food1").classList.remove('selected');
document.getElementById("food2").classList.remove('selected');
document.getElementById("food3").classList.remove('selected');
document.getElementById("food4").classList.add('selected');
document.getElementById("food5").classList.remove('selected');
document.getElementById("food6").classList.remove('selected');
document.getElementById("food7").classList.remove('selected');
}
function select5(){
document.getElementById("food").classList.remove('selected');
document.getElementById("food1").classList.remove('selected');
document.getElementById("food2").classList.remove('selected');
document.getElementById("food3").classList.remove('selected');
document.getElementById("food4").classList.remove('selected');
document.getElementById("food5").classList.add('selected');
document.getElementById("food6").classList.remove('selected');
document.getElementById("food7").classList.remove('selected');
}
function select6(){
document.getElementById("food").classList.remove('selected');
document.getElementById("food1").classList.remove('selected');
document.getElementById("food2").classList.remove('selected');
document.getElementById("food3").classList.remove('selected');
document.getElementById("food4").classList.remove('selected');
document.getElementById("food5").classList.remove('selected');
document.getElementById("food6").classList.add('selected');
document.getElementById("food7").classList.remove('selected');
}
function select7(){
document.getElementById("food").classList.remove('selected');
document.getElementById("food1").classList.remove('selected');
document.getElementById("food2").classList.remove('selected');
document.getElementById("food3").classList.remove('selected');
document.getElementById("food4").classList.remove('selected');
document.getElementById("food5").classList.remove('selected');
document.getElementById("food6").classList.remove('selected');
document.getElementById("food7").classList.add('selected');
}
</script>
最佳答案
如果您要求用户从一系列内容中选择元素,您应该考虑使用单选按钮。从代码的 Angular 来看,使用单选按钮将使事情变得更容易,因为无需使用 JavaScript 设置选定状态,并且用户将更容易访问。
这是一种不需要 JavaScript 的方法,利用 :checked
CSS pseudo-class和 CSS adjacent sibling combinator (+
)为选中的食品添加红色边框。
.food {
display: inline-block;
}
.food input {
visibility: hidden;
}
.food img {
border: 5px solid white;
}
.food input:checked + label img {
border: 5px solid red;
}
.food input:not(:checked) + label {
cursor: pointer;
}
.food input:not(:checked) + label:hover img {
opacity: 0.75;
}
<div class="food">
<input type="radio" id="food1" name="food" value="food1" />
<label for="food1"><img alt="food1" src="https://placehold.it/100/100/?text=food1"/></label>
</div>
<div class="food">
<input type="radio" id="food2" name="food" value="food2" />
<label for="food2"><img alt="food2" src="https://placehold.it/100/100/?text=food2"/></label>
</div>
<div class="food">
<input type="radio" id="food3" name="food" value="food3" />
<label for="food3"><img alt="food3" src="https://placehold.it/100/100/?text=food3"/></label>
</div>
关于javascript - 有没有比这更优化的方法来使用 javascript 更改多个类和 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60529324/