Обычный заголовок можно превратить в полноценный UI-эффект, если разделить его на несколько независимых слоёв.
Как работает:
• ::before и ::after создают копии текста;
• каждый слой анимируется отдельно;
• разные цвета формируют chromatic aberration;
• небольшие смещения создают эффект glitch-сигнала.
Приём отлично подходит для стартовых экранов, главных секций сайта, экранов загрузки и декоративных интерфейсов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17👍7🔥4
Например, Forward Proxy скрывает клиента и управляет исходящими запросами, Reverse Proxy принимает трафик на стороне сервера и распределяет его между сервисами, а API Gateway централизует авторизацию, rate limiting и маршрутизацию API.
На картинке — базовые различия между Forward Proxy, Reverse Proxy и API Gateway, которые полезно держать под рукой каждому разработчику.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍5🤝4
В этой статье:
• Подробно разбираются основные инструменты Chrome DevTools — Elements, Console, Sources, Network и их применение;
• Показывается, как эффективно искать баги, анализировать DOM, отлаживать JavaScript и отслеживать сетевые запросы;
• Объясняются возможности DevTools: Workspaces, Snippets, performance-профилирование, live-редактирование и инструменты для адаптивной вёрстки.🔊 Продолжайте читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍6🔥5😁2
This media is not supported in your browser
VIEW IN TELEGRAM
vscode-styled-components — делает работу со
styled-components намного удобнее: появляются подсказки CSS, подсветка цветов, автодополнение свойств и форматирование прямо внутри JS/TS-файлов. Всё работает почти как в отдельном CSS-файле.Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤8🤝5
Как сделать sticky footer без layout-багов?
Часто делают так:
Но
Есть нативный flex-способ без JS и вычислений высоты.
Теперь
Остаётся отодвинуть footer вниз.
🔥 Так layout занимает минимум всю высоту
📣 Code Ready | #совет
Часто делают так:
footer {
position: fixed;
bottom: 0;
}Но
fixed-footer перекрывает контент и ломает mobile layout.Есть нативный flex-способ без JS и вычислений высоты.
body {
display: flex;
flex-direction: column;
}Теперь
body становится вертикальным flex-контейнером.Остаётся отодвинуть footer вниз.
footer {
margin-top: auto;
}auto забирает всё свободное пространство сверху и footer автоматически прижимается к низу страницы.body {
min-height: 100dvh;
}viewport даже при маленьком количестве контента.Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍10🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Сайт охватывает как основы языка, так и более продвинутые темы. Здесь разбираются переменные, функции, объекты, массивы, DOM, события, асинхронность, работа с браузером и др. Материал подаётся в формате последовательных уроков с примерами кода и подробными объяснениями.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤5🤝5
Обычные анимации рамки часто выглядят слишком примитивно: у элемента просто меняется цвет или прозрачность всей границы сразу. Но через
conic-gradient можно создать полноценное вращающееся свечение вокруг элемента.Как работает:
• conic-gradient рисует сектор света вокруг центра;
• псевдоэлемент становится отдельным glow-слоем;
• animation вращает только градиент;
• layout остаётся полностью стабильным, потому что анимируется compositing-слой.
Приём отлично подходит для интерфейсных панелей, акцентных кнопок и интерфейсов с акцентными состояниями.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍10❤5
В этой статье:
• Пошагово показывается создание собственного симулятора кубика Рубика на JS и Canvas;
• Разбирается работа с 3D-проекцией, изометрией и ручным рендерингом объектов;
• Объясняется, как хранить состояние куба и реализовывать алгоритмы поворотов;
• Демонстрируются проблемы Canvas-рендеринга, сортировки граней и псевдо-3D.🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤6🤝3
This media is not supported in your browser
VIEW IN TELEGRAM
Htmltagwrap — позволяет выделить любой фрагмент и за секунду обернуть его в нужный тег: div, span, section и любой другой, без ручного написания. Особенно удобно при верстке, работе с JSX и быстром редактировании разметки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤8🔥6
Почему scroll иногда внезапно прыгает сам по себе?
Добавляешь новый контент сверху и браузер внезапно меняет
Обычно проблема появляется при:
Браузер пытается помочь и автоматически удерживает пользователя на прежнем месте через
Но в динамических интерфейсах это часто создаёт хаос.
Теперь браузер перестаёт вмешиваться в
Особенно полезно для:
Где контент постоянно догружается или меняется.
Можно отключать
Например у
🔥
📣 Code Ready | #совет
Добавляешь новый контент сверху и браузер внезапно меняет
scroll-position. Особенно часто это ломает chat, infinite-feed и lazy-load layout.Обычно проблема появляется при:
prepend,
lazy-image,
dynamic-content
Браузер пытается помочь и автоматически удерживает пользователя на прежнем месте через
scroll anchoring.Но в динамических интерфейсах это часто создаёт хаос.
.chat {
overflow-anchor: none;
}Теперь браузер перестаёт вмешиваться в
scroll-position контейнера.Особенно полезно для:
chat,
feed,
virtual-list,
infinite-scroll
Где контент постоянно догружается или меняется.
Можно отключать
anchoring точечно даже у отдельных элементов..loader {
overflow-anchor: none;
}Например у
skeleton, lazy-image или рекламных блоков.overflow-anchor: none убирает один из scroll-багов в динамических интерфейсах.Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍7🔥6
Например, когда вводишь
google.com, браузер сначала ищет IP-адрес через DNS, затем устанавливает TCP/TLS-соединение, отправляет HTTPS-запрос и только после этого начинает рендерить страницу.На картинке — полный путь от ввода URL до отображения сайта.
Сохрани, чтобы быстро освежить в памяти, как работает Web под капотом!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤6👍5
DocumentFragment: как делать пакетные DOM-вставки аккуратнее!
Когда элементы добавляются в DOM по одному, браузеру приходится постоянно обновлять структуру документа. На небольших объёмах это почти незаметно, но при рендере больших списков или сложных интерфейсов такие операции могут начать стоить дороже. Для таких случаев в DOM API есть
Создаём
Это временный контейнер, который существует вне основного DOM-дерева. Пока элементы находятся внутри
Здесь элементы сначала собираются внутри
Пример с переносом существующих элементов:
Здесь элементы не копируются,
Ещё один частый кейс — работа с
И ещё один момент:
После вставки содержимое
Важно понимать, что
🔥 У него нет собственного layout, стилей или визуального отображения. Но при больших объёмах DOM, сложных компонентах или частых обновлениях интерфейса
📣 Code Ready | #практика
Когда элементы добавляются в DOM по одному, браузеру приходится постоянно обновлять структуру документа. На небольших объёмах это почти незаметно, но при рендере больших списков или сложных интерфейсов такие операции могут начать стоить дороже. Для таких случаев в DOM API есть
DocumentFragment.Создаём
fragment:const fragment = document.createDocumentFragment();
Это временный контейнер, который существует вне основного DOM-дерева. Пока элементы находятся внутри
fragment — они не участвуют в рендеринге страницы. Можно спокойно собрать структуру в памяти, а потом вставить всё одной операцией. Пример — массовое добавление элементов:const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
const li = document.createElement('li');
li.textContent = `Item ${i}`;
fragment.appendChild(li);
}
document
.querySelector('.list')
.appendChild(fragment);
Здесь элементы сначала собираются внутри
fragment, а затем одной вставкой попадают в основной DOM. Такой подход уменьшает количество промежуточных вставок в live DOM и делает массовый рендер более предсказуемым. Пример через append():const fragment = document.createDocumentFragment();
users.forEach(user => {
const item = document.createElement('div');
item.className = 'user';
item.textContent = user.name;
fragment.append(item);
});
container.append(fragment);
append() тоже работает с DocumentFragment. По смыслу разницы почти нет — append() просто современнее и удобнее. Плюс он умеет принимать строки и несколько узлов сразу.Пример с переносом существующих элементов:
const fragment = document.createDocumentFragment();
document
.querySelectorAll('.item')
.forEach(el => {
fragment.appendChild(el);
});
newContainer.appendChild(fragment);
Здесь элементы не копируются,
appendChild() физически переносит DOM-узлы в новый контейнер. Один и тот же элемент не может одновременно находиться в двух местах дерева. Ещё один частый кейс — работа с
template:const template = document.querySelector('#card');
const fragment = document.createDocumentFragment();
data.forEach(item => {
const cardFragment = template.content
.cloneNode(true);
cardFragment
.querySelector('.title')
.textContent = item.title;
fragment.appendChild(cardFragment);
});
container.appendChild(fragment);
template.content уже является DocumentFragment, поэтому cloneNode(true) возвращает готовый набор DOM-узлов, который удобно изменять перед вставкой.И ещё один момент:
const fragment = document.createDocumentFragment();
fragment.appendChild(
document.createElement('div')
);
container.appendChild(fragment);
console.log(fragment.childNodes.length); // 0
После вставки содержимое
fragment переносится в DOM, а сам fragment остаётся пустым. По сути это временный контейнер для группы узлов.Важно понимать, что
DocumentFragment — не полноценный HTML-элемент:console.log(
fragment instanceof HTMLElement
); // false
DocumentFragment всё ещё остаётся удобным способом собрать структуру отдельно от основного DOM и вставить её одним действием.Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥7❤5
This media is not supported in your browser
VIEW IN TELEGRAM
На сайте собрана большая коллекция полезных ссылок для разработчиков: учебники, документация, статьи, блоги, инструменты, библиотеки и сервисы по JavaScript, HTML, CSS, React, Node.js и другим технологиям веб-разработки. Всё удобно структурировано по категориям, что позволяет быстро находить нужные материалы для изучения или работы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11🤝7❤5
Через CSS Mask можно создавать интересные эффекты, управляя тем, какие части элемента будут видимы.
Как работает:
• mask создаёт альфа-маску поверх изображения;
• браузер отображает только разрешённые области;
• mask-position двигает маску без изменения размеров элемента;
• одновременно можно комбинировать эффект с фильтрами и анимациями.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍7🤝5👎2
This media is not supported in your browser
VIEW IN TELEGRAM
Очень полезный материал для frontend-разработчиков и всех, кто работает с вёрсткой. Здесь собрана все по CSS — от базовых селекторов и блочной модели до Flexbox, Grid, анимаций, адаптива и современных возможностей CSS. Особенно удобно, что всё структурировано и написано простым языком с примерами.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤7👍7
Как убрать лишние классы для пустых блоков?
Часто в компонентах есть контейнеры для описания, ошибки, подсказки или дополнительного контента.
Если данных нет — элемент остаётся пустым, но продолжает занимать место.
Обычно это решают через JS или условный рендеринг.
А потом отдельно добавляют класс при появлении контента.
Но CSS умеет определять пустые элементы самостоятельно.
Теперь блок автоматически скрывается, если внутри ничего нет.
Можно делать и обратную логику.
Отступы появятся только тогда, когда внутри действительно есть контент.
Особенно удобно для:
Где содержимое может появляться динамически.
🔥
📣 Code Ready | #совет
Часто в компонентах есть контейнеры для описания, ошибки, подсказки или дополнительного контента.
Если данных нет — элемент остаётся пустым, но продолжает занимать место.
Обычно это решают через JS или условный рендеринг.
.error {
display: none;
}А потом отдельно добавляют класс при появлении контента.
Но CSS умеет определять пустые элементы самостоятельно.
.error:empty {
display: none;
}Теперь блок автоматически скрывается, если внутри ничего нет.
Можно делать и обратную логику.
.card:not(:empty) {
padding: 16px;
}Отступы появятся только тогда, когда внутри действительно есть контент.
Особенно удобно для:
error,
hint,
description,
badge
Где содержимое может появляться динамически.
:empty позволяет убрать лишние классы и часть условной логики прямо средствами CSS.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍12🤝8❤1
Например,
querySelector() помогает быстро находить элементы на странице, addEventListener() обрабатывать события пользователя, а createElement() динамически создавать новый контент.На картинке — основные DOM-методы и свойства: поиск элементов, работа с содержимым, атрибутами, классами, событиями и управление структурой документа.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤5👍5
Разбираемся зачем нужен event.currentTarget!
При работе с событиями многие используют
Например:
Повесим обработчик на кнопку:
Если кликнуть по тексту внутри
Потому что
Теперь выведем имя тега:
Клик по кнопке даст такой результат: BUTTON. А клик по тексту внутри span даст: SPAN.
Из-за этого иногда появляются неожиданные баги:
Если событие пришло от вложенного элемента, код будет работать не с кнопкой, а с этим элементом. В результате можно случайно изменить не тот элемент или получить неожиданный результат.
В таких ситуациях обычно нужен
То есть:
При клике по
А вторым — элемент, на котором выполняется обработчик:
Особенно хорошо разница видна при делегировании событий:
Здесь
Ещё один момент:
После завершения обработки значение
🔥 Простое правило:
📣 Code Ready | #практика
При работе с событиями многие используют
event.target и не задумываются, что это не всегда тот элемент, на который был повешен обработчик.Например:
<button class="btn">
<span>Сохранить</span>
</button>
Повесим обработчик на кнопку:
button.addEventListener('click', (event) => {
console.log(event.target);
});
Если кликнуть по тексту внутри
span, то в консоль попадёт именно span, а не button.Потому что
event.target всегда указывает на элемент, который стал источником события.Теперь выведем имя тега:
button.addEventListener('click', (event) => {
console.log(event.target.tagName);
});
Клик по кнопке даст такой результат: BUTTON. А клик по тексту внутри span даст: SPAN.
Из-за этого иногда появляются неожиданные баги:
button.addEventListener('click', (event) => {
event.target.disabled = true;
});
Если событие пришло от вложенного элемента, код будет работать не с кнопкой, а с этим элементом. В результате можно случайно изменить не тот элемент или получить неожиданный результат.
В таких ситуациях обычно нужен
event.currentTarget:button.addEventListener('click', (event) => {
console.log(event.currentTarget);
});
currentTarget всегда содержит элемент, на котором сейчас выполняется обработчик.То есть:
button.addEventListener('click', (event) => {
console.log(event.target);
console.log(event.currentTarget);
});
При клике по
span первым будет исходный элемент события:event.target — span
А вторым — элемент, на котором выполняется обработчик:
event.currentTarget — button
Особенно хорошо разница видна при делегировании событий:
list.addEventListener('click', (event) => {
console.log(event.target);
console.log(event.currentTarget);
});
Здесь
currentTarget всегда будет ссылаться на list, независимо от того, по какому дочернему элементу кликнули.Ещё один момент:
currentTarget существует только во время обработки события.const saved = event.currentTarget;
После завершения обработки значение
event.currentTarget становится null. Поэтому если ссылка нужна позже — её стоит сохранить заранее.target отвечает на вопрос «какой элемент стал источником события», а currentTarget — «на каком элементе сейчас выполняется обработчик». Понимание этой разницы помогает избежать множества мелких ошибок при работе с DOM-событиями.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍9❤8
This media is not supported in your browser
VIEW IN TELEGRAM
На сайте собрана большая база материалов для JavaScript-разработчиков: статьи, библиотеки, фреймворки, инструменты, полезные сервисы и обучающие ресурсы. От базовых инструментов до React, Vue, Node.js и др. Отличный ресурс для веб-разработчиков, которые хотят ускорить работу или найти новые инструменты.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤7🤝7