CSS Selector для выбора элемента, который приходит перед другим элементом?

Я работаю над страницей входа для своего веб-сайта, и я хочу смело выделить ярлык, который приходит до, когда поле ввода получает фокус. Сейчас у меня есть следующая разметка:

<label for="username">Username:</label>
<input type="textbox" id="username" />

<label for="password">Password:</label>
<input type="textbox" id="password" />

Я могу использовать соседний селектор, чтобы выбрать ярлык после текстового поля, но я не могу выбрать элемент перед ним. Я могу использовать это правило выбора CSS, но он выбирает только метку после этого, поэтому, когда текстовое поле имени пользователя получает фокус, метка пароля становится жирным.

input:focus + label {font-weight: bold}

Есть ли что-нибудь, что я могу сделать, чтобы сделать эту работу? Я знаю, что JavaScript может быть использован для этого, но я бы хотел использовать чисто CSS-решение, если это возможно, я просто не могу понять, как это сделать.

Ответ 1

Можно было бы использовать "соседний селектор", если input был до label. Просто поставьте input перед label, а затем измените макет, чтобы поставить label до input. Вот пример:

<head runat="server">
    <title></title>
    <style type="text/css">
    input:focus + label {font-weight: bold}
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div style="direction:rtl">
        <input type="text" id="username" />
        <label for="username">Username:</label>
    </div>
    <div style="direction:rtl">
        <input type="password" id="password" />
        <label for="password">Password:</label>
    </div>
    </form>
</body>

(Это своего рода хак, я лично использовал бы javascript для этого)

input:focus + label {font-weight: bold}
<form id="form1" runat="server">
  <div style="direction:rtl">
    <input type="text" id="username" />
    <label for="username">Username:</label>
  </div>
  <div style="direction:rtl">
    <input type="password" id="password" />
    <label for="password">Password:</label>
  </div>
</form>

Ответ 2

CSS Selectors 4 Spec предоставляет синтаксис для определения "субъекта" селектора с помощью !. По состоянию на начало 2016 года это не доступно ни в одном браузере. Я включаю это, потому что это будет правильный способ сделать это, используя чистый CSS, когда браузеры реализуют этот синтаксис.

Учитывая разметку в вопросе

<label for="username">Username:</label>
<input type="textbox" id="username" />

<label for="password">Password:</label>
<input type="textbox" id="password" />

Этот CSS сделал бы трюк.

label:has(+ input:focus) {font-weight: bold}

Конечно, это предполагает, что браузеры фактически реализуют селектор объектов и что нет ошибок, связанных с тем, как этот синтаксис работает с псевдо-классом :focus.

Ответ 3

Нет селектора, который предоставит вам предыдущий элемент с помощью CSS..

Вам нужно будет использовать javascript для обработки того, что вам нужно.

Ответ 4

Используйте этот селектор:

label[for=username]
{
font-weight: bold
}

это выберет метку, которая имеет значение "имя пользователя" в атрибуте "для"

Ответ 5

Плавающий входной элемент вправо, обеспечивает правильный порядок элементов без изменения порядка "Username" и ":" в тексте метки, который вы получаете с направлением: rtl.

<style type="text/css">
    form {text-align: right;}
    input:focus + label {font-weight: bold}
    input {float:right; clear:right;}
</style>
<form>
    <div>
        <input type="text" id="username" />
        <label for="username">Username:</label>
    </div>
    <div>
        <input type="password" id="password" />
        <label for="password">Password:</label>
    </div>
</form>

Ответ 6

Я нашел это в w3cschol

p~ul Выбирает каждый элемент <ul>, которому предшествует элемент <p>

Но мой тест не удался. Я не мог заставить его работать. может быть, он не реализован браузерами.