Code Ready | Frontend
Авторский канал по Frontend разработке. Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_c РКН: https://clck.ru/3NJCKs Реклама на бирже: https://telega.in/c/code_ready
نمایش بیشتر📈 تحلیل کانال تلگرام Code Ready | Frontend
کانال Code Ready | Frontend (@code_ready) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 21 699 مشترک است و جایگاه 5 954 را در دسته فناوری و برنامهها و رتبه 30 266 را در منطقه روسيا دارد.
📊 شاخصهای مخاطب و پویایی
از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 21 699 مشترک جذب کرده است.
بر اساس آخرین دادهها در تاریخ 26 اوت, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر 213 و در ۲۴ ساعت گذشته برابر 2 بوده و همچنان دسترسی گستردهای حفظ شده است.
- وضعیت تأیید: تأیید نشده
- نرخ تعامل (ER): میانگین تعامل مخاطب 8.16% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 4.47% واکنش نسبت به کل مشترکان کسب میکند.
- دسترسی پستها: هر پست به طور میانگین 1 771 بازدید دریافت میکند. در اولین روز معمولاً 971 بازدید جمعآوری میشود.
- واکنشها و تعامل: مخاطبان بهطور فعال حمایت میکنند؛ میانگین واکنش به هر پست 23 است.
- علایق موضوعی: محتوا بر موضوعات کلیدی مانند css, браузер, интерфейс, загрузка, api تمرکز دارد.
📝 توضیح و سیاست محتوایی
نویسنده این فضا را محل بیان دیدگاههای شخصی توصیف میکند:
“Авторский канал по Frontend разработке.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!
Автор: @energy_c
РКН: https://clck.ru/3NJCKs
Реклама на бирже: https://telega.in/c/code_ready”
به لطف بهروزرسانیهای پرتکرار (آخرین داده در تاریخ 27 اوت, 2026)، کانال همواره بهروز و دارای دسترسی بالاست. تحلیلها نشان میدهد مخاطبان بهطور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامهها تبدیل کردهاند.
: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 | #совет