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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/code_ready
Download Telegram
👩‍💻 Динамичный фон карточки!

Иногда обычной рамки недостаточно — элементу не хватает динамики и акцента. В этом приёме граница становится анимированной и вращается вокруг элемента.

Как работает:
conic-gradient формирует круговой градиент;

псевдоэлемент выносится за пределы карточки через inset;

анимация вращает слой через transform, не затрагивая layout;

вся интерактивность реализована без скриптов.


Градиент вынесен в отдельный слой, поэтому эффект не влияет на содержимое карточки и может переиспользоваться как независимый декоративный уровень.

📣 Code Ready | #фишка
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍10🤝101
This media is not supported in your browser
VIEW IN TELEGRAM
👩‍💻 Чтобы не писать одно и то же в React.

ES7+ React/Redux/React-Native snippets — добавляет готовые сниппеты для компонентов, хуков, Redux-логики и других часто используемых конструкций. Достаточно ввести короткое сокращение и получаешь полноценный шаблон с импортами и структурой. Помогает быстрее создавать файлы, избегая рутины.

📣 Code Ready | #vscode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1811👍11
Почему “едут” размеры некоторых элементов?

По умолчанию (box-sizing: content-box) width и height задают только размер контента, без учёта padding и border. Из-за этого элементы становятся больше, чем ожидаешь, и layout ломается:
.box {
width: 200px;
padding: 20px;
}


Фактическая ширина здесь будет 240px, что часто приводит к переполнениям:
.box {
box-sizing: border-box;
}


Теперь padding и border учитываются внутри заданной ширины, и итоговый размер остаётся 200px:
*,
*::before,
*::after {
box-sizing: border-box;
}


Поэтому это правило обычно задают глобально, чтобы вся верстка стала предсказуемой.

🔥 Это снижает количество проблем с размерами и делает layout стабильнее.

📣 Code Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥1311
This media is not supported in your browser
VIEW IN TELEGRAM
👍 JavaScript Interview Questions — база вопросов для подготовки к собеседованиям!

Репозиторий с огромной подборкой вопросов от базовых тем до продвинутых концепций. Собраны сотни вопросов по замыканиям, this, event loop, промисам, прототипам, асинхронности и др., которые регулярно встречаются на собеседованиях. Формат простой и удобный: вопрос, ответ, краткое объяснение.

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


📣 Code Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥1110
closest(): поиск ближайшего элемента по селектору!

Иногда в обработчике клика вообще не важно, куда именно попали — в текст, иконку или вложенный span. Важно — к какому элементу это всё относится. В таких случаях обычно выручает Element.closest().

Он берёт текущий элемент (event.target) и поднимается вверх по DOM, пока не найдёт первый узел, который подходит под CSS-селектор. Причём проверяет и сам элемент тоже.

Самый простой пример:
const button = event.target.closest('.btn');


Если клик был внутри кнопки — получим её. Если нет — вернётся null.

Чаще всего это используют в делегировании событий. Например, список:
document.addEventListener('click', (e) => {
const item = e.target.closest('.list-item');
if (!item) return;

console.log('clicked:', item.dataset.id);
});


Без closest() здесь обычно начинается проверка e.target, потом parentElement, потом ещё выше — и код быстро превращается в цепочку условий. С closest() это одна строка.

Хорошо видно на вложенных элементах:
document.addEventListener('click', (e) => {
const button = e.target.closest('button[data-action]');
if (!button) return;

handleAction(button.dataset.action);
});


Клик может прийтись в svg, span, что угодно внутри кнопки — логика от этого не ломается.

Иногда добавляют ещё проверку на контейнер:
const container = document.querySelector('.container');

container.addEventListener('click', (e) => {
const item = e.target.closest('.item');
if (!item || !container.contains(item)) return;

console.log('inside container');
});


Это не всегда обязательно, но полезно, если одинаковые селекторы встречаются в разных частях страницы.

Ещё момент, который иногда забывают: если элемент уже подходит под селектор, closest() вернёт его же.
const el = document.querySelector('.card');

console.log(el.closest('.card') === el); // true


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

📣 Code Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥129🤝3
📂 Напоминалка по иммутабельным методам!

Например, array.push() изменяет исходный массив, а [...array, item] — создаёт новый без мутации. То же самое с sort(), reverse() и другими — у них есть безопасные аналоги вроде toSorted() и toReversed().

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

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

📣 Code Ready | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍16🔥11
Последовательные async-операции без лишней вложенности!

Когда несколько асинхронных действий зависят друг от друга, часто пишут вложенные .then():
fetch('/data').then(r => {
r.json().then(data => {
fetch(`/more/${data.id}`).then(r2 => {
r2.json().then(console.log);
});
});
});


Такой код быстро превращается в избыточную вложенность обработчиков.

Решение — возвращать следующий Promise из .then():
fetch('/data')
.then(r => r.json())
.then(data => fetch(`/more/${data.id}`))


Каждый .then() получает результат предыдущего и передаёт дальше по цепочке, потому что возвращает Promise:
.then(r => r.json())
.then(console.log)


Ошибки ловятся централизованно в .catch(), если они произошли в цепочке или внутри .then():
.catch(console.error);


Важно: fetch не кидает ошибку на HTTP 4xx/5xx — в реальном коде проверяйте r.ok.

🔥 Такой паттерн делает асинхронный код линейным, убирает лишнюю вложенность и упрощает поддержку.

📣 Code Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1812🔥10
This media is not supported in your browser
VIEW IN TELEGRAM
🐱 HTMLCheatSheet — интерактивная шпаргалка по JavaScript!

Здесь собраны основные конструкции JS с готовыми примерами кода. Переменные, циклы, условия, массивы, строки, события, работа с датами и даже регулярные выражения. Главная фишка — это интерактивность: можно сразу копировать код, скрывать комментарии и использовать сайт как быстрый справочник во время работы.

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

📣 Code Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
20👍16🔥11👎1
Доступ к вложенным свойствам по строке!

Иногда путь к данным приходит динамически: из конфигурации, формы или API. Писать доступ вручную в таких случаях невозможно.

Если ключ хранится строкой, можно превратить его в универсальный доступ через split + reduce:
path.split('.').reduce((o, k) => o?.[k], obj);


Каждый шаг берёт текущее значение и читает следующий ключ из пути:
'profile.name'.split('.') 
// ['profile', 'name']


А reduce проходит по этому пути и безопасно читает значения:
(o, k) => o?.[k]


Если на каком-то уровне свойства нет, optional chaining вернёт undefined без ошибки.

Подход работает для простых путей через точку (a.b.c).

🔥 Это пригодится для dynamic access, form builders, JSON-парсеров, таблиц, конфигов и любых систем, где путь к данным неизвестен заранее.

📣 Code Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
17👍12🔥11
This media is not supported in your browser
VIEW IN TELEGRAM
doka guide — сайт, на котором собраны шпаргалки по HTML, CSS, JS. На каждую тему есть подробный разбор с полезными советами по применению.

📌 Ссылочка: doka.guide

📣 Code Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍13🤝102
👩‍💻 Индикатор прокрутки страницы без JS!

В длинных страницах важно давать пользователю понимание прогресса. Это снижает фрустрацию и делает чтение более предсказуемым.

Как работает:
animation-timeline: scroll() связывает анимацию с прокруткой;

transform: scaleX используется как процент прогресса;

transform-origin: left фиксирует точку роста;

вся логика реализуется декларативно, без событий scroll.


Это хороший способ заменить JS-обработчики нативными возможностями CSS.

📣 Code Ready | #фишка
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26🤝13👍122
This media is not supported in your browser
VIEW IN TELEGRAM
👩‍💻 Хочешь показать кусок кода так, чтобы он выглядел аккуратно?

Polacode
— делает скриншоты кода прямо из VS Code: с подсветкой синтаксиса, темой редактора и оформлением. Просто выделяешь код и получаешь готовое изображение для поста, документации или презентации.

📣 Code Ready | #vscode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍13🤝111
Почему 1fr ведёт себя не так, как ожидается?

Многие думают, что 1fr — это занять всё доступное пространство. На практике трек с 1fr часто упирается в минимальный размер контента (min-content) и не сжимается как ожидается.
.grid {
grid-template-columns: 1fr auto;
}


Если в первой колонке длинный текст или input, она может не сжаться и вытолкнуть вторую колонку.

Решение — явно разрешить колонке сжиматься:
.grid {
grid-template-columns: minmax(0, 1fr) auto;
}


minmax(0, 1fr) говорит браузеру: колонка может уменьшаться до 0, а не держаться за размер контента.

Теперь ellipsis, overflow и адаптив работают корректно.
.title {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}


Это особенно важно для layout с заголовками, таблицами, карточками и input-полями.

🔥 Если используешь 1fr, в большинстве случаев безопаснее писать minmax(0, 1fr) — это избавляет от скрытых багов в grid.

📣 Code Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍1110🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
❤️ Design Resources for Developers — огромная база бесплатных ресурсов для UI и дизайна!

В репозитории собраны сотни инструментов и материалов, которые помогают в дизайне: иконки, шрифты, цветовые палитры, иллюстрации, UI-киты, шаблоны, стоковые фото, генераторы, онлайн-инструменты и многое другое. Всё разбито по категориям, можно сразу найти нужный ресурс.

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


📣 Code Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥11🤝10
👩‍💻 Hover-превью без перерасчёта layout!

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

Как работает:
дополнительный слой размещается поверх через position: absolute;

основной контент остаётся на месте и не участвует в перерасчёте;

opacity и transform создают плавное появление;

взаимодействие не влияет на соседние элементы.


Такой подход используют в карточках, таблицах и dashboard-интерфейсах, где важно сохранить стабильность layout.

📣 Code Ready | #фишка
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1610🔥9
This media is not supported in your browser
VIEW IN TELEGRAM
👩‍💻 Нужно открыть PDF, не выходя из редактора?

vscode-pdf —
позволяет просматривать PDF-файлы прямо в VS Code: без сторонних приложений и переключений между окнами. Можно быстро открыть документацию, спецификации или инструкции и держать всё в одном рабочем пространстве. Удобно, когда работаешь с проектами, где часто приходится обращаться к PDF.

📣 Code Ready | #vscode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍10🤝101
Почему прыгает layout при открытии модалки?

Когда появляется вертикальный скролл, браузер добавляет scrollbar — из-за этого меняется ширина viewport и интерфейс смещается. Особенно заметно при модалках и переходах.
body {
overflow: hidden;
}


Убираешь скролл и layout резко сдвигается, потому что исчезает scrollbar.

Есть нативное решение без JS:
html {
scrollbar-gutter: stable;
}


Браузер резервирует место под скролл, даже если его нет (актуально для классического scrollbar):
html {
scrollbar-gutter: stable both-edges;
}


Можно зафиксировать пространство с двух сторон, центрирование остается ровным.

Работает в большинстве современных браузеров и сценариев (при overlay scrollbar эффект может быть незаметен).

🔥 В итоге layout больше не прыгает, интерфейс ощущается стабильнее и аккуратнее.

📣 Code Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2313🔥11
☕️ Наткнулся на отличную статью на Хабре — создание форм входа и регистрации без единой строчки JavaScript!

В статье:
• Как с помощью HTML5 и CSS3 сделать переключение между формами через :target.
• Стильные анимации и иконки через data-атрибуты.
• Продвинутые стили форм и плавные переходы с использованием CSS3.


🔊 Продолжай читать на Habr!


📣 Code Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥12🤝113