Курсор — это элемент, который постоянно находится в фокусе внимания пользователя. Даже небольшая замена указателя может сразу задать контекст взаимодействия.
Как работает:
• cursor: url() позволяет подменять системный курсор локально;
• SVG в data:-URL даёт возможность использовать emoji и векторные символы без внешних файлов;
• размер и внешний вид курсора контролируются прямо внутри SVG;
• fallback через auto сохраняет корректное поведение в браузерах.
Приём полезен в интерактивных блоках, демо-сценах и интерфейсах, где курсор сам по себе несёт смысл и усиливает UX.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥13🤝8❤3
🔥17👍10🤝7❤1
Универсальный hover-оверлей без скриптов и лишних обёрток!
Нужен стабильный hover-оверлей для родителя, который работает над всей карточкой и не конфликтует со сложной вложенностью, absolute-элементами и z-index.
Иногда визуальный hover выглядит рвано из-за наложений или пересечений. Оверлей может помочь справиться с этой проблемой:
Создаём новый stacking context, чтобы изолировать слои внутри карточки и избежать конфликтов с внешними z-index и blending.
🔥 Теперь оверлей гарантированно выше фона, но ниже контента, не ломает клики благодаря
📣 Code Ready | #совет
Нужен стабильный hover-оверлей для родителя, который работает над всей карточкой и не конфликтует со сложной вложенностью, absolute-элементами и z-index.
.card:hover::before { background: rgba(0,0,0,.05); }Иногда визуальный hover выглядит рвано из-за наложений или пересечений. Оверлей может помочь справиться с этой проблемой:
.card { isolation: isolate; }Создаём новый stacking context, чтобы изолировать слои внутри карточки и избежать конфликтов с внешними z-index и blending.
.card::before { z-index: 1; border-radius: inherit; }
.card > * { position: relative; z-index: 2; }pointer-events: none и корректно наследует скругления.Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🔥11👍8
This media is not supported in your browser
VIEW IN TELEGRAM
Это полноценный справочник с чёткими объяснениями, примерами кода и интерактивными демо. Каждая тема сопровождается примерами, которые можно сразу попробовать и понять, как именно работает та или иная конструкция. Очень полезно и новичкам, и тем, кто хочет освежить знания или быстро найти пример по конкретной задаче.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤9🔥8
Event Delegation — один обработчик вместо десятков!
Частая ошибка — навешивать обработчик на каждый элемент списка. Это усложняет код, требует повторных подписок при обновлении DOM и не работает для динамически добавленных элементов. Гораздо надёжнее использовать делегирование событий — один обработчик на общем родителе.
Обработчик на каждый элемент:
Такой подход не масштабируется: новые элементы остаются без обработки, а при повторной инициализации легко получить дубли подписок.
Делегирование через родителя:
События в DOM всплывают вверх по дереву (bubbling), поэтому родитель может перехватить клик. Через
Работает с динамическими элементами:
Новый элемент автоматически обрабатывается существующим обработчиком — дополнительных подписок не требуется.
🔥 Подход не применим к событиям без всплытия (например,
📣 Code Ready | #практика
Частая ошибка — навешивать обработчик на каждый элемент списка. Это усложняет код, требует повторных подписок при обновлении DOM и не работает для динамически добавленных элементов. Гораздо надёжнее использовать делегирование событий — один обработчик на общем родителе.
Обработчик на каждый элемент:
document.querySelectorAll('.list .item button').forEach(btn => {
btn.addEventListener('click', () => {
console.log('Clicked:', btn.dataset.id);
});
});Такой подход не масштабируется: новые элементы остаются без обработки, а при повторной инициализации легко получить дубли подписок.
Делегирование через родителя:
const list = document.querySelector('.list');
list.addEventListener('click', (e) => {
const button = e.target.closest('button');
if (!button || !list.contains(button)) return;
console.log('Clicked:', button.dataset.id);
});События в DOM всплывают вверх по дереву (bubbling), поэтому родитель может перехватить клик. Через
closest() мы определяем фактический источник действия, даже если клик был по вложенному элементу внутри кнопки.Работает с динамическими элементами:
list.insertAdjacentHTML('beforeend', `
<li class="item">
<button data-id="10">New item</button>
</li>
`);Новый элемент автоматически обрабатывается существующим обработчиком — дополнительных подписок не требуется.
focus, blur), может конфликтовать с точечным использованием stopPropagation() и требует осознанного выбора контейнера, чтобы не перехватывать лишние события.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤11👍9🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
Jest — расширение для VS Code, которое показывает статус тестов рядом с кодом и позволяет запускать их по одному клику: весь файл, отдельный тест или даже конкретный кейс. Подсветка тестов и быстрый переход к проблемному месту.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤10🤝7👍3
Если использовать
box-shadow для изображений, тень отображается по рамке элемента, а не по реальной форме картинки. В результате прозрачные области тоже получают тень.Как работает:
• box-shadow создаёт тень вокруг bounding-box элемента;
• filter: drop-shadow() анализирует альфа-канал изображения;
• прозрачные пиксели не учитываются, поэтому тень повторяет контур объекта;
Это простой способ сделать тени визуально более естественными без дополнительных обёрток и сложной графики.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤21🔥13👍11🤝3👎1
Например,
charAt() возвращает символ по индексу, includes() проверяет наличие подстроки, а slice() извлекает часть строки без изменения оригинала.На картинке — часто используемые методы для работы со строками: поиск, сравнение, замена, разбиение, изменение регистра и форматирование.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤12👍11🤝3
CSS теперь умеет автоматически менять размер input, textarea и select в зависимости от содержимого, раньше для этого писали скрипты.
Просто добавьте:
input, textarea, select {
field-sizing: content;
}Теперь ширина input и select, а высота textarea растут вместе с содержимым. У select размер подстраивается под выбранный пункт.
Чтобы поля не ломали адаптив и не вылезали за контейнер, ограничиваем максимальный размер и задаём минимальный:
input, textarea, select {
field-sizing: content;
min-width: 8ch;
max-width: 100%;
}Работает и для
textarea, она расширяется по мере ввода, без resize-хэндлов и скриптов:textarea {
field-sizing: content;
}Поддержка пока не во всех браузерах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30❤10🔥10👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Ресурс для изучения вёрстки, где собрана база по HTML, CSS и созданию сайтов. Здесь можно быстро разобраться в тегах, атрибутах, стилях, структуре страниц и типовых приёмах оформления. Материалы написаны простым языком, есть самоучители, примеры и пояснения, поэтому сайт удобно использовать как шпаргалку во время работы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥13🤝9❤3
👍24🔥12🤝9❤3
В этой статье:
• Показано, как упростить разметку и логику форм без лишнего JS;
• Разобраны малоиспользуемые возможности для аккуратной типографики, позиционирования и валидации;
• На примерах видно, как писать чище, короче и гибче, используя то, что уже давно есть в стандартах.🔊 Продолжайте читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤10🔥10🤝2
Определяем готовность DOM через DOMContentLoaded!
Подписка на событие:
Это стандартная точка старта клиентской логики, когда элементы уже существуют в документе и с ними можно безопасно работать.
Событие
Используйте
Если скрипт подключается динамически или выполняется после загрузки документа, событие
Такой паттерн гарантирует корректный запуск независимо от момента подключения скрипта.
🔥
📣 Code Ready | #практика
DOMContentLoaded срабатывает после разбора HTML и построения DOM — можно безопасно запускать клиентский код, не дожидаясь полной загрузки страницы. Не ждёт изображения и другие ресурсы, но может задерживаться блокирующими CSS и синхронными скриптами.Подписка на событие:
document.addEventListener('DOMContentLoaded', () => {
console.log('DOM готов');
});Это стандартная точка старта клиентской логики, когда элементы уже существуют в документе и с ними можно безопасно работать.
Событие
load на объекте window срабатывает позже — после загрузки всех зависимых ресурсов страницы (изображений, стилей, шрифтов, iframe и т.д.):window.addEventListener('load', () => {
console.log('Страница полностью загружена');
});Используйте
load только когда действительно необходимы уже загруженные ресурсы (например, для получения фактических размеров изображений).Если скрипт подключается динамически или выполняется после загрузки документа, событие
DOMContentLoaded может уже произойти. В этом случае следует проверить document.readyState:if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
function init() {
console.log('Инициализация');
}Такой паттерн гарантирует корректный запуск независимо от момента подключения скрипта.
DOMContentLoaded срабатывает один раз за жизненный цикл документа и является базовой точкой запуска клиентского кода сразу после готовности структуры страницы.Please open Telegram to view this post
VIEW IN TELEGRAM
🤝15👍13❤10
This media is not supported in your browser
VIEW IN TELEGRAM
Репозиторий содержит набор заданий и учебный проект по работе с JavaScript, интерфейсами и браузерным API. Здесь последовательная практика: манипуляции с DOM, события, формы, работа с данными и построение интерактивных элементов. Отличный вариант, если хочешь попрактиковаться.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍11🤝10❤1
С атрибутом
multiple можно выбрать несколько имейлов или файлов в <input>, либо несколько вариантов в списке <select>.В зависимости от элемента поведение отличается:
• для file — можно загрузить несколько файлов одновременно;
• для select — становится доступен множественный выбор пунктов списка;
• для email — можно ввести несколько адресов через запятую.
multiple делает интерфейс гибче и избавляет пользователя от повторяющихся действий при работе с формами.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤12👍12😁1
This media is not supported in your browser
VIEW IN TELEGRAM
Simple React Snippets — добавляет быстрые шаблоны для React: функциональные компоненты, импорт React, хуки, export по умолчанию и другие часто используемые конструкции. Вводишь короткое сокращение, получаешь готовый каркас компонента.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥12🤝9
На длинных страницах пользователь легко теряет контекст, какой раздел он сейчас читает.
Как работает:
• position: sticky фиксирует элемент относительно области прокрутки, но только в пределах родительской секции;
• top: 0 задаёт точку, в которой заголовок начинает «прилипать» к верху окна;
• при появлении следующей секции предыдущий заголовок автоматически вытесняется новым;
• эффект полностью декларативный и не требует отслеживания прокрутки.
Это простой способ улучшить навигацию и читаемость длинных страниц без дополнительной логики.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤25👍11🤝11