3061
Шлёпаем формы и красим кнопки... Блог про фронтенд — просто, понятно и с юмором. Всех обнял, приподнял, пошел пилить для вас годноту) Связь: @advertos
Генератор бесшовных паттернов
Если фон блока или страницы нужно сделать "повеселее", чем просто однотонный цвет или градиент. В таких ситуациях отлично подходят паттерны.
Есть простой и бесплатный инструмент Patternico, который генерирует бесшовные паттерны онлайн прямо в браузере.
Принцип работы очень прост:
■ выбираем фон и элементы;
■ настраиваем размеры, прозрачность, цвета;
■ загружаем свои изображения, иконки или Emoji;
■ получаем готовый паттерн в формате изображения.
После генерации скачиваем паттерн и добавляем его как фон через CSS:
body {
background-image: url("pattern.png");
background-repeat: repeat;
}
Стилизация списка точками с линией
Всем привет! Надеюсь, удалось хорошенько отдохнуть на праздниках) Будем потихоньку возвращаться в рабочий режим.
Сегодня рассмотрим нестандартный подход к оформлению списков. Вместо обычных точек создадим визуально связанную цепочку пунктов.
HTML:
<ul>
<li>Первый пункт</li>
<li>Второй пункт</li>
</ul>
ul {
list-style: none;
padding: 0;
}
li {
padding-left: 2em;
padding-bottom: 1em;
position: relative;
}:before — для цветных точек:li:before {
content: "";
position: absolute;
left: 0.5em;
top: 0.5em;
width: 10px;
height: 10px;
background: #f09;
border-radius: 50%;
}:after — для вертикальных соединительных линий между пунктами:li:not(:last-child):after {
content: "";
position: absolute;
left: 0.5em;
top: 0.5em;
width: 2px;
height: 100%;
background: #f09;
transform: translateX(4px);
}transform: translateX(4px) смещает линию шириной 2px на 4px вправо, чтобы она прошла точно по центру точки 10px. Формула: (10 - 2) / 2 = 4.top: 0.5em (как и точка), но визуально точка перекрывает её начало. Поэтому кажется, что линия выходит из-под точки.:not(:last-child) убирает линию у последнего пункта.
Декоративные линии в заголовках на CSS
Для выделения заголовков иногда используется прием с декоративными линиями слева, справа или с обеих сторон. Давайте рассмотрим, как это можно реализовать.
HTML:
<h1>Title #1</h1>
<p>Lorem ipsum dolor sit amet</p>
<h1>Title #2</h1>
<p>Lorem ipsum dolor sit amet</p>
<h1>Title #3</h1>
<p>Lorem ipsum dolor sit amet</p>
h1 {
display: flex;
align-items: center;
gap: 0.5em;
}
h1::before,
h1::after {
content: '';
flex: 1;
height: 2px;
background: #000;
}display: flex превращает заголовок в flex-контейнер.gap: 0.5em создаёт отступ между текстом и линиями.::before и ::after создают линии.flex: 1 растягивает линии на всё доступное пространство./* Линия только справа */
h1:first-of-type::before {
display: none;
}
/* Линия только слева */
h1:nth-of-type(2)::after {
display: none;
}
Переключатель размера шрифта на CSS
Видели на сайтах кнопки или ссылки для изменения размера шрифта? Давайте сегодня разберем, как сделать нечто подобное, используя "трюк с радиокнопками".
HTML:
<input id="size-small" type="radio" name="size">
<label for="size-small">Small</label>
<!-- + medium, large... -->
<section>
<p>Ваш текст...</p>
</section>
input[name="size"] {
display: none;
}
input[name="size"]:checked + label {
border-bottom: 2px solid #3498db;
}#size-small:checked ~ section {
font-size: 0.9rem;
}
#size-large:checked ~ section {
font-size: 1.1rem;
}
Градиентная тень для текста
Сегодня разберем интересный трюк: как создать текст с градиентной тенью. Реализация очень необычная получается)
HTML:
<h1>Формошлёп</h1>
h1 {
font-family: sans-serif;
font-size: 10vw;
background: linear-gradient(4deg, #548cff 10%, #f900bf 90%);
-webkit-text-fill-color: transparent;
background-clip: text;
text-shadow: -0.08em -0.08em #fff;
}background: linear-gradient() — создаём градиент.-webkit-text-fill-color: transparent — делаем заливку текста прозрачной.background-clip: text — обрезаем фон по форме букв.text-shadow: -0.08em -0.08em #fff; — добавляем белую тень, смещённую влево-вверх с помощью отрицательных значений.
Счетчик отмеченных чекбоксов на CSS
Сегодня давайте рассмотрим, как сделать визуальный счетчик отмеченных чекбоксов вообще без JS — на чистом CSS.
HTML:
<div class="wrapper">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<span>=</span>
<output></output>
</div>
<output>, куда будем выводить число..wrapper {
counter-reset: total;
}counter-reset: total создает переменную-счетчик с именем total.input:checked {
counter-increment: total;
}:checked увеличивает счетчик total на единицу.output::before {
content: counter(total);
}::before вставляет содержимое перед <output>. Функция counter(total) возвращает текущее значение счетчика — и оно автоматически обновляется при изменении.
Добавляем иконку к внешним ссылкам с помощью CSS
Давайте разберем, как автоматически добавлять иконку к ссылкам, которые открываются в новой вкладке. Чтобы пользователи сразу видели, какие ссылки уводят их на другие сайты.
HTML:
<a href="https://example.com" target="_blank">Эта ссылка открывается в новой вкладке</a>
<a href="https://example.com">А эта ссылка нет</a>
a[target="_blank"]::after {
content: url(external-link.svg);
display: inline-block;
margin-left: 0.2em;
width: 1em;
height: 1em;
}a[target="_blank"]::after:target="_blank".::after создает псевдоэлемент после содержимого ссылки.content: url(external-link.svg) — загружаем SVG-иконку.target="_blank" будут автоматически получать иконку внешней ссылки)
Библиотека готовых UI-компонентов
На днях наткнулся на очень годную штуку, которой прям грех не поделиться.
Uiverse.io - огромная, постоянно пополняемая, коллекция готовых UI-элементов:
■ Кнопки
■ Чекбоксы
■ Карточки
■ Формы
■ Лоадеры
И многое другое, в самых разных стилях: от минимализма до неоморфизма.
Причем это не просто статичные блоки, а полноценные компоненты с анимациями и hover-эффектами.
Всё под лицензией MIT, так что можно использовать хоть в личных проектах, хоть в коммерческих.
В общем, uiverse.io - отличный ресурс для тех, кто хочет вдохновиться, научиться чему-то новому или ускорить процесс разработки)
Спойлер на CSS с эффектом размытия
Давайте сегодня разберём, как создать спойлер с размытым текстом без JS, с помощью HTML-элемента <details>.
Сделаем спойлер, где текст виден сразу, но размыт. При клике на кнопку размытие плавно исчезает.
HTML:
<details>
<summary>Открыть спойлер</summary>
<p>Разработке невозможно научиться раз и навсегда. Учиться придется всю жизнь..</p>
</details>
details {
width: 100%;
max-width: 400px;
background: white;
padding: 2rem;
border-radius: 12px;
}summary {
padding: 12px 16px;
cursor: pointer;
border: 1px solid #e0e0e0;
border-radius: 6px;
background: #f8f9fa;
list-style: none;
}details:not([open])::details-content {
filter: blur(5px);
content-visibility: visible;
}
::details-content {
margin-top: 0;
transition: filter 0.3s ease;
}::details-content получает blur(5px) и content-visibility: visible, текст виден, но размыт.open добавляется к <details>, селектор :not([open]) перестаёт работать.transition.
Волновая анимация текста
Сегодня разберём, как создать эффектную волновую анимацию текста без JS — только HTML и CSS.
HTML:
<div class="waviy">
<span style="--i:1">Ф</span>
<span style="--i:2">О</span>
<span style="--i:3">Р</span>
<span style="--i:4">М</span>
<span style="--i:5">О</span>
<span style="--i:6">Ш</span>
<span style="--i:7">Л</span>
<span style="--i:8">Ё</span>
<span style="--i:9">П</span>
</div>
<span> с CSS-переменной --i, которая определяет порядковый номер буквы..waviy span {
display: inline-block;
animation: waviy 1s infinite;
animation-delay: calc(.1s * var(--i));
}display: inline-block — превращает строчный элемент в блочный, сохраняя поведение строки, это позволяет буквам двигаться, но оставаться в одной строке.animation: waviy 1s infinite — запускает анимацию с именем waviy, длительность 1 секунда, повторяется бесконечно (infinite).animation-delay: calc(.1s * var(--i)) — волна:var(--i) берёт значение из HTML (style="--i:1")calc() умножает: для 1-й буквы 0.1s * 1 = 0.1s, для 2-й 0.1s * 2 = 0.2s@keyframes waviy {
0%, 40%, 100% { transform: translateY(0) }
20% { transform: translateY(-20px) }
}
Стильный hover cards эффект
Иногда нужно статичные карточки оживить и превратить их в интерактивные элементы, которые при ховере раскрывают доп. информацию.
Давайте сегодня разберем один из таких эффектов.
HTML:
<div class="card from-bottom">
<div class="front-content">Снизу ↑</div>
<div class="content">
<p class="heading">From Bottom</p>
<p>Описание скрытого контента...</p>
</div>
</div>
front-content (видимый слой) + content (скрытый контент)./* Снизу → Вверх */
.card.from-bottom .content {
transform: translate(0, 96%);
}
.card.from-bottom:hover .content {
transform: translate(0, 0);
}
content въезжает, front-content уезжает на 30% и исчезает:.card.from-bottom:hover .front-content {
transform: translate(0, -30%);
}
Интерактивная кнопка поиска
Недавно, в этом посте, мы разбирали, как делать скрытую кнопку поиска, которая появляется только когда юзер начинает вводить текст. Но есть и другой подход: кнопка видна изначально, но если текста нет — она просто неактивна. Давайте разберем, как это реализовать.
HTML:
<div class="input-container">
<input type="search" required placeholder="Введите запрос">
<input type="submit" value="Поиск" class="search-btn">
</div>
.input-container {
display: flex;
align-items: center;
height: 2.5rem;
width: 100%;
max-width: 20rem;
background-color: #fff;
border-radius: 0.5rem;
padding: 0.35rem;
}/* Исходное состояние - неактивная кнопка */
.search-btn {
background-color: gray;
opacity: 0.5;
pointer-events: none;
}
/* Активное состояние, когда в поле есть текст */
.input-container input[type="search"]:not(:placeholder-shown) + .search-btn {
background-color: #483D8B;
opacity: 1;
pointer-events: auto;
}
:not(:placeholder-shown) срабатывает, когда placeholder не отображается (то есть в поле есть текст).+ — соседний комбинатор, выбирает следующий элемент (нашу кнопку), меняет цвет, убирает прозрачность и включает кликабельность.
Shortcut-домены с .new
Если вы часто тестируете код в CodePen или CodeSandbox, создаете заметки в Google Документах или фиксируете данные в Google Таблицах, то для этого дела удобно использовать специальные домены .new.
.new — домен верхнего уровня для быстрого создания нового контента. По сути, это аналог комбинации Ctrl+N или меню "File → New" в офлайн-приложениях, но для веба.
Принцип простой: набираем короткий адрес, моментально попадаете в редактор или форму создания.
Для разработки:
■ pen.new → Пустой CodePen
■ js.new → JavaScript-окружение в CodeSandbox
■ react.new → React-проект в CodeSandbox
■ vue.new → Vue-проект в CodeSandbox
■ nodejs.new → Node.js-окружение в CodeSandbox
Документы Google:
■ docs.new → Новый Google Документ
■ sheets.new → Новая Google Таблица
■ slides.new → Новая Google Презентация
Полный список всех доступных сокращений можно найти здесь: whats.new/shortcuts
Маленькая, но приятная оптимизация, экономим секунды, которые за год складываются в часы чистого времени)
Эффектное выделение слов в тексте
Иногда нужно сделать акцент на каком-нибудь слове. Давайте разберём технику с декоративным SVG-подчеркиванием.
HTML:
<p>Эффектное <span class="fancy">выделение</span> слов</p>
.fancy {
position: relative;
white-space: nowrap;
}position: relative привязывает подчёркивание к слову, white-space: nowrap запрещает перенос..fancy::after {
content: "";
position: absolute;
inset: auto 0 -0.2em;
height: 0.3125em;
background: url("data:image/svg+xml,%3Csvg...") 0 / auto 100% round;
}inset: auto 0 -0.2em — растягивает подчёркивание на всю ширину и опускает ниже текста.height: 0.3125em — высота линии в em, масштабируется с текстом.stroke='%2300FDCF'. Можно использовать и другие формы — волны, зигзаги, пунктиры.
Друзья, год подходит к концу, и хочу сказать спасибо, что вы здесь. Спасибо за ваши вопросы, обсуждения и поддержку)
Желаю всем в Новом году крепкого здоровья, денег нескончаемый поток и проектов, в которые хочется возвращаться по понедельникам)
Отличных праздников и до встречи в 2026-м!
Монументальный учебник по фронтенду и не только
Если вы уже подустали от многочасовых обучающих видосов по фронтенду, то у меня есть для вас кое-что)
Очень крутой учебник от Дмитрия Трепачёва — https://code.mu/ru/
Не просто ещё один сайт с уроками. Это структурированный учебный портал, от самых основ вёрстки до фреймворков React, Vue и Angular.
Весь материал разделён на учебники, справочники и задачники, можно изучать теорию и сразу закреплять её на практике.
В общем — крайне советую)
Адаптивные разделители для меню
Давайте сегодня разберем, как сделать адаптивные разделители, чтобы, когда у нас широкий контейнер (горизонтальное меню) — разделители были вертикальными, а когда контейнер узкий (вертикальное меню) — разделители горизонтальные.
HTML:
<div class="demo-container">
<nav>
<ul>
<li>Первый</li>
<li>Второй</li>
<li>Третий</li>
<li>Четвертый</li>
</ul>
</nav>
</div>
nav ul {
list-style: none;
margin: 0;
padding: 0;
display: grid;
grid-auto-flow: row;
}nav li:not(:first-child) {
border-top: 1px solid white;
}@container (width > 600px) {
nav ul {
grid-auto-flow: column;
}
nav li:not(:first-child) {
border-top: none;
border-left: 1px solid white;
}
}
Frontend roadmap на русском
Думаю многие знают про https://roadmap.sh/frontend, но мало кто знает, что есть и неплохой frontend roadmap на русском языке.
Собственно вот — https://vallek.github.io/frontend-roadmap-ru/
Все структурированно, красиво, интерактивно, с кучей ссылок, в общем, все как нужно, надеюсь пригодится)
Показываем URL рядом со ссылкой
Давайте рассмотрим простой, но эффектный приём — как автоматически показывать адрес ссылки прямо в тексте. Используется это дело нечасто, но может пригодится там, где юзеру нужно видеть, куда ведет ссылка.
HTML:
<p>
Идите в <a href="https://www.google.com/">Google</a>,
если вам нужно найти какую-либо информацию😎
</p>
a::after {
content: ' → ' attr(href);
opacity: 0.8;
font-size: 20px;
}a::after — создаем псевдоэлемент после содержимого ссылки.content: ' → ' attr(href) — добавляем стрелку → для визуального разделения.attr(href) — функция CSS, которая вытаскивает значение атрибута href.attr(href).word-break: break-all; для нормального переноса.
Интересная обнова на Хабре
Заглянул на досуге на Хабр, полистать статьи. Сижу, значит, листаю-читаю и вижу в блоках с кодом кнопку "Объяснить код с SourceCraft". Раньше вроде не замечал её. Ради интереса кликнул — интересная фича, должен заметить)
Теперь, если вы читаете статью и не можете разобрать код автора, так, что даже его пояснения в статье не помогают, то можно кликнуть кнопку и почитать объяснение этого кода от ИИ.
Я немного потестил, довольно годные объяснения получаются.
Так что, если давно не были на Хабре или не в курсе новинки, то можете зайти и заценить)
Gooey-эффект: плавное слияние текста на CSS
Вы наверняка видели на лендингах эффект, когда один текст буквально перетекает в другой. Это называется gooey effect (эффект липкости), давай сделаем нечто подобное.
HTML:
<section>
<h1>HTML</h1>
<h1>CSS</h1>
</section>
section {
display: grid;
place-items: center;
}
section > * {
grid-area: 1 / 1;
}h1 занимают одну и ту же ячейку грида (1 / 1).h1 {
font-size: 13vw;
animation: fade 4s infinite;
animation-timing-function: linear(1 45%, 0 55% 90%, 1);
}
h1:nth-child(2) {
animation-timing-function: linear(0 45%, 1 55% 90%, 0);
}
@keyframes fade {
from { opacity: 0 }
to { opacity: 1 }
}section {
background: white;
animation: gooey 4s infinite;
animation-timing-function: linear(0, 0 45%, 1 50%, 0 55% 90%, 1 95%, 0);
}
@keyframes gooey {
to { filter: blur(10px) contrast(30); }
}contrast работает с цветовыми границами.blur(10px) — размывает границы букв.contrast(30) — резко повышает контраст, превращая размытые края в чёткие.
Классная коллекция градиентов
Если вы тоже много времени тратите на подбор идеального градиента для фона, то у меня есть кое что для вас)
Gradient Hunt — это коллекция красивых градиентов, которая постоянно обновляется. Тысячи трендовых цветовых переходов на любой вкус, и главное — с готовым CSS-кодом.
Там градиенты на любой случай жизни:
■ Яркие и сочные для креативных проектов.
■ Нежные пастельные для минималистичных дизайнов.
■ Темные и контрастные для современных интерфейсов.
■ Классические двухцветные переходы.
■ Сложные многоцветные композиции.
Каждый градиент — это готовый linear-gradient() с подобранными цветами и углами наклона.
В общем вот - https://gradienthunt.com/
Инпуты в стиле Material Design
Давайте сегодня разберем, как еще добавить интерактивности в формы без JS. Добавим плавающие labels при фокусе, анимированную нижнюю границу и placeholder, который появляется только при фокусе.
HTML:
<div class="mat-input">
<label for="name">Имя Фамилия</label>
<input id="name" type="text" placeholder="Иван Иванов">
</div>
.mat-input {
position: relative; /* для абсолютного позиционирования label */
}
.mat-input input {
border: 0;
border-bottom: 2px solid #8c8c8c;
padding: 1.8em 0.75em 0.75em; /* место для label сверху */
transition: 0.2s;
}label:.mat-input label {
position: absolute;
top: 1.4em; /* по центру инпута */
left: 0.75em;
pointer-events: none; /* клики проходят сквозь label */
transition: 0.2s;
}.mat-input:has(input:focus) label,
.mat-input:not(:has(input:placeholder-shown)) label {
top: 0.75em;
font-size: 0.75em;
}
:has(input:focus) — label поднимается при фокусе:not(:has(input:placeholder-shown)) — label остаётся вверху, когда поле заполненоplaceholder:.mat-input input::placeholder {
opacity: 0;
}
.mat-input input:focus::placeholder {
opacity: 1; /* показываем только при фокусе */
}:has() для стилизации родителя и ::placeholder-shown для определения заполненности поля)
Видео-шпаргалка по основам Flexbox
Нашел еще одну приколдесную шпаргалку, очень наглядно и понятно, разбираются основные свойства:
■ flex-direction
■ flex-wrap
■ justify-content
■ align-items
■ align-content
■ order
■ flex-grow
■ flex-shrink
■ flex-basis
■ align-self
Сохраняем в коллекцию)
Разделители между элементами списка
Довольно частая задача, создать вертикальный список с разделителями между элементами, кроме последнего. Давайте разберем, как это можно реализовать.
HTML:
<ul>
<li>Первый элемент</li>
<li>Второй элемент</li>
<li>Третий элемент</li>
<li>Четвертый элемент</li>
</ul>
ul {
list-style-type: none;
padding: 0;
}
li {
font-size: 1.25rem;
padding: 1rem 0;
}
li:not(:last-of-type) {
border-bottom: 4px solid tomato;
}li, кроме последнего получают нижнюю границу.li {
border-bottom: 4px solid tomato;
}
li:last-child {
border-bottom: none;
}li + li {
border-top: 4px solid tomato;
}+ выбирает элемент, идущий сразу после указанного. То есть "каждый li, перед которым есть другой li" получает границу сверху.gap:ul {
display: flex;
flex-direction: column;
list-style-type: none;
padding: 0;
gap: 4px;
background: tomato;
}
li {
background: white;
padding: 1rem 0;
}gap создает промежутки между flex-элементами. Цвет фона ul просвечивает через эти промежутки.:not(:last-of-type) — самый читаемый вариант)
Круговые диаграммы на чистом CSS
Если на странице нужно сверстать простенькую круговую диаграмму, то можно не спешить запиливать спец. библиотеки и т.п. Можно попробовать решить это с помощью conic-gradient().conic-gradient() — CSS-функция, которая создаёт градиент, который вращается вокруг центральной точки (как циферблат часов).
Диаграмму на 30% / 40% / 30% можно нарисовать так:
Через градусы:
background: conic-gradient(
#ff6384 0deg 108deg, /* 30% = 108° */
#36a2eb 108deg 252deg, /* 40% = 144° */
#ffce56 252deg 360deg /* 30% = 108° */
);
background: conic-gradient(
#ff6384 0% 30%,
#36a2eb 30% 70%,
#ffce56 70% 100%
);
Стилизация select option
Бывает необходимость добавить для select кастомные стили, чтобы он не выбивался из дизайна. Давайте разберем, как в целом это можно сделать.
HTML:
<div class="select">
<select name="slct" id="slct">
<option>-- Выберите вариант --</option>
<option value="1">Вариант 1</option>
<!-- остальные options -->
</select>
</div>
select в div для дополнительного контроля над стилями.select {
appearance: none;
border: 0;
outline: 0;
background: transparent;
}.select {
position: relative;
overflow: hidden;
background: #2c3e50;
border-radius: 0.25em;
}overflow: hidden обрезает стандартную стрелку браузера..select::after {
content: "▼";
position: absolute;
right: 0;
pointer-events: none; /* Клики проходят сквозь стрелку */
background: #34495e;
}pointer-events: none позволяет кликать "сквозь" псевдоэлемент на сам селект.select:select {
width: 100%;
padding: 0 3em 0 1em; /* Отступ справа под стрелку */
cursor: pointer;
}padding (3em) освобождает место для нашей кастомной стрелки.select option {
background-color: #2c3e50;
color: white;
}select)