Code Ready | Frontend
Авторский канал по Frontend разработке. Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_c РКН: https://clck.ru/3NJCKs Реклама на бирже: https://telega.in/c/code_ready
Show more📈 Analytical overview of Telegram channel Code Ready | Frontend
Channel Code Ready | Frontend (@code_ready) in the Russian language segment is an active participant. Currently, the community unites 21 699 subscribers, ranking 5 954 in the Technologies & Applications category and 30 266 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 21 699 subscribers.
According to the latest data from 26 August, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by 213 over the last 30 days and by 2 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 8.16%. Within the first 24 hours after publication, content typically collects 4.47% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 771 views. Within the first day, a publication typically gains 971 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 23.
- Thematic interests: Content is focused on key topics such as css, браузер, интерфейс, загрузка, api.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Авторский канал по Frontend разработке.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!
Автор: @energy_c
РКН: https://clck.ru/3NJCKs
Реклама на бирже: https://telega.in/c/code_ready”
Thanks to the high frequency of updates (latest data received on 27 August, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
:picture-in-picture в CSS применяется к видео, которое находится в режиме «картинка в картинке». Он позволяет стилизовать элемент <video>, когда пользователь вынес его в плавающее окно поверх других приложений или вкладок.
Как это используется:
• изменение оформления видео в PiP-режиме; • визуальная индикация активного режима воспроизведения; • адаптация интерфейса под плавающее окно.Комбинируйте с соседними селекторами (
~, +) и :has(), чтобы менять другие элементы интерфейса, пока видео в PiP.
📣 Code Ready | #свойствоtextarea можно тянуть во все стороны.
Пользователь легко может растянуть её по ширине и сломать grid, flex или весь form-layout.
Обычно никто это не контролирует.
textarea {
resize: both;
}
Из-за этого форма начинает разъезжаться, особенно в боковых панелях, модальных окнах и узких контейнерах.
Лучше сразу ограничить направление resize.
textarea {
resize: vertical;
}
Теперь пользователь может увеличить высоту, но ширина layout остаётся стабильной.
Если resize вообще не нужен:
textarea {
resize: none;
}
Это особенно полезно для сложных форм.
.modal textarea,
.sidebar textarea {
resize: vertical;
}
🔥 Контроль resize убирает неприятные layout-баги в формах и делает UI заметно стабильнее.
📣 Code Ready | #советОставляю ссылочку: GitHub 📱📣 Code Ready | #репозиторий
• field-sizing: content включает автоматический расчёт размеров поля; • textarea начинает подстраиваться под объём текста; • высота увеличивается по мере ввода; • браузер сам рассчитывает размеры без JS-логики.🔥 Это отличный способ упростить формы, чаты и интерфейсы ввода текста. 📣 Code Ready | #фишка
querySelectorAll() как-то привязан к DOM и должен сам обновляться при изменениях на странице. Но это не так — он возвращает фиксированный снимок на момент вызова.
const items = document.querySelectorAll('.item');
console.log(items.length); // 3
document.body.insertAdjacentHTML(
'beforeend',
'<div class="item"></div>'
);
console.log(items.length); // всё ещё 3
После этого items никак не пересчитывается. Это просто сохранённый результат поиска, а не живая коллекция.
Если нужен актуальный список — придётся заново выполнить запрос:
let items = document.querySelectorAll('.item');
document.body.insertAdjacentHTML(
'beforeend',
'<div class="item"></div>'
);
items = document.querySelectorAll('.item');
console.log(items.length); // 4
Из-за этого иногда появляются простые, но неприятные ошибки в динамическом UI. Например, когда элементы добавляются позже, а список уже был сохранён заранее:
const buttons = document.querySelectorAll('.btn');
addNewButton();
// новый элемент сюда уже не попадёт
buttons.forEach(bindHandler);
Человек ожидает, что обработчик навесится на всё, но фактически работает только с тем, что существовало в момент запроса.
Есть и другой вариант поведения — живые коллекции. Например:
const items = document.getElementsByClassName('item');
console.log(items.length); // 3
document.body.insertAdjacentHTML(
'beforeend',
'<div class="item"></div>'
);
console.log(items.length); // 4
Такие коллекции действительно меняются вместе с DOM. К ним относятся getElementsByClassName, getElementsByTagName и element.children. Разница простая: querySelectorAll даёт снимок, а getElementsBy* держат связь с DOM.
При этом NodeList, который возвращает querySelectorAll, можно спокойно перебирать как массив:
const items = document.querySelectorAll('.item');
items.forEach(item => {
console.log(item);
});
Но это всё ещё не массив:
Array.isArray(items); // false
Если нужны методы массива — его нужно явно преобразовать:
const items = [...document.querySelectorAll('.item')];
🔥 На практике querySelectorAll используют чаще именно из-за предсказуемости. Он не меняется сам по себе, и это как раз удобно в реальных приложениях. Для динамики обычно либо делают повторный запрос, либо уходят в делегирование событий.
📣 Code Ready | #практикаОставляю ссылочку: GitHub 📱📣 Code Ready | #репозиторий
button, tab, dropdown-item или card-action и выделяется текст.
Интерфейс сразу выглядит менее качественным.
.button {
user-select: none;
}
Теперь текст внутри элемента нельзя случайно выделить мышью или тапом.
Это особенно полезно для интерактивных элементов.
button,
.tab,
.badge {
user-select: none;
}
Но важно не применять это глобально.
body {
user-select: none;
}
Так можно сломать UX: пользователь не сможет копировать текст.
Используй только там, где выделение реально не нужно.
button,
.control,
.action
Это маленькая деталь, но она заметно улучшает UI.
🔥 user-select: none — простой способ сделать интерфейс визуально чище и приятнее.
📣 Code Ready | #совет• Показано, как решить проблему прыгающего контента через scrollbar-gutter;
• Разбираются современные CSS-возможности: system-ui, light-dark(), margin-inline и align-content;
• Объясняется, как сделать код чище, короче и удобнее для поддержки без лишних Flexbox и Grid-конструкций.
🔊 Продолжай читать на Habr!📣 Code Ready | #статья
event.target и не задумываются, что это не всегда тот элемент, на который был повешен обработчик.
Например:
<button class="btn">
<span>Сохранить</span>
</button>
Повесим обработчик на кнопку:
button.addEventListener('click', (event) => {
console.log(event.target);
});
Если кликнуть по тексту внутри span, то в консоль попадёт именно span, а не button.
Потому что event.target всегда указывает на элемент, который стал источником события.
Теперь выведем имя тега:
button.addEventListener('click', (event) => {
console.log(event.target.tagName);
});
Клик по кнопке даст такой результат: BUTTON. А клик по тексту внутри span даст: SPAN.
Из-за этого иногда появляются неожиданные баги:
button.addEventListener('click', (event) => {
event.target.disabled = true;
});
Если событие пришло от вложенного элемента, код будет работать не с кнопкой, а с этим элементом. В результате можно случайно изменить не тот элемент или получить неожиданный результат.
В таких ситуациях обычно нужен event.currentTarget:
button.addEventListener('click', (event) => {
console.log(event.currentTarget);
});
currentTarget всегда содержит элемент, на котором сейчас выполняется обработчик.
То есть:
button.addEventListener('click', (event) => {
console.log(event.target);
console.log(event.currentTarget);
});
При клике по span первым будет исходный элемент события:
event.target — span
А вторым — элемент, на котором выполняется обработчик:
event.currentTarget — button
Особенно хорошо разница видна при делегировании событий:
list.addEventListener('click', (event) => {
console.log(event.target);
console.log(event.currentTarget);
});
Здесь currentTarget всегда будет ссылаться на list, независимо от того, по какому дочернему элементу кликнули.
Ещё один момент: currentTarget существует только во время обработки события.
const saved = event.currentTarget;
После завершения обработки значение event.currentTarget становится null. Поэтому если ссылка нужна позже — её стоит сохранить заранее.
🔥 Простое правило: target отвечает на вопрос «какой элемент стал источником события», а currentTarget — «на каком элементе сейчас выполняется обработчик». Понимание этой разницы помогает избежать множества мелких ошибок при работе с DOM-событиями.
📣 Code Ready | #практикаquerySelector() помогает быстро находить элементы на странице, addEventListener() обрабатывать события пользователя, а createElement() динамически создавать новый контент.
На картинке — основные DOM-методы и свойства: поиск элементов, работа с содержимым, атрибутами, классами, событиями и управление структурой документа.
Сохрани, чтобы не потерять!
📣 Code Ready | #ресурс.error {
display: none;
}
А потом отдельно добавляют класс при появлении контента.
Но CSS умеет определять пустые элементы самостоятельно.
.error:empty {
display: none;
}
Теперь блок автоматически скрывается, если внутри ничего нет.
Можно делать и обратную логику.
.card:not(:empty) {
padding: 16px;
}
Отступы появятся только тогда, когда внутри действительно есть контент.
Особенно удобно для:
error,
hint,
description,
badge
Где содержимое может появляться динамически.
🔥 :empty позволяет убрать лишние классы и часть условной логики прямо средствами CSS.
📣 Code Ready | #совет