-->

Подсказка в поле input или textarea (атрибут placeholder) | HTML примеры

Исчезающая подсказка в input и textarea HTML

Внутри пустого поля ввода input или textarea показывается надпись приглушенного цвета из атрибута placeholder, которая пропадает при вводе первого символа. Она может быть образцом значения или кратким описанием ожидаемого формата. [whatwg.org]

<input placeholder="текст-подсказка">
<textarea placeholder="текст-подсказка"></textarea>

Стремясь уменьшить форму и сократить визуальный шум, дизайнеры тег label заменяют на атрибут placeholder, тем самым увеличивая нагрузку на кратковременную память. Людям с нарушенным зрением подсказку трудно прочитать. Лучше разместить label непосредственно над полем ввода. Пустое поле легче распознаётся как элемент, требующий заполнения. [uxdesign.cc]

Плохо
Хорошо

Стилизация: изменить цвет placeholder CSS

Псевдоэлемент ::placeholder CSS определяет внешний вид подсказки из атрибута placeholder. Список поддерживаемых свойств ограничен тем же списком, что псевдоэлемент ::first-line [csswg.org] и на текущий день не включает плавный переход transition.

<style>
.raz::placeholder {
  color: red;
  opacity: 1; /* сделать обычным неполупрозрачным цветом в Firefox */ 
}
</style>

<input placeholder="текст-подсказка" class="raz">
<textarea placeholder="текст-подсказка" class="raz"></textarea>

Поменять стиль поля ввода с placeholder CSS

Селектор [placeholder] определяет внешний вид элементов, у которых задан атрибут placeholder.

<style>
[placeholder] {
  background: linear-gradient(to right top, bisque 50%, cornsilk 50%);
}
</style>

<input>
<textarea></textarea>
<input placeholder="текст-подсказка">
<textarea placeholder="текст-подсказка"></textarea>

Псевдокласс :placeholder-shown CSS определяет внешний вид поля, пока видна подсказка из атрибута placeholder.

<style>
.raz:placeholder-shown {
  background: linear-gradient(to right top, bisque 50%, cornsilk 50%);
}
</style>

<input placeholder="текст-подсказка" class="raz">
<textarea placeholder="текст-подсказка" class="raz"></textarea>

Подсказка пропадает при получении фокуса <input type="text | password | другие"> и <textarea></textarea>

<style>
.raz:focus::placeholder {
  opacity: 0;
}
</style>

<input placeholder="текст-подсказка" class="raz">
<textarea placeholder="текст-подсказка" class="raz"></textarea>

Обрезать длинный подсказывающий текст и поставить многоточие

<style>
.raz:placeholder-shown {
  text-overflow: ellipsis;
}
</style>

<input placeholder="Обязательно заполняется при наличии" class="raz">
<style>
.raz:placeholder-shown {
  text-overflow: "\01F4E7"; /* свойством text-overflow может быть любой символ, в том числе emoji */ 
}
</style>

<input type="email" class="raz6" placeholder="name@site.ru                        ">

Текст в плейсхолдер должен быть коротким, иначе он не имеет смысла, так как его никто не сможет увидеть.

Сделать смещающиеся или всплывающие метки в веб-форме

<style>
.raz {
  position: relative;
}
.raz input ~ span {
  position: absolute;
  bottom: 0;
  left: 2px;
  opacity: .5;
  transition: .2s;
}
.raz input:focus ~ span,
.raz input:not(:placeholder-shown) ~ span { /* когда будет хорошая поддержка :placeholder-shown браузерами */ 
  bottom: 100%;
  opacity: 1;
  font-size: 80%;
}
</style>

<label class="raz"><input type="email" placeholder="&nbsp;"><span>Email</span></label>

<style>
.raz {
  position: relative;
}
.raz span {
  position: absolute;
  bottom: 50%;
  left: 2px;
  opacity: 0;
  visibility: hidden;
  transition: .3s;
}
.raz input:not(:placeholder-shown) ~ span {
  bottom: 100%;
  opacity: 1;
  visibility: visible;
}
</style>

<label class="raz"><input type="email" placeholder="Email"><span>Email</span></label>

Плавающие метки неоднородны с метками элементов других типов формы. Их менее контрастный цвет хуже различим. [medium.com]

Плохо

Эффект placeholder для div

Атрибут placeholder работает только для input и textarea, даже если у других тегов указан атрибут contenteditable. [whatwg.org]

<style>
.raz {
  height: 3em;
  border: 1px solid;
}
</style>

<div contentEditable placeholder="Можно ввести текст" class="raz"></div>
<style>
.raz {
  height: 3em;
  border: 1px solid;
}
.raz:empty:not(:focus)::before { /* хак: если div задать и placeholder, то и эта запись будет работать .raz:empty:not(:placeholder-shown)::before */ 
  content: attr(data-placeholder);
  opacity: .5;
}
</style>

<div contentEditable data-placeholder="Можно ввести текст" class="raz"></div>

Древний метод на память, изменяющий value JavaScript

<input
 onblur="this.value=(this.value=='')?this.title:this.value;"
 onfocus="this.value=(this.value==this.title)?'':this.value;"
 value="Email"
 title="Email"
/>
в f t
наверх ↑

6 комментариев:

Комиго
Стоит добавить тот факт, что placeholder в мозилле и хроме серьёзно отличаются — у мозилки он с 50% прозрачностью, а в хроме непрозрачный. Поэтому в хроме они особо хреново распознаются как заглушка пустого поля.

Поэтому я везде дополнительно пихаю такой вот код:

::-moz-placeholder, ::-webkit-input-placeholder, :-ms-input-placeholder {
color: inherit;
opacity: 0.5;
}

Если что, это можно скопировать в основную статью :)
NMitra
Да, мне тоже нравится полупрозрачный плейсхолдер. Только вот нужно писать разные правила с селекторами с префиксами, в которых полнейшее разночтение

::-webkit-input-placeholder { }
input:-ms-input-placeholder { }
input::-ms-input-placeholder { }
input:-moz-placeholder { }
input::-moz-placeholder { }
input::placeholder { }
Комиго
ну, один такой блок кода всё равно можно добавить и перетерпеть этот момент) так конечно, в реальном мире разночтения отсутствуют только в том случае, если ты пишешь гибридное веб-приложение, которое всегда поставляется вместе со своим определённым вшитым браузером (как у меня, хо-хо)))

Чтобы автоматически добавлялись всякие такие браузерные вариации, люди придумали препроцессоры CSS (которые берут файлы на своём языке и создают на их основе CSS) и постпроцессоры (которые работают на основе простого CSS и делают его ещё круче). Из последних известен PostCSS, из первых я предпочитаю Stylus. Надо во всём этом разбираться, да, но когда разберёшься и наделаешь себе шаблонов проектов — всё идёт на поток и на конфигурацию этих радостей современного интернета не обращаешь внимание :)

В общем, теперь, если будет свободное время, ты знаешь, на что его ещё можно потратить :D
NMitra
Это всё уже почти в прошлом: новые префиксы браузеры не добавляют. Поддерживая старые префиксы, нельзя добиться нормального отображения всех версий браузеров. Так что я просто отрубаю какой-то эффект для старых версий. Единственное, сморю, чтобы элемент был пусть не таким красивым, ровным и аккуратным, но обязательно доступным.
Unknown
Здравствуйте,
пытался сформировать стиль для использования в Contact form7 WordPress, но ничего не получилось :( Там плагин оборачивает input служебным span и использовать селектор типа ~span или ещё какой-нибудь с ~ нет возможности :(. Не получается привязаться к событию input:focus :(

Есть какие-нибудь идеи без java?
NMitra
Здравствуйте, посмотрите псевдокласс :focus-within. Должен подойти.

От браузеров ждут селектор с доступом от элемента к его родителю, но его на сегодняшний день не реализовали.