Code Ready | Frontend
22K subscribers
1.17K photos
501 videos
17 files
863 links
Авторский канал по Frontend разработке.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

РКН: https://clck.ru/3NJCKs

Реклама на бирже: https://telega.in/c/code_ready
Download Telegram
👩‍💻 Скрываем и разворачиваем длинный текст без JS!

В интерфейсах с карточками и списками важно ограничивать объём текста, чтобы сохранить аккуратную сетку, но при этом давать пользователю возможность раскрыть полный контент без перегрузки UI.

Как работает:
-webkit-line-clamp ограничивает количество строк;

checkbox используется как источник состояния;

селекторы управляют отображением текста;

кнопка синхронизируется с состоянием.


Такой подход позволяет управлять длинным контентом декларативно, без событий и дополнительных зависимостей.

📣 Code Ready | #фишка
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍98🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
✍️ Web Dev Шпаргалка — вся веб-разработка в одном месте!

Удобный справочник, где собраны ключевые аспекты веб-разработки, а также JS: базовый синтаксис, работа с DOM, события, асинхронность, взаимодействие с API. Плюс затронуты важные вещи из Node.js, сборка, инструменты и общая архитектура. Всё подано в сжатом формате, чтобы быстро освежить знания.

📌 Оставляю ссылочку: make-website.ru

📣 Code Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🤝8🔥62
Как отодвинуть элемент в конец без justify-content?

Частая задача — в одной строке есть несколько элементов, и один из них нужно прижать к правому краю. Обычно начинают оборачивать всё в дополнительные контейнеры.
.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-настройки и даёт контроль над выравниванием.

📣 Code Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥86🤝5
Разбираем как не словить утечку памяти на обработчиках событий!

Одна из частых причин утечек — обработчик повесили, а снять забыли. Особенно это неприятно, когда событие висит не на локальном элементе, а на чём-то долгоживущем: 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 или кэше.

📣 Code Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1510🤝7
This media is not supported in your browser
VIEW IN TELEGRAM
🐱 Frontend Information — база знаний по фронтенду в одном репозитории!

Это сборник материалов для фронтенд-разработчика: от HTML/CSS и БЭМ до JavaScript, React, Redux и архитектуры приложений. Внутри есть и шпаргалки, и статьи, и курсы — всё разложено по темам и уровням. Получается готовая дорожная карта для фронтендера: можно идти от основ вёрстки до сложных SPA.

Оставляю ссылочку: GitHub 📱


📣 Code Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥10🤝7
👩‍💻 Эффект собирающихся карточек без JS!

В интерфейсах важно удерживать внимание пользователя во время прокрутки. Один из приёмов — заставить карточки наслаиваться друг на друга вместо обычного скролла.

Как работает:
position: sticky фиксирует карточки во время прокрутки;

разные значения top создают ступенчатое прилипание;

margin-bottom формирует пространство для stacking;

тени усиливают ощущение глубины и слоёв.


Так можно делать более удобные блоки, где пользователь концентрируется на текущем контенте, а не теряет внимание во время длинного скролла.

📣 Code Ready | #фишка
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-файлами, где важно быстро ориентироваться в палитре проекта.

📣 Code Ready | #vscode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥177👍7🤝2
Как сделать адаптивную сетку без media queries?

Многие пишут отдельные 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 от переполнений длинным контентом.

🔥 В итоге сетка сама решает, сколько колонок поместится в контейнер.

📣 Code Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥86
📂 Напоминалка по Web Performance Metrics!

Например, TTFB показывает, как быстро сервер начинает отвечать, а FCP помогает понять, когда пользователь впервые видит контент на экране.

На картинке — 9 основных метрик производительности сайта, которые полезно держать под рукой каждому разработчику.

Сохрани, чтобы не потерять!

📣 Code Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🤝76
Разбираем как не словить утечку памяти на обработчиках событий!

Одна из частых причин утечек — обработчик повесили, а снять забыли. Особенно это неприятно, когда событие висит не на локальном элементе, а на чём-то долгоживущем: 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 или кэше.

📣 Code Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍178🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
❤️ Dev Notes — заметки, шпаргалки и статьи по JS!

На сайте собраны не только шпаргалки, но и полноценные статьи с разбором разных тем: работа с массивами и объектами, функции, замыкания, методы JS и практические нюансы разработки. Материал подаётся с примерами кода и краткими пояснениями.

📌 Оставляю ссылочку: dev-notes.ru

📣 Code Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13🤝8👍61
📱 Минималистичные анимированные карточки!

Привет! В этом гайде создадим карточки с плавной анимацией, увеличением при наведении и динамическим добавлением через JavaScript.

Ключевые моменты:
• HTML: контейнер с карточками и кнопкой внутри.

• CSS: тень, плавный масштаб и адаптивное расположение.

• JS: добавление новых карточек без перезагрузки страницы.


Подходит для витрин товаров, портфолио или информационных блоков.

📣 Code Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥208👍7👎1
This media is not supported in your browser
VIEW IN TELEGRAM
👩‍💻 В коде слишком много операторов и условий?

Snazzy Operator — делает операторы (=>, ===, &&, >= и другие) более выразительными и аккуратными за счёт специальных лигатур и стилизации. Код становится легче воспринимать визуально, особенно в больших файлах и сложных условиях.

📣 Code Ready | #vscode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍7🤝5
Почему скролл пробивает модалку и начинает двигать страницу?

Частый 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-хаков.

📣 Code Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍257🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
🐱 Node.js Dev — большая база знаний по Node.js и backend-разработке!

На сайте собраны статьи, документация и обучающие материалы по Node.js: работа с Express, npm, API, асинхронностью, модулями, потоками и серверной разработкой в целом. Есть как базовые разборы для новичков, так и более сложные темы по архитектуре и производительности.

📌 Оставляю ссылочку: nodejsdev.ru

📣 Code Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
👍135🔥5