Отложенный запуск функции (debounce)!
При вводе, скролле или ресайзе события вызываются слишком часто и создают лишнюю нагрузку.
Создадим универсальный debounce-хелпер:
Используем
Теперь обработчик вызовется только когда пользователь закончит вводить текст.
Добавим ещё пару практических кейсов.
Сохранение черновика формы:
Оптимизация обработчика
🔥 Один универсальный инструмент — и меньше нагрузки на фронтенд, меньше дерганий UI и никаких лишних запросов.
📣 Code Ready | #практика
При вводе, скролле или ресайзе события вызываются слишком часто и создают лишнюю нагрузку.
Debounce откладывает выполнение функции, пока поток событий не прекратится.Создадим универсальный debounce-хелпер:
function debounce(fn, delay = 300) {
let timerId = null;
return (...args) => {
clearTimeout(timerId);
timerId = setTimeout(() => fn(...args), delay);
};
}Используем
debounce для поиска по вводу:const input = document.querySelector("#search");
function handleSearch(value) {
console.log("Запрос:", value);
}
const debouncedSearch = debounce(handleSearch, 500);
input.addEventListener("input", (e) => {
debouncedSearch(e.target.value);
});Теперь обработчик вызовется только когда пользователь закончит вводить текст.
Добавим ещё пару практических кейсов.
Сохранение черновика формы:
const saveDraft = debounce((form) => {
console.log("Сохраняем черновик:", form);
}, 1000);Оптимизация обработчика
resize:window.addEventListener(
"resize",
debounce(() => {
console.log("Пересчитываем layout...");
}, 200)
);
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍13❤9
Тег
<kbd> обозначает пользовательский ввод: с клавиатуры, голосом, указателем или другим образом. <kbd> никак не влияет на скринридеры и другие вспомогательные технологии. Они рассказывают о содержимом тега как об обычном тексте без роли.Где особенно полезен:
• Инструкции по работе с интерфейсом;
• Подсказки горячих клавиш;
• Руководства для разработчиков;
• Отображение команд, вводимых вручную.
По умолчанию браузеры выводят
<kbd> моноширинным шрифтом.Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤9🔥8
Получаем предыдущий и следующий элементы в массиве — будто «крутим карусель»
Иногда нужно перемещаться по массиву: переключать слайды, шагать по списку товаров, листать подсказки. Сделаем мини-утилиту, которая даёт соседние элементы по индексу.
Базовая функция:
Использование:
Сделаем версию с циклическим режимом — как в каруселях:
Использование:
🔥 Мини-инструмент, который сильно упрощает навигацию по массивам: слайдеры, шаговые формы, клавиатурная навигация, циклические списки — всё становится на порядок чище.
📣 Code Ready | #практика
Иногда нужно перемещаться по массиву: переключать слайды, шагать по списку товаров, листать подсказки. Сделаем мини-утилиту, которая даёт соседние элементы по индексу.
Базовая функция:
function neighbors(arr, index) {
return {
prev: arr[index - 1] ?? null,
next: arr[index + 1] ?? null
};
}Использование:
const items = ["A", "B", "C", "D"];
console.log(neighbors(items, 1));
// { prev: "A", next: "C" }
Сделаем версию с циклическим режимом — как в каруселях:
function cycleNeighbors(arr, index) {
const len = arr.length;
return {
prev: arr[(index - 1 + len) % len],
next: arr[(index + 1) % len]
};
}Использование:
console.log(cycleNeighbors(items, 0));
// { prev: "D", next: "B" }
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤12👍10
До сих пор многие привязывают стили к направлению текста:
.card {
padding-left: 16px;
padding-right: 16px;
}Это работает, пока интерфейс строго LTR и не появляется RTL, локализация или переиспользование компонентов.
Современный CSS решает это нативно, логическими свойствами:
.card {
padding-inline: 16px;
}padding-inline автоматически учитывает направление текста и заменяет padding-left + padding-right.То же самое работает для вертикали:
.card {
padding-block: 12px;
}padding-block — это padding-top + padding-bottom, но без жёсткой привязки к физическим сторонам.Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥11🤝9❤3
Привет! В этом гайде создаём простой компонент загрузки изображений с предпросмотром, проверкой типа файла и ограничением по размеру.
Ключевые моменты:
• HTML: файловый input, зона загрузки и блок предпросмотра.
• CSS: центрирование, карточный UI, аккуратные тени и отступы.
• JS: обработка выбора файла, проверка MIME-типа и размера, работа с Object URL.
Элемент отлично подойдёт для аватаров, профилей пользователей, форм обратной связи, карточек товаров и любых интерфейсов, где требуется наглядная загрузка изображений.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👍9🤝9👎1😁1
Например,
type="email" автоматически включает базовую валидацию e-mail, а type="date", type="time" и type="range" дают нативные контролы без лишнего JS.На картинке — часто используемые типы
<input>, которые стоит держать под рукой.Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥12🤝10
CSS-функция
image-set() позволяет перечислить несколько фоновых изображений с условиями, по которым браузер решит, какое из них наиболее подходящее для загрузки в данный момент.Примеры использования:
• Загрузка @1x / @2x / @3x изображений для Retina-экранов;
• Выбор более лёгкого изображения для обычных дисплеев;
• Указание альтернативных форматов (webp / avif) с фолбэком.
Конечно, есть тег
<picture>, но если изображение декоративное, будет правильнее установить его как фон элемента.Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥10🤝8❤2
В этой шпаргалке собраны основные методы Web Storage API (localStorage и sessionStorage) для работы с простым key-value хранилищем на стороне клиента. Здесь показано, как сохранять, читать и удалять данные, корректно сериализовывать объекты, очищать хранилище, а также реагировать на изменения данных между вкладками с помощью события storage в прикладных сценариях.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍11🤝10❤1
Раньше, чтобы сохранить пропорции блока (карточки, превью, видео), писали так:
.preview {
position: relative;
padding-top: 56.25%;
}Работает, но сложно читать, неудобно поддерживать.
Современный CSS решает это одной строкой:
.preview {
aspect-ratio: 16 / 9;
}Браузер сам поддерживает пропорции элемента без абсолютного позиционирования и костылей.
Чтобы контент внутри не ломал пропорции:
.preview img {
width: 100%;
height: 100%;
object-fit: cover;
}Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍14❤11
This media is not supported in your browser
VIEW IN TELEGRAM
Это коллекция интерактивных UI-эффектов, анимаций текста и компонентов для React. Здесь можно найти современные визуальные решения для hero-блоков, заголовков, интро и интерфейсных акцентов. Код аккуратный, легко читается и быстро интегрируется в собственные проекты.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤11🔥9
В этой фишке карточка состоит из двух слоёв, которые изначально разнесены по оси Y, а при наведении плавно сходятся в единую плоскость.
Как работает:
• Карточка выступает контейнером-триггером для hover;
• Два слоя позиционируются абсолютно и физически разведены через transform;
• При наведении transform сбрасывается в 0, и слои сходятся;
• Один hover управляет сразу несколькими элементами, без дублирования логики.
Приём хорошо масштабируется: подходит для карточек сервисов, профилей, feature-блоков и любых grid-раскладок.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍12❤11
Например,
position: relative позволяет смещать элемент относительно его обычного положения, а position: absolute — позиционировать элемент внутри ближайшего спозиционированного родителя.На картинке — 5 значений
position, которые нужно уверенно понимать при верстке и работе с layout’ами.Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍12🤝8❤1