Соответствие пустому полю ввода с помощью CSS

151

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

input[value=""]
Sjoerd
источник

Ответы:

163

Если бы только поле, 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)

Лукмдо
источник
14
..или отрицать, используя: invalid {} developer.mozilla.org/en-US/docs/Web/CSS/…
SamGoody
6
Я хочу то же самое, но мое поле не обязательно. есть ли способ сделать это?
Захидул Ислам Рухель
1
Это великолепно :)
kriskodzi
@ZahidulIslamRuhel, конечно, этот ответ не должен быть первым. см. ответ ниже stackoverflow.com/a/35593489/11293716
sijanec
158

В современных браузерах вы можете использовать :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/

Беренд
источник
4
Это великолепно! Очень полезно :)
unbreak
1
@TricksfortheWeb Похоже, что во входном теге должен присутствовать атрибут-заполнитель (со значением). Протестировано в Chrome - не уверен, что это учитывается для всех браузеров.
Беренд
10
Атрибут заполнителя должен быть установлен. В любом случае мы можем установить атрибут заполнителя как пробел.
Петр Козловский
2
@Amanpreet Согласно caniuse.com/#search=placeholder , это не будет работать в IE 11 (или Edge).
Тим Мэлоун
4
Совсем не поддерживается в браузерах Microsoft: caniuse.com/#feat=css-placeholder-shown
Lounge9,
45

В CSS нет селектора, который бы это делал. Селекторы атрибутов соответствуют значениям атрибутов, а не вычисленным значениям.

Вам придется использовать JavaScript.

Квентин
источник
3
Для тех, кто позже найдет этот ответ: Квентин прав в отношении вычисленных значений, однако есть селектор: empty, который можно использовать здесь и имеет разумную поддержку (все браузеры, кроме IE8 и старше, согласно: w3schools.com/cssref/sel_empty.asp
Cohen
36
:emptyселектор работает только с пустыми элементами, то есть только с элементами, имеющими открывающий и закрывающий теги, пустые между ними, и элементы с одним тегом, которые считаются всегда пустыми, например , поэтому его нельзя использовать для входных элементов, кромеtextarea
am05mhz
7
Не правда. См. Ответ lukmo ниже. Комбинируя требуемый атрибут sttribute и псевдоселекторы: valid или: invalid, можно добиться именно этого.
voidstate
2
Это был правильный ответ на тот момент, когда был задан вопрос. Обязательный атрибут был доступен только в Chrome и Firefox в 2011 году, и этот ответ относится к 2010 году. Однако времена изменились, и это уже не «лучший» ответ, поэтому я снял с него отметку как принятый.
Сьерд
18

Обновление значения поля не приводит к обновлению его атрибута значения в 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">

Лохматый
источник
16

input[value=""], input:not([value])

работает с:

<input type="text" />
<input type="text" value="" />

Но стиль не изменится, как только кто-то начнет печатать (для этого нужен JS).

Драко Атер
источник
1
Ненадежно, поскольку атрибут значения не изменяется в DOM после редактирования поля. Тем не менее, хороший трюк, если вас это не волнует - он работает в последних версиях Safari, Chrome, FF и IE ...
Дунк,
9
Чтобы соответствовать первому, вы можете использовать input[value=""], input:not([value]).
Schism
10

Если поддерживающие устаревшие браузеры не требуется, вы можете использовать комбинацию 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/

Мой стек переполняется
источник
7
$('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; }
Исраэль Моралес
источник
7

Это сработало для меня:

Для HTML добавьте requiredатрибут к элементу ввода

<input class="my-input-element" type="text" placeholder="" required />

Для CSS используйте :invalidселектор, чтобы указать пустой ввод

input.my-input-element:invalid {

}

Примечания:

  • О requiredс w3Schools.com : «Когда присутствует, он указывает , что поле ввода необходимо заполнить перед отправкой формы»
Ариэлла
источник
5

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

Проблема заключалась в том, что я должен был применить тот же 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){
    ....
}
Джессика
источник
3

Этот вопрос мог быть задан некоторое время назад, но поскольку я недавно затронул эту тему в поисках проверки формы на стороне клиента, и поскольку :placeholder-shown поддержка улучшается, я подумал, что следующее может помочь другим.

Используя идею Беренда об использовании этого псевдокласса CSS4, я смог создать проверку формы, запускаемую только после того, как пользователь завершит ее заполнение.

Вот пример и объяснение по CodePen: https://codepen.io/johanmouchet/pen/PKNxKQ

Йохан М.
источник
3

У меня сработало добавить имя класса к входу, а затем применить к нему правила CSS:

<input type="text" name="product" class="product" />

<style>
input[value=""].product {
    display: none;
}
</style>
DeFeNdog
источник
2

Если вы счастливы, что не поддерживаете 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>

Sora2455
источник
0

Меня интересуют ответы, у нас есть атрибут 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;
    }
}
Нассер Хаджлоо
источник
7
:emptyприменяется только к элементам, у которых нет дочерних элементов. У входов вообще не может быть дочерних узлов, поэтому ваш ввод всегда будет с красной рамкой. Также смотрите этот комментарий
Жеган
2
@NasserHadjloo вы это тестировали? Изменение valueне меняет количество дочерних узлов.
jcuenod
@jcuenod, что вы имеете в виду под количеством дочерних узлов? Я не
понял
В структурах xml узлы вложены (т.е. <parent><child></child></parent>). У вас просто есть, <input></input>и по мере того, как вы вводите, что меняется не <value>узел внутри, <input>а атрибут значения :<input value='stuff you type'></input>
jcuenod
2
Но OP пытается добиться не этого.
jcuenod