В интерфейсах с карточками и списками важно ограничивать объём текста, чтобы сохранить аккуратную сетку, но при этом давать пользователю возможность раскрыть полный контент без перегрузки UI.
Как работает:
• -webkit-line-clamp ограничивает количество строк;
• checkbox используется как источник состояния;
• селекторы управляют отображением текста;
• кнопка синхронизируется с состоянием.
Такой подход позволяет управлять длинным контентом декларативно, без событий и дополнительных зависимостей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍9❤8🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
Удобный справочник, где собраны ключевые аспекты веб-разработки, а также JS: базовый синтаксис, работа с DOM, события, асинхронность, взаимодействие с API. Плюс затронуты важные вещи из Node.js, сборка, инструменты и общая архитектура. Всё подано в сжатом формате, чтобы быстро освежить знания.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🤝8🔥6❤2
Как отодвинуть элемент в конец без justify-content?
Частая задача — в одной строке есть несколько элементов, и один из них нужно прижать к правому краю. Обычно начинают оборачивать всё в дополнительные контейнеры.
Но это ломает контроль над расстояниями между остальными элементами.
Есть более точечный и управляемый способ:
auto-отступ забирает всё свободное пространство и отталкивает элемент вправо:
Это работает не только для одного элемента, но и для групп:
Теперь можно точно управлять
🔥 Один
📣 Code Ready | #совет
Частая задача — в одной строке есть несколько элементов, и один из них нужно прижать к правому краю. Обычно начинают оборачивать всё в дополнительные контейнеры.
.nav {
display: flex;
justify-content: space-between;
}Но это ломает контроль над расстояниями между остальными элементами.
Есть более точечный и управляемый способ:
.push {
margin-left: auto;
}auto-отступ забирает всё свободное пространство и отталкивает элемент вправо:
<nav class="nav">
<span>Logo</span>
<span class="push">Menu</span>
</nav>
Это работает не только для одного элемента, но и для групп:
.group {
margin-left: auto;
}Теперь можно точно управлять
layout без изменения поведения остальных элементов.margin-left: auto заменяет сложные flex-настройки и даёт контроль над выравниванием.Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥8❤6🤝5
Разбираем как не словить утечку памяти на обработчиках событий!
Одна из частых причин утечек — обработчик повесили, а снять забыли. Особенно это неприятно, когда событие висит не на локальном элементе, а на чём-то долгоживущем:
Компонента уже нет, а
Правильнее сразу закладывать
Главное — снимать нужно ту же самую функцию.
Вот так не сработает:
Это две разные функции, даже если выглядят одинаково.
Нормальный вариант:
Ещё момент —
Так обработчик не снимется, потому что
Когда обработчиков несколько, удобно использовать
А если обработчик нужен только один раз:
После первого вызова он удалится сам. Важный нюанс: удалённый 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
🔥15❤10🤝7
This media is not supported in your browser
VIEW IN TELEGRAM
Это сборник материалов для фронтенд-разработчика: от HTML/CSS и БЭМ до JavaScript, React, Redux и архитектуры приложений. Внутри есть и шпаргалки, и статьи, и курсы — всё разложено по темам и уровням. Получается готовая дорожная карта для фронтендера: можно идти от основ вёрстки до сложных SPA.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🔥10🤝7
В интерфейсах важно удерживать внимание пользователя во время прокрутки. Один из приёмов — заставить карточки наслаиваться друг на друга вместо обычного скролла.
Как работает:
• position: sticky фиксирует карточки во время прокрутки;
• разные значения top создают ступенчатое прилипание;
• margin-bottom формирует пространство для stacking;
• тени усиливают ощущение глубины и слоёв.
Так можно делать более удобные блоки, где пользователь концентрируется на текущем контенте, а не теряет внимание во время длинного скролла.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍8🔥5🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
Colorize — подсвечивает все цветовые значения прямо в редакторе: HEX, RGB, HSL, CSS-переменные и другие форматы. Вместо набора символов ты сразу видишь реальный цвет рядом с кодом. Удобно при работе с UI, темами и большими CSS/SCSS-файлами, где важно быстро ориентироваться в палитре проекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤7👍7🤝2
Как сделать адаптивную сетку без 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❤1
Привет! В этом гайде создадим карточки с плавной анимацией, увеличением при наведении и динамическим добавлением через 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
Почему скролл пробивает модалку и начинает двигать страницу?
Частый 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
👍25❤7🔥5
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
👍13❤5🔥5