Статьи

Тематические элементы формы с Sass

Вводимые данные, без сомнения, охватывают значительную часть Интернета. Так как элементы управления формами могут и будут встречаться пользователями ежедневно, кажется уместным лишь уделить внимание нескольким подозреваемым, предоставив каждому из них силу Sass, чтобы помочь нам быстро осветить вклад нашего проекта.

Заполнители

Заполнитель — это подсказка пользователям о том, какую информацию можно ввести в соответствующий элемент управления. Он применяется, когда значение атрибута typetextsearchtelurlemail в противном случае это игнорируется. К сожалению, для стилизации местозаполнителя требуются соответствующие префиксы поставщиков, связанные с каждым требуемым псевдо, так что авторы могут обеспечить охват основных поставщиков браузеров, таких как 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 для поддержки.

Этикетки

Метка 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>
<option>Property Closing*</option>
<option>open</option>
<option>closed</option>
</select>
Клиенты любят это, но авторы презирают это. Я думаю, что следующий подход — это победа для всех, пока не будет достигнуто более нативное решение с CSS. Это позволяет авторам стилизовать браузеры, которые ведут себя, и демонстрируют солидный запасной вариант для тех, кто этого не делает.

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 с использованием элемент. Этот элемент использует SVG-свойства stroke-dasharraystroke-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 на досуге. Счастливая форма для всех!