Как сделать шкалу?
Допустим, у меня есть
<style type="text/css">
.bar{
border: solid yellow;
display:inline-block;
cursor: pointer;
}
.selected {
background: SteelBlue;
}
.cell{
border: solid blue 2px;
display:inline-block;
width:14px;
height:12px;
background: PaleTurquoise;
}
</style>
<div class = "bar">
<div class = "cell" data-val = "1"></div>
<div class = "cell" data-val = "2"></div>
<div class = "cell" data-val = "3"></div>
<div class = "cell" data-val = "4"></div>
<div class = "cell" data-val = "5"></div>
<div class = "cell" data-val = "6"></div>
</div>
bar - это горизонтальный блок, контейнер шкалы, а cell'ы - значения шкалы Помогите пожалуйста оживить все енто дело так, чтобы: - при клике на один cell , он и все cell'ы до него подсвечивались, т.е. приобретали класс selected - при клике на посвеченный cell, он затухал (selected пропадал), В общем, типичное поведение шкалы:) . Только просьба , без Jquery и попроще , если можно (Рони :D ) |
звёздный рейтинг на js
Ramundo,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script>
window.addEventListener("DOMContentLoaded", function() {
[].forEach.call(document.querySelectorAll(".bar"), function(el) {
var cell = el.querySelector(".cell");
el.addEventListener("click", function(event) {
var elem = event.target,
cls = elem.classList;
if (cls.contains("cell")) {
elem == cell ? (cell.classList.toggle("selected"), el.classList.toggle("act")) :
(cell.classList.remove("selected"), el.classList.add("act"),
elem.classList.add("selected"), cell = elem);
}
});
});
});
</script>
</head>
<body>
<style type="text/css">
.bar{
border: solid yellow;
display:inline-block;
cursor: pointer;
}
.bar.act .cell {
background-color: SteelBlue;
}
.bar.act .cell.selected ~ .cell{
background-color: PaleTurquoise;
}
.cell{
border: solid blue 2px;
display:inline-block;
width:14px;
height:12px;
background-color: PaleTurquoise;
}
</style>
<div class = "bar">
<div class = "cell" data-val = "1"></div>
<div class = "cell" data-val = "2"></div>
<div class = "cell" data-val = "3"></div>
<div class = "cell" data-val = "4"></div>
<div class = "cell" data-val = "5"></div>
<div class = "cell" data-val = "6"></div>
</div>
<div class = "bar">
<div class = "cell" data-val = "1"></div>
<div class = "cell" data-val = "2"></div>
<div class = "cell" data-val = "3"></div>
<div class = "cell" data-val = "4"></div>
<div class = "cell" data-val = "5"></div>
<div class = "cell" data-val = "6"></div>
</div>
</body>
</html>
|
Спасибо огромное! Все супер, ты мастер!
только я забыл указать, что при клике на последнее подсвеченное значение не должны затухать все остальные подсвеченные, а только это самое последнее |
Ramundo,
а что делать если нажали не на последний? |
Пардон
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
.bar{
border: solid yellow;
display:inline-block;
cursor: pointer;
}
.cell{
border: solid blue 2px;
display:inline-block;
width:14px;
height:12px;
background: PaleTurquoise;
}
.selected {
background: SteelBlue;
}
</style>
</head>
<body>
<div class = "bar">
<div class = "cell " data-val = "1"></div>
<div class = "cell" data-val = "2"></div>
<div class = "cell" data-val = "3"></div>
<div class = "cell" data-val = "4"></div>
<div class = "cell" data-val = "5"></div>
<div class = "cell" data-val = "6"></div>
</div>
<script>
var cell = document.querySelectorAll('.cell'), n = 0;
cell.forEach(function(el, s){
el.onclick = function(e) {
cell.forEach(function(el, i) {
if(i<s) el.classList.add('selected');
if(i>s) el.classList.remove('selected');
if(i==s && n==s|| i==s && !el.matches('.selected')) el.classList.toggle('selected');
});
n=s;
};
});
</script>
</body>
</html>
|
Для разнообразия
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
.bar{
border: solid yellow;
display:inline-block;
cursor: pointer;
}
.cell{
border: solid blue 2px;
display:inline-block;
width:14px;
height:12px;
background: PaleTurquoise;
}
.selected {
background: SteelBlue;
}
</style>
</head>
<body>
<div class = "bar">
<div class = "cell " data-val = "1"></div>
<div class = "cell" data-val = "2"></div>
<div class = "cell" data-val = "3"></div>
<div class = "cell" data-val = "4"></div>
<div class = "cell" data-val = "5"></div>
<div class = "cell" data-val = "6"></div>
</div><br>
<input type="range" min = "-1" max = "5" value = "-1">
<script>
var evnt = ((navigator.userAgent.search(/MSIE/) > -1) ||(navigator.userAgent.search(/Trident/) > -1)) ? "change":"input";
var cell = document.querySelectorAll('.cell'),
set = document.querySelector('[type="range"') ;
set.addEventListener(evnt, function() {
var s = +this.value;
[].forEach.call(cell, function(el, i) {
if(i <= s) el.classList.add('selected');
if(i > s) el.classList.remove('selected');
});
});
</script>
</body>
</html>
|
Dilettante_Pro,
заменить onchange на oninput. |
laimas,
Цитата:
Заменил. Стало веселее.:) НО: в ИЕ onchange работает, как в Хроме oninput, а oninput не хочет работать. Сделал кроссбраузерно. Проверил в ИЕ11, Хроме, ФФ, Опера |
| Часовой пояс GMT +3, время: 19:35. |