Как сделать так, чтобы при наведении курсора на класс вызывались изменения в других классах?

Я хочу создать чистую систему звездного рейтинга css [без jquery]. Итак, у меня есть html-форма с 5 переключателями. До сих пор я мог сделать, когда я наводил/нажимал на радиокнопку со звездочкой, чтобы изменить собственное фоновое изображение. Это работает для каждой звезды, НО отдельно. Когда нажимаю на пятую звезду - меняется только пятая звезда. Когда нажимаю на четвертую звезду - меняется только четвертая звезда и так далее. Я хочу сделать это, когда я навожу/нажимаю на пятую звезду -> все звезды, чтобы изменить их фоновое изображение. Когда я нажимаю на вторую звезду, первые две звезды меняются и т. Д., Чтобы пользователь мог видеть, за сколько звезд он голосует. (вы видели эти рейтинговые системы по всему Интернету)

Хочу сделать вот так (опять же только css):

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

Но заканчиваю так:

введите здесь описание изображения

Итак, у меня есть 5 звезд/радиовходов, и каждый из них относится к классу:

1 звезда -> радиоStarButton1

2 звезды -> радиоStarButton2

3 звезды -> радиоStarButton3

4 звезды -> радиоStarButton4

5 звезд -> радиоStarButton5

           <input type="radio" name="stars" id="'.'2stars-for-id-'.$row['id'].'" class="radioStarButton2" value="2" />
           <label for="'.'2stars-for-id-'.$row['id'].'"></label>

           <input type="radio" name="stars" id="'.'3stars-for-id-'.$row['id'].'" class="radioStarButton3" value="3" checked />
           <label for="'.'3stars-for-id-'.$row['id'].'"></label>

           <input type="radio" name="stars" id="'.'4stars-for-id-'.$row['id'].'" class="radioStarButton4" value="4" />
           <label for="'.'4stars-for-id-'.$row['id'].'"></label>

           <input type="radio" name="stars" id="'.'5stars-for-id-'.$row['id'].'" class="radioStarButton5" value="5" />
           <label for="'.'5stars-for-id-'.$row['id'].'"></label>

Я хочу, чтобы при наведении/нажатии на второй класс .radioStarButton2 также менялся первый класс -> .radioStarButton1, и ЭТО проблема - изменить более одного элемента класса, ЕСЛИ это возможно.

Также css: это работает css:

input[type="radio"]{
display:none;
}

input[type="radio"] + label
{
    background-image: url("uncheckedstar.png");
    height: 23px;
    width: 23px;
    display:inline-block;
    padding: 0 0 0 0px;
}

.radioStarButton1:hover + label
{
    background-image: url("star.png");
    height: 23px;
    width: 23px;
    display:inline-block;
    padding: 0 0 0 0px;
}
.radioStarButton1:checked + label
{
    background-image: url("star.png");
    height: 23px;
    width: 23px;
    display:inline-block;
    padding: 0 0 0 0px;
}

Следующий код явно неверен, но я не знаю, как это сделать. Я загружаю его только для идеи, что я пытаюсь сделать:

.radioStarButton2:hover + label , .radioStarButton1
{

    background-image: url("star.png");
    height: 23px;
    width: 23px;
    display:inline-block;
    padding: 0 0 0 0px;
}
.radioStarButton2:checked + label , .radioStarButton1
{
    background-image: url("star.png");
    height: 23px;
    width: 23px;
    display:inline-block;
    padding: 0 0 0 0px;
}

.radioStarButton3:hover + label , .radioStarButton1 , .radioStarButton2
{

    background-image: url("star.png");
    height: 23px;
    width: 23px;
    display:inline-block;
    padding: 0 0 0 0px;
}
.radioStarButton3:checked + label , .radioStarButton1 , .radioStarButton2
{
    background-image: url("star.png");
    height: 23px;
    width: 23px;
    display:inline-block;
    padding: 0 0 0 0px;
}

person Combine    schedule 28.02.2014    source источник
comment
Вам придется обрабатывать это с помощью javascript. В основном, используя javascript, проверьте, какая радиокнопка нажата/нажата, и добавьте класс к необходимым элементам для изменения фона.   -  person Nilesh    schedule 28.02.2014


Ответы (4)


Расширение решения Коэна... и остается после щелчка... вам нужно изменить положение/стилизовать метки (и добавить свои звезды), скрыть входные данные, но это только CSS

Демонстрация: http://jsfiddle.net/f82Fg/2/

HTML

<div class="butts">
    <input id="r5" type="radio" class="butt" value="5" />
    <label for="r5">5</label>
    <input id="r4" type="radio" class="butt" value="4" />
    <label for="r4">4</label>
    <input id="r3" type="radio" class="butt" value="3" />
    <label for="r3">3</label>
    <input id="r2" type="radio" class="butt" value="2" />
    <label for="r2">2</label>
    <input id="r1" type="radio" class="butt" value="1" />
    <label for="r1">1</label>
</div>

CSS

.butts {
    float: left;
}
.butt {
    display: block;
    float: right;    
    width: 16px;
    height: 16px;
}
.butt:hover,
.butt:hover ~ .butt,
.butt:hover ~ label {
    background-color: blue;
}
.butt:checked,
.butt:checked ~ .butt,
.butt:checked ~ label {
    background-color: red;
}
person Ason    schedule 28.02.2014
comment
Это здорово, но как я могу изменить выбор звезд. В этом примере все отлично работает в моем случае, но в обратном выделении. Любые идеи ? - person Combine; 01.03.2014
comment
Мне удалось обратить их вспять с помощью приведенного выше решения - правильно их разместить. Привет и спасибо за помощь - person Combine; 01.03.2014

Если вы разместите элементы HTML в обратном порядке, вы можете использовать селектор уровня CSS (~), чтобы выбрать предшествующие звездочки.

HTML:

<div class="stars">
    <span class="star">5</span>
    <span class="star">4</span>
    <span class="star">3</span>
    <span class="star">2</span>
    <span class="star">1</span>
</div>

CSS:

.stars {
    float: left;
}

.star {
    display: block;
    float: right;

    width: 20px;
    height: 20px;
    margin: 5px;


    background: grey;
}

.star:hover,
.star:hover ~ .star {
    background: yellow;
}

http://jsfiddle.net/gfHX4/

person Koen    schedule 28.02.2014
comment
Спасибо! Ваш пример в сочетании с приведенными ниже примерами сработал! :) - person Combine; 01.03.2014

Вы можете выбрать только «вправо» или «вниз» с помощью CSS, а не «влево» или «вверх» — это означает, что возможен выбор элементов-потомков и братьев и сестер на том же уровне после элемента в DOM; выбор предков или предыдущих братьев и сестер не является.

Итак, что вы могли бы сделать, чтобы звезда до и включая ту, на которую наведен курсор, изменила цвет, это изменить цвет всех из них, когда элемент контейнера зависает, а затем сделать так, чтобы звезды шли после зависания. один снова станет серым, используя селектор ~.

Нет, для «активного» состояния/состояния с проверкой радиокнопки нет простого способа сделать это — вы можете попробовать использовать селектор :target, но для этого потребуется вложить весь материал в пару элементов с разными идентификаторами. , и он снова потеряет состояние, как только на странице будет использован какой-либо другой хэш-якорь.

Чтобы на самом деле добиться такого рода вещей, вам придется изменить порядок звездочек, чтобы первая отображаемая была последней из них в порядке DOM и т. д. — например, путем их плавания. вправо внутри элемента-контейнера или с помощью direction.

Таким образом, когда проверяется последний элемент, только этот элемент получает оранжевый цвет, и только первый в видимом порядке будет оранжевым.
Проверяется предпоследний элемент, вы форматируете предпоследний и последний (опять же с использованием ~) — и из-за обратного порядка отображения первые звезды в видимом порядке будут оранжевыми — и т. д.

Единственной оставшейся проблемой будет объединение этих двух подходов — не совсем уверен, что это можно сделать легко.

Редактировать: ОК, после просмотра ответа Коэна это должно быть довольно легко, если вы используете трюк с обратным порядком для состояний :hover и :checked.

person CBroe    schedule 28.02.2014
comment
Не знаю, мне нравится трюк с выделением более поздних, не нарушая порядок семантической разметки. - person Phrogz; 28.02.2014
comment
Да, но это будет работать только для наведенного состояния, а не для звезды, выбранной с помощью переключателя и использования :checked для форматирования — потому что это не влияет на элемент-контейнер, поэтому невозможно отформатировать «все, что до и включая проверенный». Использование обратного порядка заставит как наведение, так и проверку работать с селектором ~, чтобы «активный» и его «предыдущие» форматировались вместе. - person CBroe; 28.02.2014
comment
И я думаю, что семантика здесь не такая уж большая проблема — просите ли вы пользователя оценить что-то по шкале от 1 до 5 или от 5 до 1 (что получат пользователи без CSS и, скорее всего, те, кто использует программы чтения с экрана), не имеет значения. на самом деле не имеет значения, пока им говорят, что 5 означает «лучший», а 1 означает «худший». - person CBroe; 28.02.2014
comment
Чтобы на самом деле добиться такого рода вещей, вам придется изменить порядок звезд, чтобы первая отображаемая звезда была последней из них в порядке DOM и т. д. — например, перемещая их вправо в своем элементе-контейнере. или с помощью направления. -› Плавающий правый - это помогло! Это была последняя часть этой головоломки. Спасибо! - person Combine; 01.03.2014

Вы можете поместить каждый label во вложенный список и применить состояние наведения для включения дочерних элементов, как если бы вы использовали раскрывающуюся навигацию.

Тем не менее, вам все равно потребуется некоторый сценарий, чтобы пометить любые поля звезды input более низкого уровня как выбранные, как только пользователь все равно нажмет звезду более высокого уровня. В противном случае, когда они уберут мышь, эффект наведения исчезнет, ​​и у вас все равно будет та же проблема, что только одна звезда отображается как выделенная.

person Kevin Vess    schedule 28.02.2014