Иногда нужно визуально выделить карточку или кнопку, но обычный
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
Как читать элементы массива с конца через at()!
Раньше доступ к элементам с конца массива требовал ручных вычислений длины и это ухудшало читаемость кода.
Например, чтобы получить последний и предпоследний элементы, обычно писали так.
Традиционный способ:
При сложных выражениях или частых обращениях к последним элементам такой код становится менее читаемым.
Современный метод at() позволяет обращаться к элементам массива с конца через отрицательные индексы:
Метод также поддерживает обычные положительные индексы:
Если индекс выходит за пределы массива, метод возвращает undefined:
Один из практических сценариев — работа со стеком, когда нужно быстро посмотреть верхний элемент:
Метод работает не только с массивами, но и со строками:
В отличие от charAt(), метод at() поддерживает отрицательные индексы.
Он также доступен для TypedArray:
🔥 Важно: at() не мутирует данные и не создаёт копий — это просто способ получить элемент по индексу. Метод поддерживается современными браузерами и современными версиями Node.js.
📣 Code Ready | #практика
Раньше доступ к элементам с конца массива требовал ручных вычислений длины и это ухудшало читаемость кода.
Например, чтобы получить последний и предпоследний элементы, обычно писали так.
Традиционный способ:
const arr = ["a", "b", "c", "d"];
const last = arr[arr.length - 1];
const prev = arr[arr.length - 2];
console.log(last); // "d"
console.log(prev); // "c"
При сложных выражениях или частых обращениях к последним элементам такой код становится менее читаемым.
Современный метод at() позволяет обращаться к элементам массива с конца через отрицательные индексы:
const arr = ["a", "b", "c", "d"];
arr.at(-1); // "d"
arr.at(-2); // "c"
Метод также поддерживает обычные положительные индексы:
arr.at(0); // "a"
arr.at(2); // "c"
Если индекс выходит за пределы массива, метод возвращает undefined:
arr.at(100); // undefined
arr.at(-100); // undefined
Один из практических сценариев — работа со стеком, когда нужно быстро посмотреть верхний элемент:
function peek(stack) {
return stack.at(-1);
}Метод работает не только с массивами, но и со строками:
"hello".at(-1); // "o"
В отличие от charAt(), метод at() поддерживает отрицательные индексы.
Он также доступен для TypedArray:
const bytes = new Uint8Array([10, 20, 30]);
bytes.at(-1); // 30
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤15🤝10
This media is not supported in your browser
VIEW IN TELEGRAM
Задача — в минимуме кода повторить заданный визуал. Тренирует знание CSS до автоматизма, особенно круто для тех, кто хочет прокачать вёрстку нестандартных форм.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥9🤝9❤4
Иногда обычной рамки недостаточно — элементу не хватает динамики и акцента. В этом приёме граница становится анимированной и вращается вокруг элемента.
Как работает:
• conic-gradient формирует круговой градиент;
• псевдоэлемент выносится за пределы карточки через inset;
• анимация вращает слой через transform, не затрагивая layout;
• вся интерактивность реализована без скриптов.
Градиент вынесен в отдельный слой, поэтому эффект не влияет на содержимое карточки и может переиспользоваться как независимый декоративный уровень.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍10🤝10❤1
This media is not supported in your browser
VIEW IN TELEGRAM
ES7+ React/Redux/React-Native snippets — добавляет готовые сниппеты для компонентов, хуков, Redux-логики и других часто используемых конструкций. Достаточно ввести короткое сокращение и получаешь полноценный шаблон с импортами и структурой. Помогает быстрее создавать файлы, избегая рутины.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤11👍11
Почему “едут” размеры некоторых элементов?
По умолчанию (
Фактическая ширина здесь будет 240px, что часто приводит к переполнениям:
Теперь
Поэтому это правило обычно задают глобально, чтобы вся верстка стала предсказуемой.
🔥 Это снижает количество проблем с размерами и делает layout стабильнее.
📣 Code Ready | #совет
По умолчанию (
box-sizing: content-box) width и height задают только размер контента, без учёта padding и border. Из-за этого элементы становятся больше, чем ожидаешь, и layout ломается:.box {
width: 200px;
padding: 20px;
}Фактическая ширина здесь будет 240px, что часто приводит к переполнениям:
.box {
box-sizing: border-box;
}Теперь
padding и border учитываются внутри заданной ширины, и итоговый размер остаётся 200px:*,
*::before,
*::after {
box-sizing: border-box;
}
Поэтому это правило обычно задают глобально, чтобы вся верстка стала предсказуемой.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥13❤11