This media is not supported in your browser
VIEW IN TELEGRAM
Headwind — расширение, которое автоматически сортирует классы Tailwind в правильном порядке, без ручного редактирования. Один запуск и строка становится аккуратной и одинаковой во всём проекте. Особенно полезно, если над кодом работает несколько человек.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤20👍11🤝7
Привет! В этом гайде создаём фиксированную шапку, которая адаптируется к прокрутке страницы: сжимается и автоматически скрывается при скролле вниз, возвращаясь при движении вверх.
Ключевые моменты:
• HTML: структура шапки с навигационным меню.
• CSS: плавные анимации, эффект сжатия и скрытия через классы состояния.
• JS: определение направления прокрутки и переключение классов scrolled и hide.
Компонент подходит для интерфейсов с фиксированной навигацией, где важно экономить пространство и улучшать восприятие контента при активной прокрутке страницы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍9❤8
Одна из самых частых причин, почему стили не применяются, это разросшаяся специфичность селекторов.
Со временем каждый новый селектор должен быть сложнее предыдущего:
.header .nav .item a {
color: red;
}Такой код работает, но он повышает специфичность и делает дальнейшие переопределения всё сложнее.
В CSS есть способ этого избежать, использовать
:where()::where(.header .nav .item a) {
color: red;
}Особенность
:where() в том, что он всегда имеет нулевую специфичность, независимо от того, что находится внутри.Это значит, что правило применяется, но никогда не мешает более конкретным стилям компонентов. Именно поэтому
:where() идеально подходит для базовых и системных стилей::where(button) {
font: inherit;
}:where(a) {
color: inherit;
text-decoration: none;
}!important.Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤15🔥10
Во многих интерфейсах нужен простой способ переключать состояние: табы, фильтры, режимы. В этом приёме переключатель собирается на html/css, где radio-кнопки становятся источником состояния.
Как работает:
• группа radio гарантирует, что активен всегда только один сегмент;
• индикатор - отдельный слой, который перемещается через transform, не влияя на layout;
• grid задаёт геометрию элементов;
• один и тот же state управляет и положением индикатора, и цветом текста.
Такой прием легко масштабируется и отлично ложится в продакшн-код.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17👍10🔥8🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
Postman — инструмент для работы с API прямо из VS Code: отправка запросов, просмотр ответов, работа с headers, body, токенами и коллекциями. Удобно тестировать эндпоинты, проверять ответы и разбираться в API ещё до интеграции во фронт. Экономит время и помогает быстрее понять, что приходит с сервера.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍14🤝8❤4
Например,
:first-child применяется к элементу, который является первым дочерним элементом родителя, а :first-of-type выбирает первый элемент указанного типа среди дочерних.На изображении - наиболее используемые псевдоклассы для работы со структурой DOM.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤13🤝8
Записываем звук с микрофона в браузере!
Современные браузеры позволяют писать аудио без сторонних библиотек, используя
Для начала запрашиваем у пользователя доступ к микрофону (работает только в HTTPS или localhost окружении):
Перед созданием рекордера желательно проверить поддерживаемый формат:
Создаём рекордер для записи аудио:
Подготавливаем массив для аудио-чанков и подписываемся на событие
(срабатывает минимум при
Запускаем запись (при необходимости можно передать
Останавливаем запись, например, через 5 секунд:
После остановки записи собираем аудио в единый файл и воспроизводим его:
Воспроизведение может быть ограничено политикой
Освобождаем ресурсы после использования:
🔥 Формат аудио зависит от браузера — при необходимости проверяйте поддержку через
📣 Code Ready | #практика
Современные браузеры позволяют писать аудио без сторонних библиотек, используя
MediaRecorder API.Для начала запрашиваем у пользователя доступ к микрофону (работает только в HTTPS или localhost окружении):
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });Перед созданием рекордера желательно проверить поддерживаемый формат:
const mimeType = MediaRecorder.isTypeSupported('audio/webm;codecs=opus')
? 'audio/webm;codecs=opus'
: 'audio/webm';Создаём рекордер для записи аудио:
const recorder = new MediaRecorder(stream, { mimeType });Подготавливаем массив для аудио-чанков и подписываемся на событие
dataavailable:(срабатывает минимум при
stop(), а при использовании timeslice — периодически):const chunks = [];
recorder.ondataavailable = (e) => {
if (e.data && e.data.size > 0) {
chunks.push(e.data);
}
};
Запускаем запись (при необходимости можно передать
timeslice, например recorder.start(1000)):recorder.start();
Останавливаем запись, например, через 5 секунд:
setTimeout(() => {
recorder.stop();
}, 5000);После остановки записи собираем аудио в единый файл и воспроизводим его:
recorder.onstop = () => {
const blob = new Blob(chunks, { type: mimeType });
const url = URL.createObjectURL(blob);
const audio = document.createElement('audio');
audio.controls = true;
audio.src = url;
document.body.append(audio);Воспроизведение может быть ограничено политикой
autoplay: audio.play().catch(() => {});Освобождаем ресурсы после использования:
audio.onended = () => {
URL.revokeObjectURL(url);
};
stream.getTracks().forEach(track => track.stop());
};MediaRecorder.isTypeSupported() и задавайте mimeType явно.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤9🤝9👍3
Привет! В этом гайде создаём экран загрузки с анимированным процентным индикатором и плавным переходом фона от размытого к чёткому состоянию.
Ключевые моменты:
• HTML: минимальная структура — фоновый слой и текстовый индикатор загрузки.
• CSS: blur-эффект, затемняющий оверлей и центрирование контента.
• JS: анимация через requestAnimationFrame, масштабирование значений.
Такой экран загрузки отлично подойдёт для лендингов, демо-проектов и интерфейсов с акцентом на визуальное восприятие и плавные переходы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍13❤11🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
Отличный репозиторий с большим набором вопросов по разным направлениям разработки: JavaScript, HTML, CSS, React, Node.js и множеству других тем. Вопросы с примерами, объяснениями и ссылками на ресурсы для углублённого изучения. Помогает освежить знания по ключевым темам стеков, которые встречаются в проектах.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤10🔥8👎4🤝1
Для пользователей, которые не хотят анимаций!
Часть пользователей осознанно отключают анимации в системе (motion sickness, accessibility).
По умолчанию интерфейсы часто это игнорируют, а зря.
Браузер передаёт это предпочтение через
Анимации и резкие движения исчезают для тех, кому они мешают.
Можно сделать только для сложных эффектов:
🔥 Таким образом интерфейс подстраивается под пользователя, а не наоборот
📣 Code Ready | #совет
Часть пользователей осознанно отключают анимации в системе (motion sickness, accessibility).
По умолчанию интерфейсы часто это игнорируют, а зря.
.card {
transition: transform 0.3s ease;
}Браузер передаёт это предпочтение через
media query:@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}Анимации и резкие движения исчезают для тех, кому они мешают.
Можно сделать только для сложных эффектов:
@media (prefers-reduced-motion: reduce) {
.animated {
animation: none !important;
transition: none !important;
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤7🔥7🤝3