Можно ли одним щелчком переключаться на два псевдокома CSS `: checked`?
Обратите внимание, что Я знаю об этом вопросе, но я ищу конкретный технический ответ.
Как вызов CSS для себя, я пытаюсь создать фэнтезийную коробку select
, используя только CSS. Используя различные причудливые методы, которые Я узнал недавно, я получил довольно далеко.
Codepen Here
- Он выглядит хорошо
- Полностью стиль,
- Он открывается в списке на клике (с помощью скрытого флажка и селектора
:checked+label
)
- Позволяет текст заполнителя (используя
:checked
и отрицательный край верхнего уровня)
- Позволяет выбирать (используя список вложенных переключателей)
- И отображает значение правильно при выборе и свертывании (используя
:checked
и position: absolute
)
- Он даже привяжет javascript правильно
Это использует структуру, похожую на
input[type=checkbox]#selector
label[for=selector]
ul
li.item1
input[type=radio]#item1
label[for=item1] The First Item
У меня осталось только одна проблема, после расширения, закрытие меню при нажатии не работает должным образом. При нажатии на элемент нормальный selectbox будет закрыт. Мой не будет, пока вы не нажмете рядом с границей выбора.
![Closed CSSelectbox]()
![Open CSSelectoox]()
Это потому, что пользователь нажимает на внутренний вход, который не будет переключать состояние :checked
родительского ярлыка, им нужно щелкнуть по нему, чтобы закрыть selectbox.
Можно ли каким-либо образом одновременно переключать состояние переключателя и родительское состояние?
Ответы
Ответ 1
Возможно, вы можете немного скомпрометировать это.
Почему бы просто не поменять флажок .country-selector
на переключатель в той же группе? Тогда у него есть именно то поведение, которое вы ищете, не создавая ситуации, требующей много обходного пути. Единственная проблема заключалась в том, чтобы предоставить пустое значение, если пользователь должен был отправить, пока ящик все еще открыт, но в любом случае проблема с вашей существующей реализацией.
Jade
input#country-selector(type='radio', name="country")
SCSS
&>[type=checkbox]
становится
&>[type=radio]
Я сделал несколько изменений стиля для пера, чтобы привести его в ряд с более традиционными выпадающими меню.
Очень интересная идея. Престижность в этом.
Ответ 2
изменить
Internet explorer будет обрабатывать прозрачный элемент, например event-pointer: none; там для одного нужно добавить фона-цвета + непрозрачность: 0. По крайней мере, сейчас можно открыть его в Internet Explorer: http://codepen.io/anon/pen/EargxL
изменить 2
Наконец-то я нашел способ поддержать интернет-проводник, он выглядит немного дрянным, я реорганизую его еще на один день: p http://codepen.io/anon/pen/ogmqpq
обратите внимание, что он не будет работать на большинстве мобильных устройств, поскольку не реализует: активный псевдоселектор: http://www.quirksmode.org/css/selectors/mobile.html#link5
оригинальный
Короче говоря, почти невозможно вызвать два переключателя проверенным селектором на разных входах одним щелчком.
Как можно было бы использовать псевдоселектор: focus в комбинации с: active.
<div class="dropDown">
<div class="toggle" tabindex="0"></div>
<ul class="list" tabindex="0">
<li>
<label>
<input type="radio" name="myDropDown" value="someValue" checked="checked"/>
<span>Item 1</span>
</label>
</li>
<li>
<label>
<input type="radio" name="myDropDown" value="someValue"/>
<span>Item 2</span>
</label>
</li>
<li>
<label>
<input type="radio" name="myDropDown" value="someValue"/>
<span>Item 3</span>
</label>
</li>
</ul>
</div>
CSS
ul {
list-style:none;
}
input {
display:none;
}
.dropDown {
position:relative;
}
.dropDown .toggle {
position:absolute;
width:100%;
height:100%;
z-index:1;
outline:none;
}
.dropDown > .toggle:focus {
z-index:0;
}
.dropDown > .list {
position:relative;
outline:none;
}
.dropDown > .list:active {
z-index:1;
}
.dropDown > .toggle:not(:focus) + .list:not(:active) input:not(:checked) + span {
display:none;
}
живой пример http://codepen.io/anon/pen/emxJWr
Примечание:
это не будет работать в Internet Explorer, потому что: активный не пузырится, im открыт для любых предложений!
Ответ 3
только для любопытства pointer-events
: doubleclick на input:checked + label
позволит вам закрыть свой любимый селектор: http://codepen.io/gc-nomade/pen/NPJaNa
.options {
&>li{
&:hover {
background-color: blue;
}
input[name=country]:checked+label {
position: static;
pointer-events:none;}
}
}
Ответ 4
Изменение z-индекса позволит пользователю щелкнуть по области меток, которая переключит ваше падение.
Смотрите мой обновленный код: codepen ex
.country-selector {
display: inline-block;
border: 1px solid black;
position: relative;
overflow: hidden;
&:before {
content: "▾";
position: absolute;
right: 5px;
top: 5px;
z-index:-1;
}
Изменено поле .country-selector.options и снято с .country-selector padding-right.
Затем изменился .country-selector: before до z-index -1.
Не уверен, что это будет работать во всех браузерах/устройствах, но, похоже, работает на FF и chrome (OS x).
Надеюсь, что это поможет:)
Ответ 5
Существует ошибка проверки, которая предотвращает ее правильную работу:
Метка элемента не должна отображаться как потомок элемента метки.
Если вы помещаете пробелы вместо внутренних меток, все работает нормально.
У вас также есть несколько полей ввода внутри родительской метки, но для этого требуется большее исправление, так как вам нужно установить флажок country-selector
.
Рабочая ручка.