Meta Input
27 Jul 2023
<div class="meta-input">
<label for="email">Email</label>
<input
id="email"
type="email"
placeholder="Type your email"
inputmode="email"
/>
</div>
<div class="meta-input">
<label for="message">Message</label>
<textarea
data-autosize
id="message"
placeholder="Paste your message"
></textarea>
</div>
<!--Example of input with help text-->
<div class="meta-input">
<label for="email">Email</label>
<input
id="email"
type="email"
placeholder="Type your email"
inputmode="email"
/>
<span class="meta-input__help">We'll only use this for spam.</span>
</div>
<!--Example of input with an error-->
<div class="meta-input">
<label for="email">Email</label>
<input
class="error"
id="email"
type="email"
placeholder="Type your email"
inputmode="email"
/>
<span class="meta-input__error">Not a valid email address.</span>
</div>
<!--Example of input with autoheight-->
<div class="meta-input">
<label for="message">Message</label>
<textarea
data-autosize
id="message"
placeholder="Paste your message"
></textarea>
</div>
.meta-input {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
label {
font-family: var(--font-main);
font-size: ac(16px, 14px);
line-height: 1.2;
font-weight: 700;
color: var(--cl-dark-blue);
padding-bottom: 8px;
cursor: pointer;
}
input,
textarea {
width: 100%;
font-size: ac(16px, 14px);
line-height: 1.2;
font-weight: 500;
font-family: var(--font-main);
color: var(--cl-dark-blue);
border: 2px solid var(--cl-grey);
border-radius: 6px;
outline: none;
transition: box-shadow 0.25s ease, border-color 0.3s ease,
caret-color 0.3s ease, color 0.3s ease;
padding: 10px ac(16px, 12px);
background: transparent;
@include transparent-bg-input(--cl-dark-blue);
box-shadow: 0 1px 2px 0 rgba(var(--cl-dark-blue-rgb) / 0.05);
&::placeholder {
color: var(--cl-grey);
}
&:focus {
border-color: rgba(var(--cl-dark-blue-rgb) / 0.8);
caret-color: var(--cl-dark-blue);
box-shadow: 2px 2px 5px 0px rgba(var(--cl-dark-blue-rgb) / 0.3);
}
&.error {
border-color: var(--cl-red);
box-shadow: 2px 2px 5px 0px rgba(var(--cl-red-rgb) / 0.3);
}
}
textarea {
min-height: ac(80px, 60px);
resize: vertical;
}
&__help,
&__error {
margin-top: 5px;
font-family: var(--font-main);
font-size: ac(14px, 12px);
line-height: 1.2;
font-weight: 600;
}
&__help {
color: var(--cl-dark-grey);
}
&__error {
color: var(--cl-red);
}
}
.meta-input {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
label {
font-family: var(--font-main);
font-size: ac(16px, 14px);
line-height: 1.2;
font-weight: 700;
color: var(--cl-dark-blue);
padding-bottom: 8px;
cursor: pointer;
}
input,
textarea {
width: 100%;
font-size: ac(16px, 14px);
line-height: 1.2;
font-weight: 500;
font-family: var(--font-main);
color: var(--cl-dark-blue);
border: 2px solid var(--cl-grey);
border-radius: 6px;
outline: none;
transition: box-shadow 0.25s ease, border-color 0.3s ease,
caret-color 0.3s ease, color 0.3s ease;
padding: 10px ac(16px, 12px);
background: transparent;
@mixin transparent-bg-input var(--cl-dark-blue);
box-shadow: 0 1px 2px 0 color-mod(var(--cl-dark-blue) a(0.05%));
&::placeholder {
color: var(--cl-grey);
}
&:focus {
border-color: color-mod(var(--cl-dark-blue-rgb) a(0.8%));
caret-color: var(--cl-dark-blue);
box-shadow: 2px 2px 5px 0px color-mod(var(--cl-dark-blue) a(0.3%));
}
&.error {
border-color: var(--cl-red);
box-shadow: 2px 2px 5px 0px color-mod(var(--cl-dark-red) a(0.3%));
}
}
textarea {
min-height: ac(80px, 60px);
resize: vertical;
}
&__help,
&__error {
margin-top: 5px;
font-family: var(--font-main);
font-size: ac(14px, 12px);
line-height: 1.2;
font-weight: 600;
}
&__help {
color: var(--cl-dark-grey);
}
&__error {
color: var(--cl-red);
}
}
function autosizeTextarea() {
if (document.querySelector('textarea[data-autosize]')) {
const autosizeTextareaElements = document.querySelectorAll(
'textarea[data-autosize]'
);
autosizeTextareaElements.forEach((textarea) => {
const startHeight = textarea.offsetHeight;
console.log(startHeight);
textarea.addEventListener('input', autosize);
function autosize() {
const el = this;
const newHeight = el.scrollHeight;
if (newHeight > startHeight) {
el.style.minHeight = `${el.scrollHeight}px`;
} else {
el.style.minHeight = startHeight;
}
}
});
}
}
autosizeTextarea();
Будемо намагатися стандартизувати розмітку інпутів та текстеріа в нових проєктах. Цей варіант інпутів з оновлення розмітки попапів, яке буде з приходом збірки на базі Parcel. Буде краще, якщо відразу стилізувати їх під проєкт і для самих попапів. Цей варіант мінімально стилізований.
Якщо в дизайні проєкту не потрібен label, не забувайте додавати клас sr-only
, щоб його було не видно. Але він потрібен для SEO та правильної семантики DOM. І важливо, щоб в label
в атрибуті for
завжди було id
потрібного інпута, навіть якщо ви його будете приховувати.
Також не забувайте правильно вказувати тип інпуту, щоб кожний інпут не був type="text", коли для нього є свій тип. Існує кілька типів інпутів, і кожен з них має свої особливості та призначення. Основні типи:
: Використовується для звичайного текстового вводу. Призначений для введення коротких або довгих текстів, які не обмежені числами або певним форматом.type="text"
: Використовується для введення паролей. Введений текст зазвичай приховується замість відображення його символів для забезпечення конфіденційності.type="password"
: Використовується для введення числових значень. Може обмежувати введення лише цифрами та може мати додаткові атрибути для встановлення мінімальних та максимальних значень, кроку, тощо.type="number"
: Використовується для введення електронної пошти. Браузер може забезпечувати перевірку правильного формату електронної пошти.type="email"
: Використовується для введення URL-адреси. Браузер може перевіряти правильний формат URL.type="url"
: Використовується для введення телефонного номера. Може обмежувати введення лише цифрами, дефісом та деякими додатковими символами.type="tel"
: Використовується для відмітки (галочки) в вигляді прапорця. Користувач може активувати або деактивувати прапорець.type="checkbox"
: Використовується для вибору одного елементу з групи елементів, які мають одинаковий атрибутtype="radio"
name
. Тільки один елемент може бути вибраний в групі.
: Використовується для завантаження файлів з комп'ютера користувача.type="file"
: Використовується для введення дати.type="date"
: Використовується для введення часу.type="time"
: Використовується для вибору кольору.type="color"
: Використовується для вибору значення з числового діапазону за допомогою повзунка.type="range"
: Використовується для передачі даних на сервер без відображення на сторінці.type="hidden"
Крім того тепер будемо додавати для інпутів атрибут inputmode
. Inputmode - це атрибут HTML-елементів, який дозволяє вказати переважний спосіб введення тексту для користувачів під час використання віртуальної клавіатури на пристроях з сенсорним екраном. Він спрощує оптимізацію та поліпшення користувацького досвіду при введенні тексту, надаючи рекомендації та обмеження для клавіатури. Наприклад inputmode="email"
одразу виведе в клавіатурі символ @
.
Значення атрибута inputmode
:
: Вимикає віртуальну клавіатуру для даного елемента введення. Корисно, коли потрібно запобігти введенню тексту за допомогою віртуальної клавіатури.none
: Рекомендується для загального текстового введення.text
: Рекомендується для введення телефонних номерів.tel
: Рекомендується для введення URL-адрес.url
: Рекомендується для введення електронної пошти.email
: Рекомендується для введення числових значень.numeric
: Рекомендується для введення десяткових чисел.decimal
: Рекомендується для введення пошукових запитів.search
: Рекомендується для введення паролів.password
: Рекомендується для введення дат.date
: Рекомендується для введення часу.time
: Рекомендується для введення місяця.month
: Рекомендується для введення тижня.week
: Рекомендується для введення дати і часу без врахування часового поясу.datetime-local
P.S. Шмаргалка по цьому що вверху
Image
Якщо треба додати якусь підсказку під інпутом, то для цього в розмітці використовуйте span
з класом "meta-input__help"
. Наприклад
<div class="meta-input">
<label for="email">Email</label>
<input
id="email"
type="email"
placeholder="Type your email"
inputmode="email"
/>
<span class="meta-input__help">We'll only use this for spam.</span>
</div>
Якщо треба помилку вивести, то для цього в розмітці використовуйте span
з класом "meta-input__help"
. Та інпуту передайте класс error
Наприклад:
<div class="meta-input">
<label for="popup-email">Email</label>
<input
class="error"
id="email"
type="email"
placeholder="Type your email"
inputmode="email"
/>
<span class="meta-input__error">Not a valid email address.</span>
</div>
Також для текстеріа можна використати функцію з автовистою при заповненні. Для цього textarea
треба передати атрибут data-autosize
.