Вводимые данные, без сомнения, охватывают значительную часть Интернета. Так как элементы управления формами могут и будут встречаться пользователями ежедневно, кажется уместным лишь уделить внимание нескольким подозреваемым, предоставив каждому из них силу Sass, чтобы помочь нам быстро осветить вклад нашего проекта.
Заполнители
Заполнитель — это подсказка пользователям о том, какую информацию можно ввести в соответствующий элемент управления. Он применяется, когда значение атрибута type
text
search
tel
url
email
в противном случае это игнорируется. К сожалению, для стилизации местозаполнителя требуются соответствующие префиксы поставщиков, связанные с каждым требуемым псевдо, так что авторы могут обеспечить охват основных поставщиков браузеров, таких как IE, Firefox, Safari, Chrome и Opera.
Mixin Helper
Этот заполнитель @mixin
Я также взял на себя смелость создать карту Sass, которая содержит все свойства, которые вы можете стилизовать.
index.html
<label for="username">Name</label>
<input type="text" name="username" id="username" placeholder="first, last">
_placeholder-mixin.scss
Директива @at-root
используемая этими миксинами, работает путем переключения контекста, в который помещается вложенный вызов в вашем Sass, и переносит объявление на верхний уровень цепочки селектора.
Примечание . На данный момент post -sass не может скомпилировать этот миксин-заполнитель из-за проблем интерполяции со строкой @at-root #{&}#{$pseudo}
$pseudo-phprefix: "::-webkit-input-placeholder" "::-moz-placeholder" ":-ms-input-placeholder" "::placeholder";
$ph-styles: (
font-family: sans-serif,
font-size: medium,
font-style: normal,
font-weight: normal,
color: inherit,
letter-spacing : normal,
line-height: normal,
text-align: inherit,
text-decoration: inherit,
padding: 0
);
@mixin placeholder-theme($styles) {
@each $pseudo in $pseudo-phprefix {
@at-root #{&}#{$pseudo} {
@each $key, $value in $styles {
#{$key}: #{$value};
}
}
}
}
@mixin placeholder {
@each $pseudo in $pseudo-phprefix {
@at-root #{&}#{$pseudo} {
@content
}
}
}
@mixin
@include placeholder { color: red; }
input {
@include placeholder-theme($ph-styles);
} Второй метод использует преимущество использования целевого селектора, чтобы избежать глобальных стилей определенных и нежелательных заполнителей в вашей системе.
_placeholder-mixin.scss
::-webkit-input-placeholder {
color: red;
}
::-moz-placeholder {
color: red;
}
:-ms-input-placeholder {
color: red;
}
::placeholder {
color: red;
}
input::-webkit-input-placeholder {
font-family: sans-serif;
font-size: medium;
font-style: normal;
font-weight: normal;
color: inherit;
letter-spacing: normal;
line-height: normal;
text-align: inherit;
text-decoration: inherit;
padding: 0;
}
input::-moz-placeholder {
font-family: sans-serif;
font-size: medium;
font-style: normal;
font-weight: normal;
color: inherit;
letter-spacing: normal;
line-height: normal;
text-align: inherit;
text-decoration: inherit;
padding: 0;
}
input:-ms-input-placeholder {
font-family: sans-serif;
font-size: medium;
font-style: normal;
font-weight: normal;
color: inherit;
letter-spacing: normal;
line-height: normal;
text-align: inherit;
text-decoration: inherit;
padding: 0;
}
input::placeholder {
font-family: sans-serif;
font-size: medium;
font-style: normal;
font-weight: normal;
color: inherit;
letter-spacing: normal;
line-height: normal;
text-align: inherit;
text-decoration: inherit;
padding: 0;
}
CSS-вывод
<label for="phone">Cell Phone</label>
<input type="tel" name="phone" class="jpinput" id="phone" placeholder="(555) 555-5555">
Слова предостережения : избегайте использования атрибута заполнителя вместо метки. Оба варианта различаются по назначению, поскольку атрибут label описывает роль элемента формы; то есть указывает на то, какая информация ожидается. Атрибут placeholder является подсказкой о формате, который должен принимать контент. В некоторых случаях атрибут placeholder никогда не отображается пользователю, поэтому форма должна быть понятной без него.
Прыжки Заполнитель Эффект
Это довольно крутой эффект для стиля и темы, но реагирует только в WebKit / Blink. Некоторые также называют это паттерном «Плавающая метка», когда во время его дебюта вызвали увлекательные дискуссии о необходимости такого паттерна.
index.html
::-webkit-input-placeholder[style*=hidden]
Волшебство происходит благодаря псевдо-селектору $jpinput-height: 40px;
$jpinput-radius: 4px;
$jpinput-padding: 10px 16px;
$jpinput-bg: #8DAA91;
$jpinput-color: #4F4137;
$jpinput-ph-color: $jpinput-color;
$jpinput-phide-color: $jpinput-bg;
input {
appearance: none;
box-sizing: border-box;
border-radius: $jpinput-radius;
display: inline-block;
outline: 0;
width: 100%;
}
.jpinput {
height: $jpinput-height;
padding: $jpinput-padding;
transition: transform 225ms ease-in-out;
background: $jpinput-bg;
color: $jpinput-color;
@include placeholder {
position: relative;
top: 0;
left: 0;
transition: all 300ms ease-in-out;
color: rgba($jpinput-ph-color, .5);
}
}
.jpinput::-webkit-input-placeholder[style*=hidden] {
transform: translateY(-$jpinput-height);
opacity: 1;
visibility: visible !important;
color: $jpinput-phide-color;
} Я хотел бы найти Mozilla, эквивалентный вышеупомянутому селектору, но я подхожу с пустыми руками в моих поисках. У Дэвида Бушелла есть отличная демонстрация, с которой я связался ниже, в которой используются преимущества селекторов псевдо-достоверности, но, конечно, у метода есть несколько минусов.
_jp-input.scss
@mixin
Конечно, есть и другие подходы, в которые я предлагаю вам углубиться, чтобы выявить плюсы и минусы. Просто позвольте знать, что многие опции, которые существовали на момент написания этой статьи, обычно уступают JavaScript для поддержки.
- FloatLabels.js
- Тимпанус TextInputEffects
- http://mds.is/float-label-pattern
- http://bradfrost.com/blog/post/float-label-pattern
- http://dbushell.com/2013/11/08/form-label-design
- Коллекция поплавков от Криса Койера
- Дэвид Бушелл Демо
Этикетки
Метка HTML представляет заголовок для элемента в интерфейсе и может быть связана с соответствующим ему элементом управления. Это также помогает указать, какую информацию следует ожидать.
Безопасный ввод
Мы можем использовать метку, чтобы действовать как раздвижная дверь для того, чтобы скрыть введенную информацию, когда у ввода будет удален фокус. Это удобный способ скрыть текст, предназначенный для личного пользования, например номер кредитной карты или номер социального страхования. В этом примере также используется заполнитель Sass <div class="slabel">
Метка может быть размещена до, после или вокруг соответствующего элемента управления, если вам интересно этот шаблон.
<input id="credit-card" type="text" pattern="[0-9]{13,16}" placeholder="xxxx-xxxx-xxxx-xxxx">
<label for="credit-card">Credit Card</label>
</div>
index.html
$slabel-theme: (
border: 0,
radius: 0,
padding: 0,
font: inherit,
bg: white,
label-bg: white,
label-color: inherit,
error-color: #E82C0C,
placeholder-color: #B9E0D6,
success-color: #5C832F
);
_slabel-input.scss
display: none
Ознакомьтесь с этими удивительными шаблонами для лейблов Джордано Арагао на CodePen, которые имеют немного индивидуальности и восторга.
входные
Элемент ввода используется для создания интерактивных элементов управления с формами и приема данных от ввода пользователя. Входные данные обычно представлены в виде текста, электронной почты, номера, радио, флажков и даже кнопок.
Выбрать
Вот простой способ стилизовать выбранный ввод без использования обходного или грязного метода для изменения внешнего вида. В большинстве решений, использующих JavaScript, собственный элемент select настроен на <select>
Клиенты любят это, но авторы презирают это. Я думаю, что следующий подход — это победа для всех, пока не будет достигнуто более нативное решение с CSS. Это позволяет авторам стилизовать браузеры, которые ведут себя, и демонстрируют солидный запасной вариант для тех, кто этого не делает.
<option>Property Closing*</option>
<option>open</option>
<option>closed</option>
</select>
index.html
$select-arrow: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4IiB3aWR0aD0iNDgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE0LjgzIDE2LjQybDkuMTcgOS4xNyA5LjE3LTkuMTcgMi44MyAyLjgzLTEyIDEyLTEyLTEyeiIvPjxwYXRoIGQ9Ik0wLS43NWg0OHY0OGgtNDh6IiBmaWxsPSJub25lIi8+PC9zdmc+';
$select-padding: 0;
select {
border-radius: 0;
-webkit-appearance: none; // autoprefixer won't add this and we still need it
appearance: none;
cursor: pointer;
padding: $select-padding;
width: 100%;
@media screen and (-webkit-min-device-pixel-ratio: 0) {
background-image: url(#{$select-arrow});
background-position: right 0 top 50%;
background-repeat: no-repeat;
}
}
_select-input.scss
<label for="radioa" class="input-control radio">
<input type="radio" id="radioa" name="radio" value="radio-value">
<span class="input-control__indicator"></span> Send Me Stuff!
</label>
<label for="radiob" class="input-control radio">
<input type="radio" id="radiob" name="radio" value="radio-value">
<span class="input-control__indicator"></span> Don't send a friggin' thing.
</label>
Прочитайте оригинальную статью Ли Веру, обсуждающую этот подход, или ознакомьтесь с этими удивительными Избранными Вдохновениями от Тимпана.
Радио
Радио представляет собой выбор одного элемента из списка элементов. Этот ввод обычно используется в ситуациях, когда у пользователя есть один выбор, из которого он / она может выбирать, в то время как сценарий с флажками позволяет выбирать несколько вариантов.
Это пользовательское радио, которое следует за Sass, основано на подходе и улучшении к оригинальной версии, опубликованной Марком Отто на WTF, формы? это также включает в себя некоторые обновленные методы позиционирования с использованием CSS-преобразований для внутреннего круга, плюс он очень хорошо масштабируется и очень упрощает настройку.
index.html
$input-radius: 0 !default;
$input-unit: 16px !default; // accepts px, em, rem
$input-spacing: $input-unit * 1.5 !default; // adjust depending on font-family
$input-font: sans-serif !default;
$radio-bg: white !default;
$radio-txt-color: #AACCFF !default;
$radio-checked-custom: (
background: #0081D0
) !default;
$radio-checked: #222233 !default;
$radio-checked-focus: white !default;
_INPUT-radio.scss
Найдите минутку, чтобы познакомиться с этими удивительными анимированными радиовходами от Samurai для дальнейшего изучения идей и вдохновения.
флажок
Элемент input со значением атрибута type «checkbox» представляет состояние или параметр, который можно переключать.
Флажок SVG
В этом подходе используется техника SVG, первоначально продемонстрированная Сарой Соуэйдан, для создания пользовательского флажка и формы x с использованием stroke-dasharray
stroke-dashoffset
Этот пример основан на оригинальной демонстрации, которую я упомянул, и добавляет состояние :focus
index.html
<input type="checkbox" id="optiona" name="optiona">
<label for="optiona">Click Me
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<path d="M 10 10 L 90 90"></path>
<path d="M 90 10 L 10 90"></path>
</svg>
</label>
_checkbox-input.scss
$font-size: 2em; // adjust accordingly
$ratio: 1; // adjust accordingly
$size: $ratio + em;
$ratio: $ratio;
$gutter: 5px; // adjust accordingly
$stroke-dash: 270;
$stroke: (
thickness: $gutter/3,
style: solid,
color: #fff
);
$mark-ischecked: (
stroke-dashoffset: 0
); // define css properties
$label-ischecked: (); // define css properties
$svg-ischecked: (); // define css properties
Слайдер Флажок
Вот флажок, который я использую в проекте Transformicons, который напоминает слайдер. Он в основном построен с использованием Sass, но его очень многократно использовать, и он содержит минимальный код для настройки и стилизации. Обратите внимание, что этот пользовательский шаблон ввода также обеспечивает доступность с точки зрения навигации с помощью клавиатуры. Как только пользователь фокусируется на вводе с помощью клавиши табуляции, цветовая индикация уведомит пользователя. Как только это уведомление произойдет, пользователь может предпринять действия со своим пробелом, чтобы установить выбор.
index.html
<div class="slider-checkbox">
<input type="checkbox" id="option" aria-checked="false" role="checkbox">
<label for="option">Label Text</label>
</div>
Настройка, предоставляемая через конфигурацию Sass, позволяет авторам выбирать стиль ввода, принимая значения «округленное» или «нулевое». Значение ‘null’ отключит border-radius
По сути, это просто сделает ввод квадратным.
_slider-checkbox.scss
$checkbox-style: rounded; // accepts 'rounded' or 'null'
$checkbox-sizing-unit: 6rem; // adjust this value for sizing
$checkbox-height: $checkbox-sizing-unit / 1/4;
$checkbox-position-unit: $checkbox-sizing-unit * 3/4;
$checkbox-speed: 150ms;
$checkbox-off-bg: #E8DFE7;
$checkbox-on-bg: #4fbe79;
$checkbox-btn-bg: #FFFFFD;
Состояния действия
Псевдоселекторы Validity используются для стилизации интерактивных элементов на основе оценки ввода пользователя, такого как :invalid
:valid
Вот Sass @mixin
Хорошее небольшое замечание, о котором следует знать :invalid
@mixin valid {
&:valid,
&:empty:valid,
&:focus:empty:valid {
@content;
}
}
@mixin invalid {
&:invalid,
&:focus:invalid {
@content;
}
}
Вот еще несколько псевдо, от которых у вас болит голова из-за забытых состояний, когда дело доходит до входов и их состояний контроля .
:required
:optional
:enabled
:disabled
:not(:checked)
:in-range
:out-of-range
:user-error
:empty
:blank
Вывод
Если вы хотите углубиться в стиль создания собственных элементов формы, вот целая куча кросс-браузерных специфических псевдоэлементов, чтобы сбить ваши носки с рук. Если вы хотите узнать больше о состояниях достоверности, вы можете выделить время и прочитать спецификацию W3C на досуге. Счастливая форма для всех!