Свойство
position управляет тем, как элементы располагаются на странице и относительно чего происходит их смещение.Например,
relative позволяет сдвигать элемент относительно его обычного положения, absolute позиционирует элемент относительно ближайшего позиционированного родителя.Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥12👍9
Оптимизируем вертикальные отступы между элементами!
Часто в верстке нужно просто равномерное расстояние между элементами: абзацами, карточками, пунктами списка, блоками формы. Обычно делают так — добавляют
Проблема в том, что у последнего элемента остаётся лишний отступ, и начинается возня с
Есть более чистый паттерн, который используют в дизайн-системах:
Селектор
То есть первый элемент отступа не получает, а все остальные получают автоматически:
🔥 Это делает верстку чище, элементы можно добавлять, удалять, менять местами, и расстояния всегда остаются корректными.
📣 Code Ready | #совет
Часто в верстке нужно просто равномерное расстояние между элементами: абзацами, карточками, пунктами списка, блоками формы. Обычно делают так — добавляют
margin-bottom каждому элементу..item {
margin-bottom: 1rem;
}Проблема в том, что у последнего элемента остаётся лишний отступ, и начинается возня с
:last-child.Есть более чистый паттерн, который используют в дизайн-системах:
.stack > * + * {
margin-top: 1rem;
}Селектор
* + * означает: любой элемент, который идёт сразу после другого элемента.То есть первый элемент отступа не получает, а все остальные получают автоматически:
.form > * + * {
margin-top: 1.2rem;
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥14❤11
👍18🔥11🤝9😁3❤2
matchMedia — проверка и отслеживание media queries!
Функция возвращает объект
Базовое использование:
Пример 1 — проверка условия:
Так можно адаптировать поведение интерфейса под системные настройки пользователя.
Пример 2 — отслеживание изменения
Событие
Это позволяет реагировать на изменение состояния
Пример 3 — адаптация логики интерфейса:
Обработчик сначала вызывается вручную для установки начального состояния, затем автоматически при изменении
Пример 4 — учет пользовательских настроек доступности:
Пример 5 — отслеживание ориентации экрана:
🔥
📣 Code Ready | #практика
matchMedia() — Web API, позволяющий проверять и отслеживать media queries напрямую из JavaScript. Это помогает синхронизировать поведение JS-кода с CSS-адаптивностью.Функция возвращает объект
MediaQueryList, содержащий результат проверки media query.Базовое использование:
const media = window.matchMedia('(max-width: 768px)');
console.log(media.matches);matches — boolean, показывающий соответствует ли текущий viewport заданному media query.Пример 1 — проверка условия:
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.body.classList.add('dark-theme');
}Так можно адаптировать поведение интерфейса под системные настройки пользователя.
Пример 2 — отслеживание изменения
media query:const media = window.matchMedia('(max-width: 768px)');
media.addEventListener('change', e => {
console.log('mobile:', e.matches);
});Событие
change срабатывает при изменении состояния media query.Это позволяет реагировать на изменение состояния
media query без использования window.resize.Пример 3 — адаптация логики интерфейса:
const media = window.matchMedia('(max-width: 600px)');
function updateLayout(mql) {
if (mql.matches) {
enableMobileLayout();
} else {
enableDesktopLayout();
}
}
updateLayout(media);
media.addEventListener('change', updateLayout);Обработчик сначала вызывается вручную для установки начального состояния, затем автоматически при изменении
media query.Пример 4 — учет пользовательских настроек доступности:
const motion = window.matchMedia('(prefers-reduced-motion: reduce)');
if (motion.matches) {
disableAnimations();
}Media queries позволяют учитывать пользовательские настройки доступности.Пример 5 — отслеживание ориентации экрана:
const orientation = window.matchMedia('(orientation: portrait)');
orientation.addEventListener('change', e => {
console.log('portrait:', e.matches);
});matchMedia используется для: адаптивной логики интерфейса, синхронизации JavaScript и CSS media queries, учета пользовательских настроек доступности и оптимизации поведения UI на разных устройствах.matchMedia — удобный способ проверять и отслеживать media queries напрямую из JavaScript.Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤13🔥10🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
Это репозиторий с компактным, но очень полезным материалом. Внутри собраны ключевые концепции и паттерны, которые постоянно встречаются в коде. Всё сопровождается небольшими примерами и пояснениями, поэтому ресурс удобно использовать как быстрый справочник, когда нужно освежить синтаксис.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥10🤝9❤2
Иногда нужно визуально выделить карточку или кнопку, но обычный
border выглядит слишком просто. В этом приёме рамка создаётся отдельным слоем с градиентом.Как работает:
• псевдоэлемент ::before создаёт слой градиентной рамки;
• inset расширяет его за пределы блока, формируя контур;
• border-radius: inherit сохраняет форму карточки;
• при наведении меняется яркость и масштаб рамки.
Это простой способ добавить акцент и глубину интерфейсным элементам без дополнительных обёрток и изображений.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝22🔥12👍11❤2😁1
Например,
cursor: pointer; делает курсор в виде руки — это сигнализирует, что элемент кликабельный. А cursor: none; полностью скрывает курсор.На картинке — 16 популярных значений свойства cursor.
Сохрани, чтобы не искать в документации каждый раз!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🤝11🔥10❤1
This media is not supported in your browser
VIEW IN TELEGRAM
YAML — расширение для VS Code, которое добавляет подсветку синтаксиса, автодополнение и проверку структуры YAML-файлов. Помогает быстрее писать конфиги для Docker, Kubernetes, GitHub Actions и других инструментов, сразу показывая ошибки и подсказки.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤9👍9🤝2
Как сделать аккуратный fade по краям контента без псевдоэлементов!
Обычно хочется мягко приглушить края, чтобы показать пользователю, что контент продолжается.
Часто для этого добавляют псевдоэлементы с градиентом:
Но это создаёт лишние слои, проблемы с
Есть другой способ — использовать CSS-маску:
Чёрный цвет = полностью видимый контент
Прозрачный = плавное исчезновение.
Это хорошо работает для горизонтальных списков:
🔥 В итоге получаем нативный
📣 Code Ready | #совет
Обычно хочется мягко приглушить края, чтобы показать пользователю, что контент продолжается.
Часто для этого добавляют псевдоэлементы с градиентом:
.scroll::after {
position: absolute;
right: 0;
width: 40px;
background: linear-gradient(...);
}Но это создаёт лишние слои, проблемы с
pointer-events и иногда ломает клики.Есть другой способ — использовать CSS-маску:
.scroll {
mask-image: linear-gradient(to right,
transparent,
black 40px,
black calc(100% - 40px),
transparent
);
}mask-image управляет прозрачностью элемента, а не рисует поверх него слой.Чёрный цвет = полностью видимый контент
Прозрачный = плавное исчезновение.
Это хорошо работает для горизонтальных списков:
.scroll {
display: flex;
overflow-x: auto;
mask-image: linear-gradient(to right,
transparent,
black 40px,
black calc(100% - 40px),
transparent
);
}fade-эффект без псевдоэлементов, без лишних слоёв и без JS.Please open Telegram to view this post
VIEW IN TELEGRAM
❤17🔥10👍8🤝4
This media is not supported in your browser
VIEW IN TELEGRAM
Это сайт с подборкой руководств, шпаргалок и полезных материалов для JavaScript-разработчиков. Здесь собраны статьи по TypeScript, React, Node.js, Next.js и другим технологиям. На сайте можно найти объяснения сложных тем, алгоритмы и структуры данных, а также практические гайды по инструментам вроде Docker и GraphQL. Все материалы удобно структурированы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍10🤝9❤1
navigator.sendBeacon для отправки данных при закрытии страницы!
Если нужно отправить аналитику или финальные данные сессии, обычные HTTP-запросы могут не успеть выполниться — пользователь закрыл вкладку или перешёл на другую страницу. Для таких случаев есть
Метод ставит данные в очередь на отправку и не блокирует закрытие страницы.
Базовый пример:
Метод принимает URL и данные. Запрос отправляется методом POST.
Если нужно явно указать Content-Type: application/json, лучше передать Blob:
Пример 1 — отправка при скрытии страницы:
Пример 2 — отправка
Можно отправлять строки,
Пример 3 — проверка:
Метод возвращает true, если браузер принял данные в очередь на отправку. Это не гарантия доставки, но означает, что отправка была запланирована браузером.
🔥 Если нужен ответ сервера, кастомные заголовки или полный контроль над запросом, можно использовать
📣 Code Ready | #практика
Если нужно отправить аналитику или финальные данные сессии, обычные HTTP-запросы могут не успеть выполниться — пользователь закрыл вкладку или перешёл на другую страницу. Для таких случаев есть
navigator.sendBeacon.Метод ставит данные в очередь на отправку и не блокирует закрытие страницы.
Базовый пример:
navigator.sendBeacon('/analytics', JSON.stringify({
event: 'page_close'
}));Метод принимает URL и данные. Запрос отправляется методом POST.
Если нужно явно указать Content-Type: application/json, лучше передать Blob:
navigator.sendBeacon(
'/analytics',
new Blob(
[JSON.stringify({ event: 'page_close' })],
{ type: 'application/json' }
)
);
Пример 1 — отправка при скрытии страницы:
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden') {
navigator.sendBeacon('/analytics', JSON.stringify({
event: 'session_end',
time: Date.now()
}));
}
});visibilitychange часто используют для отправки последних метрик перед уходом пользователя. Обычно это работает стабильнее, чем beforeunload.Пример 2 — отправка
FormData:const data = new FormData();
data.append('event', 'scroll_depth');
data.append('value', 80);
navigator.sendBeacon('/analytics', data);
Можно отправлять строки,
FormData, Blob, URLSearchParams и некоторые бинарные типы данных.Пример 3 — проверка:
const accepted = navigator.sendBeacon('/analytics', JSON.stringify({
event: 'leave'
}));
console.log('Beacon accepted:', accepted);Метод возвращает true, если браузер принял данные в очередь на отправку. Это не гарантия доставки, но означает, что отправка была запланирована браузером.
fetch с опцией keepalive.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍12🤝9❤1
🔥19👍10❤7🤝3👎2
Иногда интерфейс выглядит слишком статичным. Небольшие анимации делают элементы более живыми и помогают пользователю быстрее распознавать интерактивность.
Как работает:
• псевдоэлемент ::before создаёт увеличенный слой внутри кнопки;
• форма волны формируется через border-radius;
• изначально слой расположен ниже кнопки и скрыт;
• при :hover волна поднимается вверх, создавая эффект заполнения.
Так можно добавить акцент CTA-кнопкам или карточкам без сложной анимации и без JS.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍10🤝9
Например, объект помогает хранить данные в формате ключ-значение, а через dot notation, bracket notation и destructuring можно быстро получать и использовать нужные свойства.
На картинке — базовые приёмы работы с объектами: создание, доступ к свойствам, изменение значений, добавление новых полей, деструктуризация и методы.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12🤝10❤9
Почему ellipsis не срабатывает во flex и grid?
Во
Даже с
Эта строка явно разрешает элементу ужиматься по доступному пространству, и всё начинает работать как ожидается:
Особенно критично для
🔥 Если где-то ломается текст или
📣 Code Ready | #совет
Во
flex и grid элементы по умолчанию не хотят сжиматься меньше своего контента, из-за этого текст может выталкивать соседей и ломать layout:.title {
overflow: hidden;
text-overflow: ellipsis;
}
Даже с
ellipsis элемент может не обрезаться, потому что ему не разрешено сжиматься:.item {
min-width: 0;
}
Эта строка явно разрешает элементу ужиматься по доступному пространству, и всё начинает работать как ожидается:
.item {
min-width: 0;
}
Особенно критично для
flex и grid-колонок с 1fr, где переполнение встречается чаще всего.layout — в 50% случаев не хватает именно min-width: 0Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥13❤10
Проверка условий в массиве без явного цикла!
Когда нужно проверить элементы массива, многие пишут цикл и флаги:
В JS для таких проверок есть нативные методы —
Метод
Метод
Оба метода прекращают перебор, как только результат становится понятен, поэтому код получается короче и читаемее.
🔥 Особенно полезно при валидации данных, проверке прав доступа и любой логике, где нужно быстро проверить условие для массива.
📣 Code Ready | #совет
Когда нужно проверить элементы массива, многие пишут цикл и флаги:
let hasEven = false;
for (const n of numbers) {
if (n % 2 === 0) {
hasEven = true;
break;
}
}
В JS для таких проверок есть нативные методы —
some() и every(), которые позволяют обойтись без явного цикла.Метод
some() проверяет, выполняется ли условие хотя бы для одного элемента массива:const hasEven = numbers.some(n => n % 2 === 0);
Метод
every() проверяет, выполняется ли условие для всех элементов массива:const allEven = numbers.every(n => n % 2 === 0);
Оба метода прекращают перебор, как только результат становится понятен, поэтому код получается короче и читаемее.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍12🔥11