Я пытаюсь сделать поле выбора, записи которого открываются после щелчка в поле ввода. После выбора одного из пунктов, раскрывающийся список должен быть снова закрыт.
Я хочу, чтобы открыть / закрыть часть раскрывающегося списка без использования JavaScript.
HTML выглядит так:
<div id="outer">
<input type="text" id="input">
<div id="results">
<div>Test 1 </div>
<div>Test 2 </div>
<div>Test 3 </div>
<div>Test 4 </div>
</div>
</div>
<div id="label">
</div>
После нажатия на элемент, выбранное значение должно появиться ниже #outer
div (только для демонстрационных целей).
Javascript для назначения событий щелчка выпадающим значениям:
document.querySelectorAll("#results div").forEach(setClick);
function setClick(node) {
node.addEventListener("click", setText.bind(null, node.innerHTML))
}
function setText(t) {
document.getElementById("label").innerHTML = t;
}
Теперь я покажу вам мой первый набросок кода CSS:
#outer {
width: 200px;
position: relative;
}
#input {
width: 100%;
}
#results {
position: absolute;
width: 100%;
display: block;
visibility: hidden;
background-color: white;
}
#results > div:hover {
background-color: lightblue;
cursor: pointer;
}
#outer:focus-within #results, #results:hover {
visibility: visible;
}
Это работает как заклинание, но не в одной точке:
После нажатия на элемент раскрывающийся список не закрывается. Это связано с селектором #results:hover
, который необходим, чтобы раскрывающийся список оставался открытым после нажатия на элемент. Щелчок убирает фокус из поля ввода, поэтому селектор focus-within
больше не применяется. Поскольку фокус удаляется из поля ввода до того, как происходит щелчок, раскрывающийся список скрывается, когда в документе появляется последний щелчок (это мое понимание проблемы).
Поэтому я использую селектор hover
, который заставляет div оставаться открытым, пока мышь находится над div.
Вы можете проверить это здесь:
https://jsfiddle.net/hcetz1og/3/
Моим решением для этого был переход, который скрывает раскрывающийся список после удаления фокуса:
#outer:not(:focus-within) #results:hover {
visibility: hidden;
transition-property: visibility;
/*use 10 ms and the clicked value in the drop down won't be shown */
transition-delay: 100ms;
transition-timing-function: step-end;
}
Это работает на моей машине, когда я использую 100 мс в качестве задержки. Если я использую 10 мс, у меня снова та же проблема. Похоже, что событие нажатия срабатывает «очень» поздно.
Не стесняйтесь проверить это здесь:
https://jsfiddle.net/hcetz1og/2
Вопрос:
Сколько времени пройдет, пока в документе не появится событие щелчка? Есть ли фиксированный промежуток времени, в течение которого мне приходится ждать или задержка зависит от каждой машины?
Если это так, я вынужден не использовать простой CSS, но для этого я должен использовать javascript.
Редактировать :
Не стесняйтесь опубликовать альтернативное решение, используя простой CSS. Но учтите, что я в основном хочу сосредоточиться на получении ответа на этот вопрос, а не на альтернативных решениях.