- PVSM.RU - https://www.pvsm.ru -
Возможно, вам уже попадался на глаза этот приём. Это поле ввода, которое выглядит так, как будто в нем есть текстовая подсказка (placeholder), но при начале набора текста она не исчезает, а отодвигается в сторону. Мне нравится эта идея. Брэд Фрост написал очень хорошую статью [1] об этом приёме, подробно рассмотрев все «за» и «против».
Большинство примеров использования этой техники полагаются на JavaScript. В один прекрасный день я зашёл на nest.com, увидел там этот приём и задумался: а нельзя ли реализовать то же самое без JavaScript? И вот что из этого вышло.
Вот так выглядит форма на nest.com:

Мой вариант вы можете посмотреть на CodePen [2]. Он, конечно, выглядит не так круто, как у Nest, где текст плавно исчезает, а метка выдвигается снизу. Разумеется, я мог бы сделать так же с помощью JavaScript, как, наверное, и на чистом CSS, но цель статьи — показать принцип, а красоту вы можете навести и самостоятельно.
Есть две причины, по которым имеет смысл использовать эту технику:
label атрибут for, то и метка становится активной, но есть что-то очень привлекательное в большом прямоугольнике, который приглашает щёлкнуть по нему и начать набирать текст. Это особенно хорошо для мобильных приложений.Хотя в общем случае постоянно видимые метки лучше, но, при правильной реализации, этот приём иногда может быть уместен. Тем не менее, всегда есть риск напортачить с доступностью, так что будьте осторожны. Ещё один недостаток этого подхода — нельзя поместить в placeholder информацию, которая дополняет метку (например, метка — «номер телефона», a подсказка — "(555) 555-5555").
Элементы <label> и <input> находятся внутри <div> (который нужен в любом случае, так как поля ввода внутри формы желательно оборачивать в блочные элементы) с относительным позиционированием. Это позволяет использовать внутри блока абсолютное позиционирование, а это значит, что мы можем разместить поле ввода непосредственно поверх метки. Разместив <input> с прозрачным фоном сверху, мы сможем видеть <label> под ним, и в то же время, поле ввода будет реагировать на щелчки.
HTML:
<div>
<input id="name" name="name" type="text" required>
<label for="name">Your Name</label>
</div>
CSS:
form > div {
position: relative;
}
form > div > label {
position: absolute;
}
Порядок расположения элементов <label> и <input> в коде не имеет большого значения, так как их семантическая связь определяется атрибутом for. Однако, если расположить <input> первым, мы сможем использовать его псевдокласс :focus и комбинированный селектор ближайшего родственного элемента (+), чтобы менять стиль <label>, когда фокус перемещается на поле ввода. Используется тот же принцип, что и в хаке с чекбоксом [3].
CSS:
input:focus + label {
/* делаем что-нибудь с меткой */
}
Вы можете сделать с меткой всё, что придёт вам в голову. Главное, чтобы это выглядело красиво и не мешало набирать текст в поле. В моём примере реализованы два варианта: в одном из них метка уменьшается и съезжает вниз, а в другом — отодвигается вправо.
form.go-bottom label {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 100%;
transition: 0.2s;
}
form.go-bottom input:focus + label
top: 100%;
margin-top: -16px;
}
Если в поле уже введён какой-то текст, и оно теряет фокус, будет очень плохо, если мета вернётся на своё прежнее место и введённый текст будет отображаться поверх неё. К счастью, в CSS есть псевдокласс :valid, который присваивается элементам <input>, если их значение проходит валидацию. В частности, можно считать валидным поле, в котором есть хоть какой-то текст. Это делается так:
<input type="text" required>
А теперь вспомним, что метка видна на странице только потому, что у поля ввода прозрачный фон. Чтобы спрятать её, сделаем его непрозрачным:
form input:valid {
background: white;
}
Всё что осталось сделать — поработать над деталями дизайна, чтобы стало красиво.
Автор: ilya42
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/interfejsy/57527
Ссылки в тексте:
[1] очень хорошую статью: http://bradfrostweb.com/blog/post/float-label-pattern/
[2] посмотреть на CodePen: http://codepen.io/chriscoyier/pen/CiflJ
[3] хаке с чекбоксом: http://css-tricks.com/the-checkbox-hack/
[4] изначально придумал: http://mattdsmith.com/float-label-pattern/
[5] Джереми Филдс: http://viget.com/inspire/making-infield-form-labels-suck-less-2
[6] Джим Нильсен: http://webdesign.tutsplus.com/articles/implementing-the-float-label-form-pattern--webdesign-16407
[7] maman: http://blog.mahardi.me/2013/10/14/jvfloatjs---the-experiment-with-form-accessbility-and-ux-in-html5/
[8] практически к такому же решению: http://dbushell.com/2013/11/08/form-label-design/
[9] подборка: http://codepen.io/collection/IjFib/
[10] Источник: http://habrahabr.ru/post/216669/
Нажмите здесь для печати.