This media is not supported in your browser
VIEW IN TELEGRAM
Выделение текста одним кликом
Еще один микро-лайфхак о том, как облегчить жизнь пользователям. Сделаем так, чтобы выделять текст можно было одним кликом - удобно для выделения кода, номеров заказов, реф. кодов и т.п.
Делается это с помощью свойства
CSS-свойство
Это значение говорит браузеру: "Когда пользователь кликает на этот элемент — сразу выдели всё, что внутри".
Один клик — готовый к копированию текст. Довольно удобно)
Пример:
CSS:
Теперь при клике на блок, весь текст внутри
Потестить код можно здесь.
Еще один микро-лайфхак о том, как облегчить жизнь пользователям. Сделаем так, чтобы выделять текст можно было одним кликом - удобно для выделения кода, номеров заказов, реф. кодов и т.п.
Делается это с помощью свойства
user-select
.CSS-свойство
user-select
контролирует, может ли пользователь выделить текст на странице. У него есть несколько значений, но нас интересует:user-select: all;
Это значение говорит браузеру: "Когда пользователь кликает на этот элемент — сразу выдели всё, что внутри".
Один клик — готовый к копированию текст. Довольно удобно)
Пример:
<div class="code-block">
<code>npx create-react-app my-app</code>
</div>
CSS:
.code-block code {
user-select: all;
}
Теперь при клике на блок, весь текст внутри
<code>
будет выделен автоматически.Потестить код можно здесь.
🔥28👍18❤1
Улучшаем читаемость текста на фоновом изображении
Иногда фоновая картинка мешает нормально прочитать текст, который находится над ней. Для решения этой проблемы отлично подходит линейный градиент.
Буквально одной строчкой можно пофиксить проблему)
Наш фон:
Добавляем линейный градиент с прозрачностью:
С помощью
Пример кода, как всегда, здесь.
Иногда фоновая картинка мешает нормально прочитать текст, который находится над ней. Для решения этой проблемы отлично подходит линейный градиент.
Буквально одной строчкой можно пофиксить проблему)
Наш фон:
background-image: url('image.jpg');
Добавляем линейный градиент с прозрачностью:
background-image: linear-gradient(rgb(255, 255, 255, 0.4), rgb(255, 255, 255, 1)), url('image.jpg');
С помощью
linear-gradient
добавляем белый полупрозрачный градиент — это сделает текст четким и сохранит красоту фона.Пример кода, как всегда, здесь.
👍29🔥7❤5🤝2
Выбрать камеру (фронтальную или основную) прямо из браузера
На днях я наткнулся на одну интересную фишку — возможность указать, какую камеру использовать при загрузке фото или видео с мобильного устройства.
Причем это работает прям через HTML атрибут.
Атрибут capture позволяет выбирать камеру:
■
■
Естественно, это работает только в мобильных браузерах)
Поддержку браузерами можно глянуть тут.
Проверить, как это работает можно здесь.
На днях я наткнулся на одну интересную фишку — возможность указать, какую камеру использовать при загрузке фото или видео с мобильного устройства.
Причем это работает прям через HTML атрибут.
<!-- Фото с фронтальной камеры -->
<input type="file" capture="user" accept="image/*" />
<!-- Фото с основной камеры -->
<input type="file" capture="environment" accept="image/*" />
<!-- Видео с фронтальной камеры -->
<input type="file" capture="user" accept="video/*" />
<!-- Видео с основной камеры -->
<input type="file" capture="environment" accept="video/*" />
Атрибут capture позволяет выбирать камеру:
■
capture="user"
— открывает фронтальную камеру.■
capture="environment"
— открывает основную (заднюю) камеру.Естественно, это работает только в мобильных браузерах)
Поддержку браузерами можно глянуть тут.
Проверить, как это работает можно здесь.
🔥23👍9❤5😐1
This media is not supported in your browser
VIEW IN TELEGRAM
Управление градиентом в DevTools
Если кто не знал (как я), то в DevTools, есть приблуда для управления направлением градиента.
Находится на вкладке Elements в стилях, на видео сверху, наглядно показал, как пользоваться.
Поэтому, если у вас есть градиент, в котором указан угол, то можно поиграться и подобрать оптимальный вариант)
Насколько понял такая фишка только в хроме, в firefox не нашел.
Если кто не знал (как я), то в DevTools, есть приблуда для управления направлением градиента.
Находится на вкладке Elements в стилях, на видео сверху, наглядно показал, как пользоваться.
Поэтому, если у вас есть градиент, в котором указан угол, то можно поиграться и подобрать оптимальный вариант)
Насколько понял такая фишка только в хроме, в firefox не нашел.
👍20🔥7✍5❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Когда используешь
<div>
, как <button>
)😁65👍4
Отключаем ховер на мобильных устройствах
Ховер-эффекты работают при наведении курсора, но на сенсорных экранах нет мыши — вместо этого есть касания.
Из-за этого могут возникать проблемы: "залипание" стилей — после тапа элемент остается в состоянии
Чтобы ховер работал только на устройствах с мышью, можно использовать CSS-медиазапросы:
Таким образом ховер останется только на ПК.
Заливать на codepen не стал, думаю и так все понятно)
Ховер-эффекты работают при наведении курсора, но на сенсорных экранах нет мыши — вместо этого есть касания.
Из-за этого могут возникать проблемы: "залипание" стилей — после тапа элемент остается в состоянии
:hover
, пока пользователь не коснётся другого места. Это может выглядеть странно)Чтобы ховер работал только на устройствах с мышью, можно использовать CSS-медиазапросы:
/* Ховер только для мыши */
@media (hover: hover) {
.btn:hover {
background: #4CAF50;
}
}
Таким образом ховер останется только на ПК.
Заливать на codepen не стал, думаю и так все понятно)
👍37🔥9❤4🤝2
Live-preview проекта на мобильном устройстве
Если вы верстаете в VS Code, то вы знаете про Live Server, так вот, он позволяет смотреть результат не только в браузере ПК, но и на мобильном устройстве.
Для этого нужно:
■ Убедиться, что ПК и телефон в одной Wi-Fi сети.
■ Найти локальный IP ПК:
● Можно открыть "Параметры сети и Интернет", далее кнопка "Свойства" и там найти IPv4-адрес.
● Можно в командной строке прописать
■ Открываем браузер в телефоне и вводим:
И всё, теперь изменения в коде автоматически обновляются и в браузере на телефоне)
У меня завелось не сразу, пришлось в защитнике Windows разрешать подключение для VS Code.
Решается проблема так:
■ откройте монитор защитника Windows:
● Жмем
● Переходим в "Правила для входящих подключений", находим там Visual Studio Code.
● Двойной клик и отмечаем "Разрешить подключение".
После этого всё должно заработать)
Если вы верстаете в VS Code, то вы знаете про Live Server, так вот, он позволяет смотреть результат не только в браузере ПК, но и на мобильном устройстве.
Для этого нужно:
■ Убедиться, что ПК и телефон в одной Wi-Fi сети.
■ Найти локальный IP ПК:
● Можно открыть "Параметры сети и Интернет", далее кнопка "Свойства" и там найти IPv4-адрес.
● Можно в командной строке прописать
ipconfig
и там также найти IPv4-адрес.■ Открываем браузер в телефоне и вводим:
https://[IP-компьютера]:5500
(например https://192.168.1.10:5500
)И всё, теперь изменения в коде автоматически обновляются и в браузере на телефоне)
У меня завелось не сразу, пришлось в защитнике Windows разрешать подключение для VS Code.
Решается проблема так:
■ откройте монитор защитника Windows:
● Жмем
win+r
и вводим wf.msc
● Переходим в "Правила для входящих подключений", находим там Visual Studio Code.
● Двойной клик и отмечаем "Разрешить подключение".
После этого всё должно заработать)
100👍28🔥12
This media is not supported in your browser
VIEW IN TELEGRAM
Эффект тряски полей в форме
Сегодня рассмотрим эффект тряски — простой, но интересный способ сделать валидацию форм живой и понятной)
Делается это с помощью двух вещей:
1. Keyframes анимация
2. Псевдокласс
В результате, если поле невалидно
Такой вот небольшой, но эффективный способ улучшить UX наших форм)
Потестить код можно здесь.
Сегодня рассмотрим эффект тряски — простой, но интересный способ сделать валидацию форм живой и понятной)
Делается это с помощью двух вещей:
1. Keyframes анимация
@keyframes shake {
0% { transform: translateX(0); }
25% { transform: translateX(-5px); }
50% { transform: translateX(5px); }
75% { transform: translateX(-5px); }
100% { transform: translateX(0); }
}
2. Псевдокласс
:user-invalid
input:user-invalid {
border: 2px solid red;
animation: shake 0.3s ease;
}
В результате, если поле невалидно
:user-invalid
, применяется анимация animation: shake 0.3s ease;
которая слегка двигает поле влево-вправо, создавая эффект "ошибки".Такой вот небольшой, но эффективный способ улучшить UX наших форм)
Потестить код можно здесь.
🔥54👍13❤3
Счетчик уведомлений с помощью атрибутов
Если вам вдруг нужно сделать вывод уведомлений, рядом с кнопкой, без использования отдельного html элемента (типа
Используем
Разметка:
CSS для уведомлений:
Т.е. добавляем кнопке атрибут data-count, в CSS передаем это число и выводим.
Если
Пример можно глянуть здесь.
Если вам вдруг нужно сделать вывод уведомлений, рядом с кнопкой, без использования отдельного html элемента (типа
<span class="badge">
), то можно попробовать сделать это через data-count
самой кнопки.Используем
::before
+ attr(data-count)
Разметка:
<button data-count="7">Уведомления</button>
CSS для уведомлений:
.button::before {
content: attr(data-count);
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: -0.75em;
right: -0.75em;
background-color: #dd7973;
border-radius: 50%;
width: 1.5em;
height: 1.5em;
}
/* Скрываем, если нет уведомлений */
.button[data-count=""]::before {
display: none;
}
Т.е. добавляем кнопке атрибут data-count, в CSS передаем это число и выводим.
Если
data-count
пуст, бейдж исчезает display: none
.Пример можно глянуть здесь.
🔥42👍21❤2
Мощная шпаргалка по CSS
Нашел на гитхабе крутую шпаргалку по CSS, сразу захотелось с вами поделиться)
Она прям реально большая, вот что в ней есть:
■ Основы CSS
■ Селекторы
■ Блочная модель
■ Позиционирование
■ Flexbox
■ Grid Layout
■ Трансформации и переходы
■ Анимации
■ Современные функции и переменные
■ Адаптивный дизайн
■ CSS Modules и методологии
■ Новые CSS-свойства
■ Контейнерные запросы
■ Логические свойства
■ Субгриды
■ Слои каскада
■ Дополнительные современные возможности
Согласитесь круто)
Находится она здесь — https://gist.github.com/dmitry-osin/c64f7d8eb9ed60cc932c4c56ac7eae22
Нашел на гитхабе крутую шпаргалку по CSS, сразу захотелось с вами поделиться)
Она прям реально большая, вот что в ней есть:
■ Основы CSS
■ Селекторы
■ Блочная модель
■ Позиционирование
■ Flexbox
■ Grid Layout
■ Трансформации и переходы
■ Анимации
■ Современные функции и переменные
■ Адаптивный дизайн
■ CSS Modules и методологии
■ Новые CSS-свойства
■ Контейнерные запросы
■ Логические свойства
■ Субгриды
■ Слои каскада
■ Дополнительные современные возможности
Согласитесь круто)
Находится она здесь — https://gist.github.com/dmitry-osin/c64f7d8eb9ed60cc932c4c56ac7eae22
👍36🔥17❤1
Стилизуем первую строку текста
Ранее, здесь мы уже рассматривали использование псевдоэлемента
Выглядит это так:
Теперь каждая первая строка абзацев будет выделена заданным стилем.
С ходу не смог придумать для чего это можно использовать, но знайте, что это есть)
Пример работы здесь.
Ранее, здесь мы уже рассматривали использование псевдоэлемента
::first-letter
, сегодня давайте вспомним о его близком "соседе" — ::first-line
) Он чуть менее известен, но тоже интересен.::first-line
применяется к первой строке текста внутри блочного элемента — чаще всего к абзацу <p>
, но также может работать с любыми блоками с display: block
.Выглядит это так:
p::first-line {
font-weight: bold;
color: #2c3e50;
}
Теперь каждая первая строка абзацев будет выделена заданным стилем.
С ходу не смог придумать для чего это можно использовать, но знайте, что это есть)
Пример работы здесь.
👍22🔥5❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Css Grid Layout
Еще один интересный видос обнаружил, теперь про то, как быстро накидать стандартную сетку сайта (шапка, сайдбар, контент и подвал) с помощью гридов.
Код из видео, разметка:
CSS:
Потестить код можно здесь.
P.S. превью получилось неказистое, но если запустить видео, то вроде всё норм)
Еще один интересный видос обнаружил, теперь про то, как быстро накидать стандартную сетку сайта (шапка, сайдбар, контент и подвал) с помощью гридов.
Код из видео, разметка:
<main>
<header>Header</header>
<article>Content</article>
<aside>Sidebar</aside>
<footer>Footer</footer>
</main>
CSS:
main {
display: grid;
grid-template-areas:
"head head head"
"side content content"
"foot foot foot";
grid-template-rows: 30px auto 30px;
min-height: 100vh;
}
header {
grid-area: head;
}
article {
grid-area: content;
}
aside {
grid-area: side;
}
footer {
grid-area: foot;
}
Потестить код можно здесь.
P.S. превью получилось неказистое, но если запустить видео, то вроде всё норм)
🔥21👍9❤3🤝3😐1
Убираем стрелочки у <input type="number">
При использовании
Убираем стрелки с помощью псевдоэлементов:
В результате, поле ввода числа без стрелочек и единый внешний вид на всех устройствах и браузерах)
Код с примером здесь, добавил туда еще кастомные кнопки для красоты)
При использовании
<input type="number">
браузеры автоматом добавляют к полю стрелочки (спиннеры), которые позволяют увеличивать или уменьшать значение с помощью клика. Это удобно, но не всегда желательно с точки зрения дизайна или логики работы интерфейса.Убираем стрелки с помощью псевдоэлементов:
/* Убирает стрелки в Chrome, Safari, Edge */
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
/* Убирает стрелки в Firefox */
input[type="number"] {
-moz-appearance: textfield;
}
В результате, поле ввода числа без стрелочек и единый внешний вид на всех устройствах и браузерах)
Код с примером здесь, добавил туда еще кастомные кнопки для красоты)
❤25👍17🔥5
Блок по ширине контента — width: fit-content
Если нужно, чтобы блок был ровно такой ширины, как его содержимое, но при этом не вылезал за границы родителя, то есть отличное решение —
■ Сжиматься под содержимое, если оно меньше доступной ширины.
■ Оставаться в пределах родителя, если контент слишком широкий.
Т.е. грубо говоря,
Поддержку браузерами можно глянуть тут.
Ну, а пример кода, по старинке, лежит здесь.
Если нужно, чтобы блок был ровно такой ширины, как его содержимое, но при этом не вылезал за границы родителя, то есть отличное решение —
width: fit-content
.fit-content
заставляет элемент:■ Сжиматься под содержимое, если оно меньше доступной ширины.
■ Оставаться в пределах родителя, если контент слишком широкий.
Т.е. грубо говоря,
width: fit-content
ведет себя, как inline-block
..fit-content {
width: fit-content;
}
Поддержку браузерами можно глянуть тут.
Ну, а пример кода, по старинке, лежит здесь.
👍24❤7🔥3😐3
Разбиваем список на колонки с помощью columns
Иногда бывает задача взять список и разбить его на несколько колонок. Наверное, самый простой способ для этого — это использовать CSS-свойство
Допустим, у нас есть обычный HTML-список:
Чтобы превратить его в двухколоночный список, достаточно добавить следующий CSS:
Это заставит браузер автоматически распределить элементы по двум колонкам.
Так что, если нужно просто равномерно разбить список на колонки без особой логики, то
Код можно глянуть здесь.
Иногда бывает задача взять список и разбить его на несколько колонок. Наверное, самый простой способ для этого — это использовать CSS-свойство
columns
.Допустим, у нас есть обычный HTML-список:
<ul class="multi-column-list">
<li>Пункт 1</li>
<li>Пункт 2</li>
<li>Пункт 3</li>
<li>Пункт 4</li>
<li>Пункт 5</li>
<li>Пункт 6</li>
</ul>
Чтобы превратить его в двухколоночный список, достаточно добавить следующий CSS:
.multi-column-list {
columns: 2;
}
Это заставит браузер автоматически распределить элементы по двум колонкам.
Так что, если нужно просто равномерно разбить список на колонки без особой логики, то
columns
— норм выбор)Код можно глянуть здесь.
👍36🔥5❤3
Создаем стильные кастомные чекбоксы на CSS
Иногда, стандартные чекбоксы не вписываются в дизайн. Поэтому давайте сегодня разберем, как создать красивые кастомные чекбоксы, которые выглядят, как современные кнопки-теги.
HTML структура:
Используем стандартные
CSS:
А псевдокласс
Стильно, модно, молодёжно)
Код лежит здесь.
Иногда, стандартные чекбоксы не вписываются в дизайн. Поэтому давайте сегодня разберем, как создать красивые кастомные чекбоксы, которые выглядят, как современные кнопки-теги.
HTML структура:
<div class="list">
<input type="checkbox" name="role" id="opt1" />
<label for="opt1">HTML, CSS</label>
<input type="checkbox" name="role" id="opt2" />
<label for="opt2">JavaScript</label>
</div>
Используем стандартные
<input type="checkbox">
, связываем их с <label>
через атрибут for
.CSS:
.list input {
display: none;
}
.list label {
cursor: pointer;
padding: 13px 34px;
border: 0.6mm solid #000;
border-radius: 30px;
}
.list input:checked + label {
color: rgb(0, 120, 230);
border-color: rgb(15, 150, 255);
background: rgb(230, 245, 255);
}
display: none
скрываем чекбоксы, стилизуем label
, который становится кнопкой.А псевдокласс
:checked
+ соседний селектор меняет стиль при выборе.Стильно, модно, молодёжно)
Код лежит здесь.
🔥16👍9❤7
Бесконечная карусель без JS
Т.к. мы будем делать карусель только на HTML и CSS, то давайте сделаем это с помощью дублирования карточек + анимации
Создадим в
Добавим в CSS анимацию:
Когда анимация достигает -50%, она возвращается к 0% (благодаря
Такая фишка отлично зайдет на лендингах, где есть карусель партнеров с их логотипами и т.п.)
Посмотреть код можно здесь.
Т.к. мы будем делать карусель только на HTML и CSS, то давайте сделаем это с помощью дублирования карточек + анимации
translateX(-50%)
.Создадим в
.items
два одинаковых блока изображений:<div class="items">
<!-- Первый набор (оригиналы) -->
<img src="image1.jpg" class="item">
<img src="image2.jpg" class="item">
<!-- ... всего 7 изображений ... -->
<!-- Второй набор (точные копии) -->
<img src="image1.jpg" class="item">
<img src="image2.jpg" class="item">
<!-- ... ещё 7 таких же ... -->
</div>
Добавим в CSS анимацию:
.items {
display: flex;
animation: slide 50s linear infinite;
}
@keyframes slide {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
Когда анимация достигает -50%, она возвращается к 0% (благодаря
infinite
), но глаз этого не замечает, потому что дубликаты идентичны оригиналам.Такая фишка отлично зайдет на лендингах, где есть карусель партнеров с их логотипами и т.п.)
Посмотреть код можно здесь.
🔥21🗿4👍3🤝1
Делаем отступы только между элементами списка
Простое и эффективное решение, если нужно добавить отступы между пунктами списка, но так, чтобы не было лишних отступов сверху или снизу.
Используем селектор
Если не любим
Или Flexbox + gap:
Но мне больше нравится первый вариант)
Пример кода здесь.
Простое и эффективное решение, если нужно добавить отступы между пунктами списка, но так, чтобы не было лишних отступов сверху или снизу.
Используем селектор
li + li
— он применяет стиль ко всем элементам li
, кроме первого:li + li {
margin-top: 35px; /* Отступ сверху для всех, кроме первого */
}
Если не любим
li + li
, то можно :not(:last-child)
:li:not(:last-child) {
margin-bottom: 35px;
}
Или Flexbox + gap:
ul {
display: flex;
flex-direction: column;
gap: 35px; /* Отступ между элементами */
}
Но мне больше нравится первый вариант)
Пример кода здесь.
👍18✍7❤2🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Простая кнопка "Наверх"
Сегодня разберём, как сделать кнопку "Наверх", добавим немного JS, чтобы кнопка появлялась только после прокрутки вниз.
HTM:
Плавный скролл:
Сама кнопка:
Добавляем класс
JS:
Отслеживаем прокрутку окна. Если прокрутили больше чем на 300px — добавляем класс
Ну и в целом все, мы получили стильную, функциональную кнопку "наверх", как в лучших UI)
Код лежит здесь.
Сегодня разберём, как сделать кнопку "Наверх", добавим немного JS, чтобы кнопка появлялась только после прокрутки вниз.
HTM:
<a href="#" class="up-button" id="upBtn">
<svg viewBox="0 0 24 24">
<path d="M5 15l7-7 7 7" />
</svg>
</a>
Плавный скролл:
html {
scroll-behavior: smooth;
}
Сама кнопка:
position: fixed
— всегда внизу справа.opacity: 0; pointer-events: none;
— по умолчанию невидима и неактивна.display: flex + align/justify
— центрируем стрелку внутри.Добавляем класс
.show
, кнопка становится видимой:.up-button.show {
opacity: 1;
}
JS:
const btn = document.getElementById('upBtn');
window.addEventListener('scroll', () => {
btn.classList.toggle('show', window.scrollY > 300);
});
Отслеживаем прокрутку окна. Если прокрутили больше чем на 300px — добавляем класс
.show
, и кнопка появляется. Если вернулись вверх — прячем.Ну и в целом все, мы получили стильную, функциональную кнопку "наверх", как в лучших UI)
Код лежит здесь.
🔥29👍18❤5
This media is not supported in your browser
VIEW IN TELEGRAM
Делаем кастомную иконку <summary>
Если требуется изменить стандартную иконку треугольника, на что то свое, то для этого можно использовать псевдоэлемент
Убираем стандартный треугольник:
Добавляем кастомную иконку:
Если надо, то добавляем анимацию поворота:
Кстати, также можно запилить и SVG:
И всё, дизайнеры будут довольны)
Пример, как всегда здесь.
Если требуется изменить стандартную иконку треугольника, на что то свое, то для этого можно использовать псевдоэлемент
::before
, давайте разберем подробно.Убираем стандартный треугольник:
details summary {
list-style: none;
}
Добавляем кастомную иконку:
details summary::before {
content: "➜"; /* Наша кастомная иконка */
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
transition: transform 0.2s ease;
}
Если надо, то добавляем анимацию поворота:
details[open] summary::before {
transform: translateY(-50%) rotate(90deg);
}
Кстати, также можно запилить и SVG:
details summary::before {
content: "";
background: url("data:image/svg+xml,<svg...>") no-repeat center;
width: 16px;
height: 16px;
}
И всё, дизайнеры будут довольны)
Пример, как всегда здесь.
👍28👌5🔥4