Перейти к содержимому
Технологии IT обновлён 26.02.2024

Senior Frontend - javascript, html, css

Senior Frontend - javascript, html, css - это канал, созданный специально для frontend программистов. Здесь вы найдете практические задачки, которые помогут вам улучшить свои навыки и проверить свои знания. Мы также предлагаем интересные статьи, которые помогут вам быть в курсе последних тенденций и новостей в мире frontend разработки. Присоединяйтесь к нашему каналу и расширяйте свои знания и опыт в этой захватывающей области программирования.

Публикации канала

✨ Стили в JS без возни со строками Через getComputedStyle() любое значение стиля приходит строкой, даже opacity. Прибавить 20px к ширине значит отрезать единицы, посчитать и склеить строку обратно. CSS Typed OM, браузерное API, отдаёт значения объектами, где число и единица лежат отдельно: const styles = $el.computedStyleMap(); const opacity = styles.get('opacity'); console.log(opacity); // CSSUnitValue console.log(opacity.value); // 0.2 console.log(opacity.unit); // 'number Chromium и Safari его поддерживают, а в Firefox оно пока за флагом. Новый полифил css-typed-om добавляет API туда, где его нет, и проходит около 95% официальных Web Platform Tests. Но currentcolor полифил не распознает: его computedStyleMap() читает getComputedStyle(), а там уже готовый цвет вроде rgb(0, 0, 0). Откуда остальные 5% и почему часть из них даже к лучшему, рассказано в оригинале. 👍 - если было полезно 👉 @seniorFront

Открыть в Telegram

🎬 Анимации в React без библиотеки анимаций В React 19.3 стабильным стал компонент <ViewTransition>. React обновляет DOM, а саму анимацию между старым и новым состоянием рисует браузер через View Transition API. Один разработчик собрал приложение дважды: на библиотеке Motion и на ViewTransition с CSS. Модалку, сортировку, навигацию и перелёт картинки в шапку удалось повторить и без библиотеки. Есть ловушка, на которой спотыкаешься сразу. Обычный setState меняет экран мгновенно, а анимация запускается, только если обновление обёрнуто в startTransition: setIsOpen(true); // instant cut startTransition(() => setIsOpen(true)); // animates JavaScript в сборке похудел примерно на 39 КБ в gzip. Но пришлось написать 179 строк CSS для анимаций, а JSX в обеих версиях вышел почти одинаковым. В статье все четыре эффекта и разбор, почему по замерам скорости победителя пока не назвать. 👍 - если было полезно 👉 @seniorFront

Открыть в Telegram

🚀 Дробить тяжёлый JS через setTimeout(0) дороже, чем кажется JavaScript в браузере работает в одном главном потоке. Пока там крутится долгий цикл, клики ждут. Обычно работу режут на порции и между ними отдают управление браузеру, чтобы он успел обработать ввод. Паузу часто делают через setTimeout(0). Но при глубокой вложенности таймеров спецификация HTML добавляет минимум 4 мс, а продолжение уходит в конец очереди. На стенде автора (500 тыс. записей, Chromium) время до результата выросло со 106 мс без дробления до 380 мс. scheduler.yield() ставит продолжение в начало очереди своего приоритета, без искусственной паузы. Итог: 125 мс, а клик обрабатывается примерно через 1 мс. Учтите, что scheduler.yield() есть не во всех браузерах: по данным статьи, его нет в Safari. Автор предлагает запасной вариант на MessageChannel. А ещё в статье сравнение с Web Worker и подбор размера порции по времени. 👍 - если было полезно 👉 @seniorFront

Открыть в Telegram

🚀 Мок-собеседование с Senior Frontend из бигтеха за 2000 ₽ вместо 7900 ₽ Да, это не просто еще один созвон, где тебе задают вопросы. Это возможность проверить себя до реального собеса и понять, что мешает выйти на следующий грейд 😎 Мок пригодится, если ты ищешь работу, хочешь вырасти в грейде или проверить свои знания перед техническим интервью Что внутри: 📂 60 минут технических вопросов и задач, которые встречаются на собеседованиях 📂 Подробный фидбек: что получилось хорошо, где потерял баллы и что стоит подтянуть После мока сможешь самостоятельно разобрать обратную связь или проработать слабые места с ментором. Так будет проще закрыть пробелы и подготовиться к следующему грейду и росту зарплаты. Мок проходит в рамках менторской программы Шортката. У нас 150+ менторов из Авито, Сбера, VK, WB, Uber и Booking, а наши менти получили уже 500+ офферов 🔥 Открыли всего 50 мест по специальной цене 2000 ₽ вместо 7900 ₽ Для записи переходи в бота → @shortcut_front_bot Реклама. О рекламодателе.

Открыть в Telegram

🛡️ Превью для HTML от нейросети может читать вашу страницу Модель вернула HTML, и его надо показать. Первое решение: iframe с srcdoc. Стили изолированы, выглядит аккуратно. Но такой iframe без атрибута sandbox работает на том же origin, что и ваше приложение. Код, который никто не читал, может достать parent.document, localStorage и куки. Защита начинается с одного атрибута: <iframe sandbox="allow-scripts" srcdoc="..."></iframe> Теперь у фрейма «непрозрачный» origin, который не совпадает ни с чьим. Та же попытка прочитать страницу падает с SecurityError. Однако сеть sandbox не ограничивает. fetch() или картинка с внешним src всё ещё могут унести данные в URL. Это отдельно закрывает Content Security Policy с default-src 'none' в документе превью. В статье ещё атаки через навигацию и popup и превью, собранное так, чтобы их выдерживать. 👍 - если было полезно 👉 @seniorFront

Открыть в Telegram

🎯 Почему иконка рядом с текстом встаёт криво По умолчанию иконка в строке садится на базовую линию шрифта и смотрится задранной. Flexbox ставит её в математический центр, но и это мимо: у шрифта разный запас «воздуха» над буквами и под ними. Армен Аллахвердян из дизайн-системы Авито предлагает другой ориентир: оптический центр, то есть середину между базовой линией и верхом заглавных букв. Высоту заглавных в CSS даёт юнит cap. Иконку абсолютно кладут в пустой inline-block span, который сидит на базовой линии. Дальше одна формула: bottom: calc((1cap - var(--icon-height)) / 2); Для Avito Sans в 15px выходит -2,1px: иконка выше заглавных и чуть уходит под базовую линию. Формула, правда, не учитывает форму рисунка: сердечко с тяжёлым верхом всё равно кажется выше. На этот случай в статье есть второй способ. А ещё там разобрано, почему популярный vertical-align: -0.125em работает далеко не со всеми шрифтами. 👍 - если было полезно 👉 @seniorFront

Открыть в Telegram

🧮 Откуда в магазинах вес 0.7000000000000001 кг Такие числа никто не вводит руками. Их посчитал JavaScript, а округлить забыли. Number в JavaScript хранится в двоичном виде, в 64 битах. Как 1/3 не записать конечной десятичной дробью, так 0.1 не записать конечной двоичной: 0.000110011… и дальше без конца. Поэтому хранится ближайшее число, которое влезает в 64 бита: (0.1 + 0.2).toFixed(20); // "0.30000000000000004441" Оба слагаемых чуть больше настоящих, сумма округляется ещё выше, а 0.3 хранится чуть меньше. Отсюда (0.1 + 0.2) === 0.3 даёт false. Округлить через toFixed() кажется решением, но и тут ловушка: (1.005).toFixed(2) вернёт "1.00", потому что внутри это число чуть меньше 1.005. В оригинале по шагам разобран перевод 0.1 в двоичный код и то, как безопасно сравнивать числа и считать деньги. 👍 - если было полезно 👉 @seniorFront

Открыть в Telegram

🎨 Свой скроллбар, который двигает CSS, а не JS Нативную полосу прокрутки почти не стилизуешь, поэтому её рисуют сами. Обычно ползунок двигают в JS: слушают scroll, читают scrollHeight, меняют DOM, а чтение размеров может вызывать перерасчёт раскладки. Идея статьи: отдать это scroll-driven animations, то есть анимациям, которые идут по прокрутке, а не по времени. Родную полосу прячут через scrollbar-width: none, а у своей анимируют две CSS-переменные: верхний и нижний край ползунка. Размер задаёт хитрость с animation-range, и ползунок занимает ровно долю видимой части. Колесо, клавиатура и тач работают сами, JS нужен только для перетаскивания. Оговорка: на момент публикации это работало в Chrome и Safari, а в Firefox только в Nightly. 👍 - если было полезно 👉 @seniorFront

Открыть в Telegram

⚡️ В сети начали массово сливать IT-курсы и книги известных онлайн школ Вот отсортированная база с тонной материала (постепенно пополняется): (363 видео, 87 книги) — Python (117 видео, 53 книги) — ВАЙБКОД (174 видео, 91 книги) — DevOps (415 видео, 68 книги) — Frontend (137 видео, 93 книги) — DS/ML (143 видео, 33 книги) — ИБ/Хакинг (352 видео, 89 книги) — С/С++/C (343 видео, 87 книги) — Java/QA (176 видео, 32 книги) — Git/Linux (167 видео, 53 книги) — PHP/1С (227 видео, 83 книги) — SQL/БД (114 видео, 77 книги) — Сисадмин (107 видео, 43 книги) — BA/SA (181 видео, 32 книги) — Go/Rust (167 видео, 43 книги) — Kotlin/Swift (112 видео, 24 книги) — Flutter (113 видео, 82 книги) — GameDev (183 видео, 37 книги) — Дизайн (136 видео, 33 книги) — PM/HR Скачивать ничего не нужно — все выложили в Telegram

Открыть в Telegram

🧩 Компонент рисует, хук думает В React-компоненте разметка часто перемешана с подготовкой данных: проверками, вычислениями, обработкой ошибок. JSX от этого читается тяжело. Статья на Хабре предлагает идею, подсмотренную во Vue 3: вынести подготовку в хук с именем useSetup[Component]. Для панели профиля ProfilePanel это useSetupProfilePanel. Он отдаёт флаг isLoading и готовые пропсы для карточки, а в компоненте остаётся только разметка. Тесты от этого тоже упрощаются. В тесте компонента хук подменяется моком (vi.mock из Vitest), и проверяется одно: попали ли пропсы из хука в нужный элемент. Логику самого хука проверяют его собственные тесты. Важно понимать, что shallow-тест через Shallowly (библиотеку автора статьи) не делает полный рендер. Дочерний компонент не выполняется, поэтому клики и изменения DOM проверяет отдельный DOM-тест. В статье весь путь от исходного компонента до шести тестов и репозиторий, чтобы запустить их у себя. 👍 - если было полезно 👉 @seniorFront

Открыть в Telegram

🤖Podlodka Backend Crew: AI в бэкенд-задачах Демо с AI чаще всего выглядят одинаково: агент за десять минут пишет сервис с нуля. Вот только в работе бэкендера всё сложнее: легаси, рискованные миграции, неработающие тесты и ревью, которое становится бутылочным горлышком. 🗓 С 26 по 30 октября в сезоне Podlodka Backend Crew «AI в бэкенд-задачах» участники: • Научатся передавать агенту инженерные стандарты и правила, чтобы он писал так, как нужно, а не как получится • Соберут ревью, где несколько моделей независимо проверяют изменения, а финальное решение остаётся за человеком • Посмотрят, куда переезжает сложность миграции легаси, когда код пишет агент • Выяснят, где ломается мечта отдать миграцию агенту целиком • Разберут, какие антипаттерны тестов агенты уже успели перенять от разработчиков. Формат — пять дней живых Zoom-сессий утром и вечером, закрытое сообщество в Telegram и общение со спикерами. Будет много интерактива и практики. Базовый ликбез оставят за бортом — этот сезон для тех, кто уже пробует AI в реальных проектах. Присоединяйтесь с 26 октября! 🔗 Билеты и программа: https://podlodka.io/becrew

Открыть в Telegram

🔍 Chrome ругается «Blocked aria-hidden»? Не глушите его Обычно это всплывает при закрытии модалки. Окно уже помечено aria-hidden="true", а фокус ещё на кнопке «Закрыть» внутри. Атрибут прячет элемент от скринридера, но не от Tab, и фокус застревает там, чего для скринридера «нет». Популярный фикс blur() чистит консоль, но роняет фокус на <body>. Пользователь скринридера слышит тишину и листает Tab с самого начала страницы. Чинится это порядком действий. Сначала фокус возвращается на кнопку, которая открыла окно, и только потом окно прячется. На время анимации закрытия окну ставят inert: оно выпадает из Tab, и скринридер его не видит. Подвох в том, что inert блокирует и фокус. Если фон за окном был inert, снимите его до focus(), иначе фокус молча не переедет. В статье разобраны четыре сценария этой ошибки и готовый код для чистого JS и React. 👉 @seniorFront

Открыть в Telegram

✨ Подсветка текущего раздела в оглавлении без JavaScript На длинной странице оглавление может подсвечивать раздел, который вы сейчас читаете. Этот приём зовут scrollspy, и обычно он держится на JavaScript, например на IntersectionObserver. Новое CSS-свойство scroll-target-group делает это без скриптов. Ставим его на обёртку с якорными ссылками: .toc { scroll-target-group: auto; } Теперь браузер сам связывает каждую ссылку с её разделом. Ссылка на раздел, который сейчас на экране, получает псевдокласс :target-current, и её остаётся только покрасить. Для пунктов выше и ниже есть :target-before и :target-after. Пока это работает только в браузерах на Chromium, Firefox и Safari не поддерживают. Но там остаётся обычный список ссылок, так что навигация не ломается. В статье к этому добавляют линию, которая плавно доезжает до текущего пункта через anchor positioning. 👉 @seniorFront

Открыть в Telegram

АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ Проект «Terminal» стал крупнейшей библиотекой бесплатного образования. В одном канале собраны курсы, книги, полезные инструменты и практические тренажёры для всех разработчиков: • Практические курсы и задания • Книги и статьи известных авторов • Полезные инструменты и ресурсы • IT-новости и инсайды Обучение по всем направлениям: SQL, Python, ML, Frontend, PHP, C++, Go, Git, Linux, QA, Java, Vibe-coding, InfoSec и др. ⌨️ подписаться

Открыть в Telegram

🔴В 2025 году Россияне заработали 5,3 млрд рублей на арбитраже криптовалют По данным Минфин 32% граждан покинули своё место работы поскольку уже в первый месяц смогли заработать 250 000 рублей, а через 2-3 месяца с легкостью вышли на семизначные числа. Самое смешное, что лишь 8% россиян что-то слышали об этой профессии хотя все инструкции бесплатно лежат на канале Арбитраж Криптовалют Там объясняют, как имея телефон и доступ в интернет заработать свои первые $3000. Причём разжёвывают так доступно, что поймёт даже ребенок. Кстати, на канале сегодня вышла новая рабочая связка! Ссылка для входа — https://t.me/+GY-3aS-FN5c0Yjhi

Открыть в Telegram

🪄 Один URL: из списка открывается modal, по прямой ссылке целая страница Если modal с деталями хранится только в useState, адрес не меняется. Ссылкой не поделиться, после reload снова список. В Next.js App Router можно иначе. Страница events/[id] работает сама по себе. А рядом в layout живёт слот @modal (в URL он не попадает) с перехватчиком того же адреса: @modal/ (.)events/ [id]/ page.tsx Префикс (.) значит «перехватить events/[id] на том же уровне». Переход по Link без перезагрузки перехватывается, и детали рисуются поверх списка. Прямая ссылка или reload перехват не включают: открывается полная страница с metadata и canonical. Подвох: слоту нужен default.tsx, возвращающий null. Без него при прямом открытии @modal остаётся без маршрута, и можно получить 404. В статье разобрано, как после закрытия вернуть пользователя на ту же страницу поиска со всеми фильтрами. 👉 @seniorFront

Открыть в Telegram

Комментарии

0

Комментарии пишут вошедшие — так видно, кто автор.

Войти

Комментариев пока нет

Будьте первым, кто расскажет о канале другим.

Пожаловаться на канал

Расскажите, что не так: модератор проверит канал и примет решение. Подпись не нужна, но почту можно оставить — тогда ответим.

Причина Что не так (необязательно) Почта для ответа (необязательно)
Открыть в Telegram