Как применить стиль к пустому полю ввода? Если пользователь вводит что-то в поле ввода, стиль больше не применяется. Возможно ли это в CSS? Я пробовал это:
input[value=""]
Ответы:
Если бы только поле, required
вы могли бы пойти сinput:valid
#foo-thing:valid + .msg { visibility: visible!important; }
<input type="text" id="foo-thing" required="required">
<span class="msg" style="visibility: hidden;">Yay not empty</span>
Смотрите в прямом эфире на jsFiddle
ИЛИ отказаться от использования #foo-thing:invalid
(кредит @SamGoody)
В современных браузерах вы можете использовать :placeholder-shown
для таргетинга на пустой ввод (не путать с ::placeholder
).
input:placeholder-shown {
border: 1px solid red; /* Red border only if the input is empty */
}
Дополнительная информация и поддержка браузера: https://css-tricks.com/almanac/selectors/p/placeholder-shown/
В CSS нет селектора, который бы это делал. Селекторы атрибутов соответствуют значениям атрибутов, а не вычисленным значениям.
Вам придется использовать JavaScript.
Обновление значения поля не приводит к обновлению его атрибута значения в DOM, поэтому ваш селектор всегда соответствует полю, даже если оно на самом деле не пусто.
Вместо этого используйте invalid
псевдокласс для достижения желаемого, например:
input:required {
border: 1px solid green;
}
input:required:invalid {
border: 1px solid red;
}
<input required type="text" value="">
<input required type="text" value="Value">
input[value=""], input:not([value])
работает с:
<input type="text" />
<input type="text" value="" />
Но стиль не изменится, как только кто-то начнет печатать (для этого нужен JS).
input[value=""], input:not([value])
.
Если поддерживающие устаревшие браузеры не требуется, вы можете использовать комбинацию required
, valid
и invalid
.
Преимущество этого использования в том, что псевдоэлементы valid
и invalid
хорошо работают с атрибутами типа полей ввода. Например:
input:invalid, textarea:invalid {
box-shadow: 0 0 5px #d45252;
border-color: #b03535
}
input:valid, textarea:valid {
box-shadow: 0 0 5px #5cd053;
border-color: #28921f;
}
<input type="email" name="email" placeholder="john_doe@example.com" required />
<input type="url" name="website" placeholder="http://johndoe.com"/>
<input type="text" name="name" placeholder="John Doe" required/>
Для справки, JSFiddle здесь: http://jsfiddle.net/0sf6m46j/
$('input#edit-keys-1').blur(function(){
tmpval = $(this).val();
if(tmpval == '') {
$(this).addClass('empty');
$(this).removeClass('not-empty');
} else {
$(this).addClass('not-empty');
$(this).removeClass('empty');
}
});
в jQuery. Я добавил класс и стилизовал его с помощью css.
.empty { background:none; }
Это сработало для меня:
Для HTML добавьте required
атрибут к элементу ввода
<input class="my-input-element" type="text" placeholder="" required />
Для CSS используйте :invalid
селектор, чтобы указать пустой ввод
input.my-input-element:invalid {
}
Примечания:
required
с w3Schools.com : «Когда присутствует, он указывает , что поле ввода необходимо заполнить перед отправкой формы»Я понимаю, что это очень старый поток, но с тех пор все немного изменилось, и это помогло мне найти правильную комбинацию вещей, которые мне нужны для решения моей проблемы. Так что я подумал, что поделюсь тем, что сделал.
Проблема заключалась в том, что я должен был применить тот же CSS для необязательного ввода, если он был заполнен, как и для заполненного required. CSS использовал класс psuedo: valid, который применял CSS к необязательному вводу, даже если он не заполнен.
Вот как я это исправил;
HTML
<input type="text" required="required">
<input type="text" placeholder="">
CSS
input:required:valid {
....
}
input:optional::not(:placeholder-shown){
....
}
Этот вопрос мог быть задан некоторое время назад, но поскольку я недавно затронул эту тему в поисках проверки формы на стороне клиента, и поскольку :placeholder-shown
поддержка улучшается, я подумал, что следующее может помочь другим.
Используя идею Беренда об использовании этого псевдокласса CSS4, я смог создать проверку формы, запускаемую только после того, как пользователь завершит ее заполнение.
Вот пример и объяснение по CodePen: https://codepen.io/johanmouchet/pen/PKNxKQ
Если вы счастливы, что не поддерживаете IE или pre-Chromium Edge (что может быть хорошо, если вы используете это для прогрессивного улучшения), вы можете использовать, :placeholder-shown
как сказал Беренд. Обратите внимание, что для Chrome и Safari вам действительно нужен непустой заполнитель, чтобы это работало, хотя пробел работает.
*,
::after,
::before {
box-sizing: border-box;
}
label.floating-label {
display: block;
position: relative;
height: 2.2em;
margin-bottom: 1em;
}
label.floating-label input {
font-size: 1em;
height: 2.2em;
padding-top: 0.7em;
line-height: 1.5;
color: #495057;
background-color: #fff;
background-clip: padding-box;
border: 1px solid #ced4da;
border-radius: 0.25rem;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
label.floating-label input:focus {
color: #495057;
background-color: #fff;
border-color: #80bdff;
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}
label.floating-label input+span {
position: absolute;
top: 0em;
left: 0;
display: block;
width: 100%;
font-size: 0.66em;
line-height: 1.5;
color: #495057;
border: 1px solid transparent;
border-radius: 0.25rem;
transition: font-size 0.1s ease-in-out, top 0.1s ease-in-out;
}
label.floating-label input:placeholder-shown {
padding-top: 0;
font-size: 1em;
}
label.floating-label input:placeholder-shown+span {
top: 0.3em;
font-size: 1em;
}
<fieldset>
<legend>
Floating labels example (no-JS)
</legend>
<label class="floating-label">
<input type="text" placeholder=" ">
<span>Username</span>
</label>
<label class="floating-label">
<input type="Password" placeholder=" ">
<span>Password</span>
</label>
</fieldset>
<p>
Inspired by Bootstrap's <a href="https://getbootstrap.com/docs/4.0/examples/floating-labels/">floating labels</a>.
</p>
Меня интересуют ответы, у нас есть атрибут clear для получения пустых полей ввода, взгляните на этот код
/*empty input*/
input:empty{
border-color: red;
}
/*input with value*/
input:not(:empty){
border-color: black;
}
ОБНОВИТЬ
input, select, textarea {
border-color: @green;
&:empty {
border-color: @red;
}
}
Более того, чтобы отлично посмотреть на валидацию
input, select, textarea {
&[aria-invalid="true"] {
border-color: amber !important;
}
&[aria-invalid="false"], &.valid {
border-color: green !important;
}
}
:empty
применяется только к элементам, у которых нет дочерних элементов. У входов вообще не может быть дочерних узлов, поэтому ваш ввод всегда будет с красной рамкой. Также смотрите этот комментарий
value
не меняет количество дочерних узлов.
<parent><child></child></parent>
). У вас просто есть, <input></input>
и по мере того, как вы вводите, что меняется не <value>
узел внутри, <input>
а атрибут значения :<input value='stuff you type'></input>