This media is not supported in your browser
VIEW IN TELEGRAM
Если вас кто-то спросит, что такое div с классом wrapper)
😁46👏4🗿4❤1
Стилизация кнопки выбора файла
Раньше, для того, чтобы поменять стили для кнопки загрузки файлов, приходилось скрывать стандартный
Но теперь в современных браузерах появилась поддержка псевдоэлемента
Разметка:
Стилизация:
Согласитесь, стало удобнее)
Поддержку браузерами можно глянуть здесь.
Ну, а сам код из примера ждёт вас тут.
Раньше, для того, чтобы поменять стили для кнопки загрузки файлов, приходилось скрывать стандартный
input
и запиливать свою красивую кнопку. Т.к. браузеры ограничивают возможности прямой стилизации этой кнопки.Но теперь в современных браузерах появилась поддержка псевдоэлемента
::file-selector-button
, который дает возможность стилизовать эту кнопку)Разметка:
<input type="file" class="styled-file-input" />
Стилизация:
.styled-file-input::file-selector-button {
background-color: #4CAF50;
color: white;
padding: 10px 15px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s ease;
}
Согласитесь, стало удобнее)
Поддержку браузерами можно глянуть здесь.
Ну, а сам код из примера ждёт вас тут.
🔥39👍16❤3
Надеюсь, вы ответите именно так, после прочтения этого поста)
Наш канал вырос до 3000 подписчиков, вашу активность, вопросы и поддержку я ценю больше всего — это то, что делает наш канал таким уютным и живым!
Поэтому сейчас хочу открыто поделиться планами по развитию нашего канала.
Чтобы канал рос дальше и становился еще лучше, мне нужно покупать рекламу, а для этого нужны деньги.
Поэтому буду иногда размещать рекламные посты в нашем канале, такой вот круговорот)
Но не переживайте, рекламы будет немного, максимум пару постов в неделю)
Без спама и мусора, только по нашей теме.
Многие из вас, тоже пришли сюда через рекламу, и это нормально, так работает развитие.
Если есть вопросы, критика или предложения — всегда готов обсудить)
Наш канал вырос до 3000 подписчиков, вашу активность, вопросы и поддержку я ценю больше всего — это то, что делает наш канал таким уютным и живым!
Поэтому сейчас хочу открыто поделиться планами по развитию нашего канала.
Чтобы канал рос дальше и становился еще лучше, мне нужно покупать рекламу, а для этого нужны деньги.
Поэтому буду иногда размещать рекламные посты в нашем канале, такой вот круговорот)
Но не переживайте, рекламы будет немного, максимум пару постов в неделю)
Без спама и мусора, только по нашей теме.
Многие из вас, тоже пришли сюда через рекламу, и это нормально, так работает развитие.
Если есть вопросы, критика или предложения — всегда готов обсудить)
4👍48👌25❤11
This media is not supported in your browser
VIEW IN TELEGRAM
Скрываем текст на кнопках при нехватке места
Иногда в карточках бывает несколько кнопок в ряд, при адаптиве их нельзя переносить одну под другую, а если просто уменьшать их размер, то это выглядит мягко говоря не очень.
Выходом может быть скрытие текста кнопки и отображение только ее иконки, чтобы было понятно, что это вообще за кнопка)
Следить за моментом, когда нужно скрывать текст, удобно с помощью контейнерных запросов (container queries).
Просто указываем при каком размере контейнера скрыть текст и все:
Container queries следят за размером карточки и скрывают текст, когда места мало.
Кнопки всегда выглядят аккуратно, не ломаются и не переносят текст.
Затестить код можно здесь.
Иногда в карточках бывает несколько кнопок в ряд, при адаптиве их нельзя переносить одну под другую, а если просто уменьшать их размер, то это выглядит мягко говоря не очень.
Выходом может быть скрытие текста кнопки и отображение только ее иконки, чтобы было понятно, что это вообще за кнопка)
Следить за моментом, когда нужно скрывать текст, удобно с помощью контейнерных запросов (container queries).
Просто указываем при каком размере контейнера скрыть текст и все:
.card {
container-type: inline-size; /* Превращаем элемент в контейнер для адаптивных стилей */
}
@container (max-width: 320px) {
.btn-text {
display: none; /* Скрываем текст */
}
}
Container queries следят за размером карточки и скрывают текст, когда места мало.
Кнопки всегда выглядят аккуратно, не ломаются и не переносят текст.
Затестить код можно здесь.
👍41🔥17👎2
Основные способы добавить иконку в input
Иногда требуется отображать в
1) Background-image
Самый простой способ, всего одно CSS-правило, но не самый гибкий.
2) Псевдоэлемент ::before
Тоже простой способ, но поскольку к
3) Отдельный SVG
Добавляется дополнительная разметка, но имеем полную гибкость — меняем цвет через
В общем можно подобрать нужный способ по ситуации)
Пощупать код можно здесь.
Иногда требуется отображать в
input
иконку поиска и т.п., собрал здесь 3 основных способа сделать это)1) Background-image
.bg-icon {
background-image: url('...');
background-repeat: no-repeat;
background-position: 10px center;
background-size: 16px;
}
Самый простой способ, всего одно CSS-правило, но не самый гибкий.
2) Псевдоэлемент ::before
.wrapper::before {
content: "";
background-image: url('...');
position: absolute;
}
Тоже простой способ, но поскольку к
input
не может иметь псевдоэлементы, то требуется обёртка.3) Отдельный SVG
<div class="input-wrapper">
<input type="text">
<svg class="icon">...</svg>
</div>
Добавляется дополнительная разметка, но имеем полную гибкость — меняем цвет через
fill
, анимируем, добавляем hover-эффекты и т.п.В общем можно подобрать нужный способ по ситуации)
Пощупать код можно здесь.
👍26🔥16
Автоотступ для выравнивания элементов
При верстке часто возникает задача — разместить несколько элементов в строку, а один из них вытолкнуть, чтобы он не зависел от остальных.
Например: логотип, меню и кнопка входа справа.
Flexbox с этим делом справляется на ура)
Разберем на примере:
Контейнеру зададим
Браузер заполнит всё свободное пространство слева от элемента, тем самым выталкивая его вправо.
Пример можно увидеть здесь.
При верстке часто возникает задача — разместить несколько элементов в строку, а один из них вытолкнуть, чтобы он не зависел от остальных.
Например: логотип, меню и кнопка входа справа.
Flexbox с этим делом справляется на ура)
Разберем на примере:
<div class="header">
<div class="logo header-block">лого</div>
<div class="menu header-block">меню</div>
<div class="login header-block">вход</div>
</div>
Контейнеру зададим
display: flex
, а чтобы блок <div class="login header-block">вход</div>
отлетел вправо, добавим ему margin-left: auto
..header {
display: flex;
}
.header-block {
display: flex;
align-items: center;
justify-content: center;
}
.login {
margin-left: auto;
width: 100px;
}
Браузер заполнит всё свободное пространство слева от элемента, тем самым выталкивая его вправо.
Пример можно увидеть здесь.
👍20🔥5❤3
Шпаргалка по Emmet
Все знают про Emmet и про то, как он ускоряет процесс верстки. Но обычно в работе используется лишь малая часть того, что он позволяет делать.
Конечно, все его сокращения запомнить трудно, поэтому вот вам официальная шпаргалка — https://docs.emmet.io/cheat-sheet/
Освежите в памяти или может быть, найдете то, что раньше не замечали.
Там же есть ссылка pdf, если нужно распечатать)
Все знают про Emmet и про то, как он ускоряет процесс верстки. Но обычно в работе используется лишь малая часть того, что он позволяет делать.
Конечно, все его сокращения запомнить трудно, поэтому вот вам официальная шпаргалка — https://docs.emmet.io/cheat-sheet/
Освежите в памяти или может быть, найдете то, что раньше не замечали.
Там же есть ссылка pdf, если нужно распечатать)
👍17🔥8❤4😐1
This media is not supported in your browser
VIEW IN TELEGRAM
Как владельцы макбуков в модной кофейне видят твой Lenovo)
😁57❤8🔥5🗿2😐1
This media is not supported in your browser
VIEW IN TELEGRAM
Аккордеон на чистом HTML и CSS
Сделаем такой аккордеон, чтобы одновременно был открыт только один элемент. В этом нам поможет старый добрый
Будем использовать атрибут
И еще добавим атрибут
Получаем такой код:
Благодаря одинаковому значению атрибута name, браузер сам позаботится о том, чтобы одновременно был открыт только один элемент — отлично подходит для разделов FAQ на лендингах)
Поддержку браузерами можно посмотреть тут.
Код из примера можно найти здесь.
Сделаем такой аккордеон, чтобы одновременно был открыт только один элемент. В этом нам поможет старый добрый
<details>
, но с улучшением)Будем использовать атрибут
name
, который превращает <details>
в группу элементов.И еще добавим атрибут
open
у первого элемента, чтобы сделать его раскрытым по умолчанию.Получаем такой код:
<div class="accordion">
<details name="my-accordion" open>
<summary>Первый пункт</summary>
<div class="content">
<p>Текст</p>
</div>
</details>
<details name="my-accordion">
<summary>Второй пункт</summary>
<div class="content">
<p>Текст</p>
</div>
</details>
</div>
Благодаря одинаковому значению атрибута name, браузер сам позаботится о том, чтобы одновременно был открыт только один элемент — отлично подходит для разделов FAQ на лендингах)
Поддержку браузерами можно посмотреть тут.
Код из примера можно найти здесь.
🔥27👍17❤3
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