Збіг порожнього поля введення за допомогою CSS


141

Як застосувати стиль до порожнього поля введення? Якщо користувач щось вводить у полі введення, стиль більше не повинен застосовуватися. Чи можливо це в CSS? Я спробував це:

input[value=""]

Відповіді:


159

Якби тільки те поле, 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

150

У сучасних браузерах ви можете використовувати :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 - не впевнений, чи враховується це для всіх браузерів.
Беренд

9
Атрибут заповнювача потрібно встановити. У будь-якому випадку ми можемо встановити атрибут заповнювача як пробіл.
Barcelonczyk

2
@Amanpreet За даними caniuse.com/#search=placeholder , це не працюватиме в IE 11 (або Edge).
Тім Малоун

4
Чи не підтримується в Microsoft браузерів на всіх: caniuse.com/#feat=css-placeholder-shown
Lounge9

44

У CSS немає селектора, який би це робив. Селектори атрибутів відповідають значенням атрибутів, а не обчисленим значенням.

Вам доведеться використовувати JavaScript.


3
Якщо хтось знайде цю відповідь пізніше: Квентін має рацію щодо обчислених значень, однак є: порожній селектор, який можна використовувати тут і має розумну підтримку (всі браузери, окрім IE8 і старших відповідно до: w3schools.com/cssref/sel_empty.asp
Cohen

35
:emptyселектор працює лише над порожніми елементами, маючи на увазі лише елементи, у яких тег, який відкриває та закриває, порожній між ними, та одиничні елементи тегу, які вважаються завжди порожніми, наприклад , тому його не можна використовувати для вхідних елементів, крімtextarea
am05mhz

7
Неправда. Відповідь лукмо дивіться нижче. Поєднуючи потрібний атрибут та: дійсний чи: недійсний псевдоселектори, це досягає саме цього.
недійсна

2
Це була правильна відповідь у той момент, коли було поставлено запитання. Необхідний атрибут був доступний лише в Chrome і Firefox у 2011 році, і ця відповідь є з 2010 року. Однак час змінився, і це вже не найкраща відповідь, тому я відзначив його як прийнятий.
Sjoerd

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">


15

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]).
Схизм

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; }

6

Це працювало для мене:

Для HTML додайте requiredатрибут до вхідного елемента

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

Для CSS використовуйте :invalidселектор, щоб націлити порожній вхід

input.my-input-element:invalid {

}

Примітки:

  • Про requiredз w3Schools.com : «Коли присутній, він вказує , що поле введення необхідно заповнити перед відправкою форми»

2

Це питання, можливо, було задано деякий час тому, але, як я нещодавно взяв участь у цій темі, шукаючи перевірку форми на стороні клієнта, і оскільки :placeholder-shown підтримка стає кращою, я подумав, що наступне може допомогти іншим.

Використовуючи ідею Berend про використання цього CSS4 псевдокласу, я зміг створити перевірку форми, що запускається лише після того, як користувач закінчить її заповнювати.

Ось ademo та пояснення на CodePen: https://codepen.io/johanmouchet/pen/PKNxKQ


1

Якщо ви щасливі, що не підтримуєте IE або попередній 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>


1

Мені працювало, щоб додати ім’я класу до вводу та застосувати до цього правила CSS:

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

<style>
input[value=""].product {
    display: none;
}
</style>

0

Мене цікавлять відповіді, у нас є чіткий атрибут, щоб отримати порожні поля для введення, погляньте на цей код

/*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
Але це не те, чого намагається досягти ОП.
jcuenod

0

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

Проблема полягала в тому, що я мав вказати той самий css, який застосовується для необов'язкового введення, якщо він був заповнений, як і для заповненого необхідного. У css використовується клас psuedo: дійсний, який застосував css до необов'язкового вводу також, коли він не заповнений.

Ось як я це виправив;

HTML

<input type="text" required="required">
<input type="text" placeholder="">

CSS

input:required:valid {
    ....
}
input:optional::not(:placeholder-shown){
    ....
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.