This media is not supported in your browser
VIEW IN TELEGRAM
Отличный репозиторий с большим набором вопросов по разным направлениям разработки: JavaScript, HTML, CSS, React, Node.js и множеству других тем. Вопросы с примерами, объяснениями и ссылками на ресурсы для углублённого изучения. Помогает освежить знания по ключевым темам стеков, которые встречаются в проектах.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤10🔥8👎4🤝1
Для пользователей, которые не хотят анимаций!
Часть пользователей осознанно отключают анимации в системе (motion sickness, accessibility).
По умолчанию интерфейсы часто это игнорируют, а зря.
Браузер передаёт это предпочтение через
Анимации и резкие движения исчезают для тех, кому они мешают.
Можно сделать только для сложных эффектов:
🔥 Таким образом интерфейс подстраивается под пользователя, а не наоборот
📣 Code Ready | #совет
Часть пользователей осознанно отключают анимации в системе (motion sickness, accessibility).
По умолчанию интерфейсы часто это игнорируют, а зря.
.card {
transition: transform 0.3s ease;
}Браузер передаёт это предпочтение через
media query:@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}Анимации и резкие движения исчезают для тех, кому они мешают.
Можно сделать только для сложных эффектов:
@media (prefers-reduced-motion: reduce) {
.animated {
animation: none !important;
transition: none !important;
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤7🔥7🤝3
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь разбираются замыкания, this, области видимости, асинхронность, прототипы и др. важные темы. Отличный репозиторий, если хочешь не просто писать код, а понимать, почему он работает именно так. Полезно для роста и закрепления знаний.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🤝10🔥7❤4👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Live Share — позволяет делиться сессией VS Code в реальном времени: другой человек видит твой проект, может перемещаться по файлам, писать код, запускать команды и помогать с отладкой, даже если у него нет такого же окружения.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27🤝11👍8❤2
Обычный клик может быть слишком лёгким действием для потенциально опасных операций. В интерфейсах гораздо надёжнее требовать осознанного удержания, а не мгновенного нажатия.
Как работает:
• :active используется как источник состояния, он существует ровно столько, сколько пользователь удерживает кнопку;
• прогресс визуализируется через transform: scaleX, без изменения размеров;
• длительность подтверждения задаётся одной строкой transition;
• при отпускании кнопки состояние автоматически сбрасывается.
Приём отлично подходит для админских интерфейсов и сценариев, где важно снизить риск случайного клика, не усложняя код.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍11🤝9
В этой статье:
• Разбираются свежие возможности CSS, которые постепенно убирают необходимость в препроцессорах и JS;
• Показано, как писать собственные функции, использовать условия через if() и media() прямо в стилях;
• Объясняется, как работать с позициями элементов с помощью sibling-index();
• Рассматриваются новинки вроде interest-delay для hover-логики и field-sizing для адаптивных форм.🔊 Продолжайте читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤20🔥11👍7🤝2
Отслеживаем изменения DOM через MutationObserver!
Когда нужно понять, что именно поменялось в DOM (добавили элемент, удалили, изменили атрибут) —
В примере будем следить за изменениями внутри корневого контейнера приложения:
Пример 1 — отслеживание изменений структуры DOM. Добавление и удаление узлов (
Используется, когда важно отследить появление или удаление элементов (рендер, условные блоки, динамические списки).
Пример 2 — отслеживание изменений атрибутов. Изменения атрибутов элементов (
Подходит для отслеживания изменений классов, data-атрибутов и состояний UI.
Подписываемся на изменения DOM. Важно ограничивать типы мутаций и атрибуты, чтобы не ловить лишнего и не перегружать обработчик:
Для демонстрации вручную меняем DOM:
Когда наблюдение больше не нужно:
🔥
📣 Code Ready | #практика
Когда нужно понять, что именно поменялось в DOM (добавили элемент, удалили, изменили атрибут) —
MutationObserver решает задачу нативно, без опроса DOM и таймеров.В примере будем следить за изменениями внутри корневого контейнера приложения:
const container = document.getElementById('app');MutationObserver асинхронно передаёт список DOM-изменений, сгруппированных браузером перед следующим этапом рендеринга.Пример 1 — отслеживание изменений структуры DOM. Добавление и удаление узлов (
childList):const structureObserver = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.type === 'childList') {
console.log(
'Добавленные узлы:',
mutation.addedNodes,
'Удалённые узлы:',
mutation.removedNodes
);
}
});
});Используется, когда важно отследить появление или удаление элементов (рендер, условные блоки, динамические списки).
Пример 2 — отслеживание изменений атрибутов. Изменения атрибутов элементов (
attributes):const attributesObserver = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.type === 'attributes') {
console.log(
'Изменён атрибут:',
mutation.attributeName,
'было:',
mutation.oldValue,
'стало:',
mutation.target.getAttribute(mutation.attributeName)
);
}
});
});Подходит для отслеживания изменений классов, data-атрибутов и состояний UI.
mutation.oldValue доступен только при включённой опции attributeOldValue.Подписываемся на изменения DOM. Важно ограничивать типы мутаций и атрибуты, чтобы не ловить лишнего и не перегружать обработчик:
structureObserver.observe(container, {
childList: true, // добавление / удаление узлов
subtree: true // всё поддерево
});
attributesObserver.observe(container, {
attributes: true, // изменения атрибутов
attributeOldValue: true, // предыдущее значение
attributeFilter: ['class', 'data-test'], // только нужные атрибуты
subtree: true
});Для демонстрации вручную меняем DOM:
const el = document.createElement('div');
el.textContent = 'new node';
container.appendChild(el);
el.setAttribute('data-test', '123');Когда наблюдение больше не нужно:
structureObserver.disconnect();
attributesObserver.disconnect();
MutationObserver особенно полезен, когда нужно реагировать на динамические изменения DOM. Изменения доставляются асинхронно и группируются браузером, без постоянного опроса DOMPlease open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥13❤9🤝3
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь по шагам объясняют, как создаются html-страницы, как работают теги, формы, таблицы, семантика. А также как оформлять всё это с помощью CSS: селекторы, цвета, layout, Flexbox, Grid и адаптивный дизайн. Материалы поданы простым языком и с примерами, удобно для новичков и тех, кто хочет повторить базу.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥9🤝8❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Тег
<dialog> предназначен для создания диалоговых окон и модалок прямо в HTML, по умолчанию не показывается на странице.Основные возможности <dialog>:
• метод show() — открыть диалог как обычный элемент;
• метод showModal() — открыть модальное окно с блокировкой фона;
• метод close() — закрыть диалог программно;
• атрибут open — управляет видимостью элемента.
<dialog> хорош тем, что решает задачу модальных окон на уровне стандарта. Чем меньше в проекте самописных решений для базовых вещей, тем проще его поддерживать со временем.Please open Telegram to view this post
VIEW IN TELEGRAM
❤23👍13🔥12🤝4
🔥20❤10👍10🤝2
Когда на странице есть
position: sticky фиксированная шапка, переход по якорю почти всегда ломается. Контент прокручивается, но заголовок уезжает под хедер:
<a href="#section">Перейти</a><h2 id="section">Раздел</h2>
По умолчанию браузер скроллит элемент ровно к верху вьюпорта, не зная про фиксированную шапку.
Решение есть нативное и очень простое, добавить отступ для скролла самому элементу:
h2 {
scroll-margin-top: 72px;
}Теперь при переходе по якорю браузер автоматически остановится ниже, с учётом высоты шапки.
Если высота шапки задана переменной, можно так:
:root {
--header-h: 72px;
}
h2 {
scroll-margin-top: var(--header-h);
}scrollIntoView(), навигации по оглавлению, документации и лонгридов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍29❤13🔥9🤝4
Привет! В этом гайде создаём поле ввода, которое превращает текст в аккуратные теги по нажатию Enter и поддерживает удаление с клавиатуры.
Ключевые моменты:
• HTML: простая структура — контейнер, поле ввода и зона для тегов.
• CSS: аккуратные chips и card-оформление компонента.
• JS: логика добавления тегов, обработка Enter и Backspace, управление DOM.
Такой элемент отлично подойдёт для форм, тегов, навыков, категорий и email-полей в веб-приложениях и админках.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20❤12👍9🤝3
Отслеживаем производительность через PerformanceObserver!
Когда нужно понять, что именно тормозит страницу (долгие задачи, layout shifts, загрузка ресурсов) —
API позволяет подписываться на события производительности в реальном времени.
Создаём наблюдатель:
Пример 1 — отслеживание
Прямой индикатор лагов и фризов UI (Long Tasks API, поддержка зависит от браузера).
Пример 2 — отслеживание
Используется для поиска скачков интерфейса при загрузке контента.
CLS считается как накопленное значение layout shift’ов без пользовательского ввода.
Пример 3 — анализ загрузки ресурсов:
Позволяет видеть реальные тайминги загрузки скриптов, стилей и изображений (для кросс-доменных ресурсов подробные данные доступны при Timing-Allow-Origin).
Когда наблюдение больше не нужно:
🔥
📣 Code Ready | #практика
Когда нужно понять, что именно тормозит страницу (долгие задачи, layout shifts, загрузка ресурсов) —
PerformanceObserver даёт нативный доступ к метрикам браузера прямо в рантайме, без devtools и сторонних SDK.API позволяет подписываться на события производительности в реальном времени.
Создаём наблюдатель:
const observer = new PerformanceObserver(list => {
list.getEntries().forEach(entry => {
console.log(entry);
});
});Пример 1 — отслеживание
long tasks (блокировки main thread):observer.observe({
entryTypes: ['longtask']
});longtask — любая задача, блокирующая основной поток дольше 50 мс.Прямой индикатор лагов и фризов UI (Long Tasks API, поддержка зависит от браузера).
Пример 2 — отслеживание
layout shifts (CLS):let clsValue = 0;
const clsObserver = new PerformanceObserver(list => {
list.getEntries().forEach(entry => {
if (!entry.hadRecentInput) {
clsValue += entry.value;
console.log('CLS:', clsValue);
}
});
});
clsObserver.observe({
type: 'layout-shift',
buffered: true
});
Используется для поиска скачков интерфейса при загрузке контента.
CLS считается как накопленное значение layout shift’ов без пользовательского ввода.
Пример 3 — анализ загрузки ресурсов:
const resourceObserver = new PerformanceObserver(list => {
list.getEntries().forEach(entry => {
console.log(
entry.name,
entry.initiatorType,
Math.round(entry.duration) + ' мс'
);
});
});
resourceObserver.observe({
entryTypes: ['resource']
});Позволяет видеть реальные тайминги загрузки скриптов, стилей и изображений (для кросс-доменных ресурсов подробные данные доступны при Timing-Allow-Origin).
PerformanceObserver работает асинхронно — данные предоставляет сам браузер, без ручных замеров.Когда наблюдение больше не нужно:
observer.disconnect();
clsObserver.disconnect();
resourceObserver.disconnect();
PerformanceObserver — базовый инструмент диагностики производительности и поиска узких мест прямо в коде приложения.Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥13🤝10❤1