Как сделать адаптивную сетку без media queries?
Многие пишут отдельные
Но CSS Grid умеет адаптироваться вообще без media queries:
А
🔥 В итоге сетка сама решает, сколько колонок поместится в контейнер.
📣 Code Ready | #совет
Многие пишут отдельные
breakpoint для каждой ширины экрана. В итоге CSS разрастается, а grid становится сложно поддерживать:@media (max-width: 768px) {
.grid {
grid-template-columns: 1fr;
}
}Но CSS Grid умеет адаптироваться вообще без media queries:
.grid {
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}minmax(250px, 1fr) говорит: колонка не может быть меньше 250px, но может растягиваться.auto-fit автоматически переносит элементы на новую строку, когда места становится мало..card {
min-width: 0;
}А
min-width: 0 дополнительно защищает grid от переполнений длинным контентом.Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥8❤6
Например, TTFB показывает, как быстро сервер начинает отвечать, а FCP помогает понять, когда пользователь впервые видит контент на экране.
На картинке — 9 основных метрик производительности сайта, которые полезно держать под рукой каждому разработчику.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🤝7❤6
Разбираем как не словить утечку памяти на обработчиках событий!
Одна из частых причин утечек — обработчик повесили, а снять забыли. Особенно это неприятно, когда событие висит не на локальном элементе, а на чём-то долгоживущем:
Компонента уже нет, а
Правильнее сразу закладывать
Главное — снимать нужно ту же самую функцию.
Вот так не сработает:
Это две разные функции, даже если выглядят одинаково.
Нормальный вариант:
Ещё момент —
Так обработчик не снимется, потому что
Когда обработчиков несколько, удобно использовать
А если обработчик нужен только один раз:
После первого вызова он удалится сам. Важный нюанс: удалённый DOM сам по себе ещё не утечка. Если на него нет внешних ссылок — GC его заберёт.
🔥 Проблемы начинаются, когда: обработчик висит на
📣 Code Ready | #практика
Одна из частых причин утечек — обработчик повесили, а снять забыли. Особенно это неприятно, когда событие висит не на локальном элементе, а на чём-то долгоживущем:
window, document, глобальный event bus и т.п.function mount() {
window.addEventListener('resize', onResize);
}
function unmount() {
// забыли снять обработчик
}
Компонента уже нет, а
onResize всё ещё вызывается. Плюс callback может держать в замыкании старое состояние, DOM-ноды, данные — и GC не сможет это нормально прибрать.Правильнее сразу закладывать
cleanup:function mount() {
window.addEventListener('resize', onResize);
}
function unmount() {
window.removeEventListener('resize', onResize);
}
Главное — снимать нужно ту же самую функцию.
Вот так не сработает:
el.addEventListener('click', () => doSomething());
el.removeEventListener('click', () => doSomething());
Это две разные функции, даже если выглядят одинаково.
Нормальный вариант:
function handler() {
doSomething();
}
el.addEventListener('click', handler);
el.removeEventListener('click', handler);
Ещё момент —
capture.el.addEventListener('click', handler, true);
el.removeEventListener('click', handler, false);
Так обработчик не снимется, потому что
capture отличается. Для удаления браузер сравнивает type, listener и capture.passive, once, signal в этом сравнении не участвуют.Когда обработчиков несколько, удобно использовать
AbortController:const controller = new AbortController();
window.addEventListener('resize', onResize, {
signal: controller.signal
});
document.addEventListener('visibilitychange', onVisible, {
signal: controller.signal
});
// cleanup
controller.abort();
abort() снимет все обработчики, которые были добавлены с этим signal.А если обработчик нужен только один раз:
button.addEventListener('click', handler, { once: true });
После первого вызова он удалится сам. Важный нюанс: удалённый DOM сам по себе ещё не утечка. Если на него нет внешних ссылок — GC его заберёт.
window / document; callback держит старое состояние в замыкании; DOM-нода или данные лежат в массиве, store или кэше.Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤8🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
На сайте собраны не только шпаргалки, но и полноценные статьи с разбором разных тем: работа с массивами и объектами, функции, замыкания, методы JS и практические нюансы разработки. Материал подаётся с примерами кода и краткими пояснениями.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13🤝8👍6❤2
Привет! В этом гайде создадим карточки с плавной анимацией, увеличением при наведении и динамическим добавлением через JavaScript.
Ключевые моменты:
• HTML: контейнер с карточками и кнопкой внутри.
• CSS: тень, плавный масштаб и адаптивное расположение.
• JS: добавление новых карточек без перезагрузки страницы.
Подходит для витрин товаров, портфолио или информационных блоков.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20❤8👍7👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Snazzy Operator — делает операторы (=>, ===, &&, >= и другие) более выразительными и аккуратными за счёт специальных лигатур и стилизации. Код становится легче воспринимать визуально, особенно в больших файлах и сложных условиях.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍7🤝5❤1
Почему скролл пробивает модалку и начинает двигать страницу?
Частый UX-баг: скроллишь контент внутри modal или sidebar, доходишь до конца, и начинает скроллиться вся страница под ним.
Обычно это пытаются фиксить через JS и блокировку
Но это может ломать iOS-scroll, sticky и вызывать скачки layout.
CSS умеет решать это нативно:
Теперь scroll “останавливается” внутри контейнера и не передаётся родителю.
Можно полностью отключить overscroll-эффекты и
Это особенно полезно для modal, drawer, sidebar, chat и mobile-menu.
🔥
📣 Code Ready | #совет
Частый UX-баг: скроллишь контент внутри modal или sidebar, доходишь до конца, и начинает скроллиться вся страница под ним.
Обычно это пытаются фиксить через JS и блокировку
body-scroll:body {
overflow: hidden;
}Но это может ломать iOS-scroll, sticky и вызывать скачки layout.
CSS умеет решать это нативно:
.modal {
overflow: auto;
overscroll-behavior: contain;
}Теперь scroll “останавливается” внутри контейнера и не передаётся родителю.
Можно полностью отключить overscroll-эффекты и
scroll-chain:.modal {
overscroll-behavior: none;
}Это особенно полезно для modal, drawer, sidebar, chat и mobile-menu.
.chat {
overflow: auto;
overscroll-behavior: contain;
}overscroll-behavior позволяет нативно контролировать scroll-chain и избавиться от части scroll-lock логики без дополнительных JS-хаков.Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤8🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
На сайте собраны статьи, документация и обучающие материалы по Node.js: работа с Express, npm, API, асинхронностью, модулями, потоками и серверной разработкой в целом. Есть как базовые разборы для новичков, так и более сложные темы по архитектуре и производительности.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤7🔥6