Frontend Головного Мозга
Frontend Головного Мозга - это Telegram-канал, созданный фронтендером из Сибири, который занимается всем, что связано с разработкой фронтендов и интересно самому автору. Здесь вы найдете информацию о новых технологиях, инструментах, лучших практиках и интересных проектах в мире фронтенд-разработки. Канал предлагает обзоры, советы и рекомендации от опытного разработчика, который делится своими знаниями и опытом. Если вас интересует фронтенд-разработка и вы хотите быть в курсе последних новостей и трендов в этой области, подписывайтесь на Frontend Головного Мозга в Telegram!
Публикации канала
🎯 Тултип, который сам перепрыгивает вниз, без JavaScript Подсказка над кнопкой проста, пока кнопка не окажется у верхнего края экрана: подсказку обрезает. Обычно это чинили на JavaScript, и код выходил запутанным. В CSS для этого есть Anchor Positioning API. Кнопке даём имя через anchor-name: --example-anchor, а подсказка привязывается к ней: .target { position: fixed; position-anchor: --example-anchor; position-area: top; position-try-fallbacks: flip-block; } position-area: top ставит подсказку над кнопкой. Если там не хватает места, flip-block переворачивает её на другую сторону, вниз. Подвох: с position: absolute переворот не сработает. Браузер ловит выход за содержащий блок, а у absolute он обычно прокручивается вместе с элементом. У fixed этот блок равен окну, поэтому край замечается. Дальше в статье: как развернуть стрелочку тултипа и чем подстраховать старые браузеры. 👍 - если было полезно 👉 @frontend_mind
FrontendOffer поможет пройти техсобесы Вы сейчас готовитесь к собеседованиям или уже проходите? Не чувствуете себя уверенно со всеми этими километровыми задачами на "что выведет консоль"? Давно не практиковались в лайвкодинге и боитесь налажать? Поиск работы - дело одинокое и неприятное, но мы справимся вместе (https://t.me/frontendOffer_bot). ⚡️ FrontendOffer - это: ⚫️бот со 100+ вопросами, консольными задачами и лайвкодингами с реальных собеседований от джуновского до сеньорного уровня; ⚫️эталонные ответы, подробные объяснения и дополнительные ресурсы для всех задач - можно выучить, что от тебя ждут или понять тему вглубь ; ⚫️коммьюнити, в котором проводят воркшопы и созвоны 3-4 раза в месяц, вместе тренируют решения задач, прожаривают резюме и помогают проходить собесы уверенно; 📍Ближайшие ивенты коммьюнити: 28 октября - консольный блиц. Будем публично решать и разбирать сложные консольные задачи и нарабатывать уверенность с ними; 🖤Почему мы: Автор проекта, Наташа Давыдова, фронтенд-разработчик с 6+ годами коммерческого опыта, включая бигтехи. Я расскажу и покажу, как расщелкивать хардовые и софтовые собесы, чтобы получать офферы с максимальным КПД. ➡️ Приходи к нам (https://t.me/frontendOffer_bot), решай задачи, вступай в коммьюнити. Тебе больше не придется бороться с рынком в одиночку. Erid 2SDnjcvfJoW @frontend_mind
✨ Любой кусок страницы в окне поверх всех окон Обычный Picture-in-Picture выносит в плавающее окошко только видео. Оно остаётся на экране, даже если переключиться на другую вкладку или программу. Document Picture-in-Picture API делает то же самое с любым HTML: тикер акций, чат, список дел. По сути, получается веб-виджет. Окно создаёт requestWindow(), и внутри у него свой пустой document. В статье туда клонируют тикер: /* Select the component */ const stock = document.querySelector("#stock"); /* Clone the component and append it to the DPIP */ DPIP.document.body.append(stock.cloneNode(true)); Стили сами не переедут, их копируют в head окна отдельно. А поправить вид только внутри окна поможет @media (display-mode: picture-in-picture). Учтите, что API работает только на десктопе, а Safari на момент статьи его не поддерживал. В статье есть полный код кнопки и разбор опций окна. 👍 - если было полезно 👉 @frontend_mind
🧩 Один инпут в Angular для строки, функции, шаблона или компонента Когда компонент принимает кастомный контент, приходится заранее решать: хватит строки или нужен TemplateRef? Потом тип проверяют через @if и ветвят шаблон. Библиотека Polymorpheus от команды Taiga UI убирает этот выбор. Директива *polymorpheusOutlet одинаково отрисует любой из четырёх вариантов в переданном контексте: {{ primitive }} Строка или результат функции попадает в primitive. Пример с тултипом: обычно в нём просто текст. Когда понадобится ссылка или кнопка, пользователь передаст шаблон, и API тултипа переделывать не придётся. Оговорка: функцию от конструктора компонента не отличить, поэтому компонент оборачивают в PolymorpheusComponent. А в статье ещё и трюк, как сделать иконку, которую можно задать просто по имени или целым шаблоном. 👍 - если было полезно 👉 @frontend_mind
🚀 Предзагрузка, которая грузит не те данные В TanStack Router у маршрута есть loader: он запускает запрос ещё до рендера, а компонент забирает готовые данные из кеша TanStack Query. Но параметры запроса тогда описаны дважды, и если они разойдутся, ошибки никто не покажет. Пример из статьи. В дашборд добавили ?asOf=дата, но только в компоненте. По ссылке loader грузит данные «на сегодня», а компонент потом запрашивает снимок заново. Лишний запрос и лишнее ожидание. Автор предлагает класть queryOptions в контекст маршрута. Их создаёт одна функция context, а loader и компонент через useRouteContext() берут один и тот же объект. Разойтись им просто негде. Учтите, что функция context на момент статьи была новой и не описанной в документации. В статье ещё о том, как контекст наследуют дочерние маршруты и почему лишних ререндеров не будет. 👍 - если было полезно 👉 @frontend_mind
🤖Podlodka Backend Crew: AI в бэкенд-задачах Демо с AI чаще всего выглядят одинаково: агент за десять минут пишет сервис с нуля. Вот только в работе бэкендера всё сложнее: легаси, рискованные миграции, неработающие тесты и ревью, которое становится бутылочным горлышком. 🗓 С 26 по 30 октября в сезоне Podlodka Backend Crew (https://podlodka.io/becrew?utm_campaign=early_bird_backend_crew_5&utm_source=telegram&utm_medium=paid&utm_content=frontendInterview) «AI в бэкенд-задачах» участники: • Научатся передавать агенту инженерные стандарты и правила, чтобы он писал так, как нужно, а не как получится • Соберут ревью, где несколько моделей независимо проверяют изменения, а финальное решение остаётся за человеком • Посмотрят, куда переезжает сложность миграции легаси, когда код пишет агент • Выяснят, где ломается мечта отдать миграцию агенту целиком • Разберут, какие антипаттерны тестов агенты уже успели перенять от разработчиков. Формат — пять дней живых Zoom-сессий утром и вечером, закрытое сообщество в Telegram и общение со спикерами. Будет много интерактива и практики. Базовый ликбез оставят за бортом — этот сезон для тех, кто уже пробует AI в реальных проектах. Присоединяйтесь с 26 октября! 🔗 Билеты и программа: https://podlodka.io/becrew (https://podlodka.io/becrew?utm_campaign=early_bird_backend_crew_5&utm_source=telegram&utm_medium=paid&utm_content=frontendInterview) @frontend_mind podlodka.io Онлайн-конференция Podlodka Backend Crew, сезон #5 Недельное мероприятие от команды Podlodka: ежедневные интерактивные сессии в Zoom по актуальным проблемам backend-разработки, нон-стоп общение с экспертами и звёздами индустрии, закрытое профессиональное сообщество в 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 (https://t.me/+93HR2BsO7nM4ZmUy) Скачивать ничего не нужно — все выложили в Telegram (https://t.me/+93HR2BsO7nM4ZmUy) @frontend_mind
✨ Рамка, которая рисует себя сама, на чистом CSS Свойство border-image позволяет сделать рамкой элемента градиент вместо обычной линии. Но анимировать градиент напрямую не выйдет: браузер не умеет плавно двигать проценты внутри него. Это обходится так: регистрируем свою переменную через @property и указываем её тип. Такую переменную браузер уже плавно меняет: @property --p { syntax: ""; initial-value: 0%; inherits: false; } Дальше она встаёт в градиент рамки: linear-gradient(-45deg, red var(--p), transparent 0%). Пока --p равна 0%, рамка прозрачная. При наведении --p становится 100%, красный заполняет рамку, и кажется, что её рисуют на глазах. Есть подвох: border-image не изгибается по форме элемента, так что скруглённые углы он не повторит. В статье тот же приём крутят дальше: conic-gradient, анимация border-image-slice и ещё куча вариаций. 👍 - если было полезно 👉 @frontend_mind
🧩 Как сделать, чтобы фоновый узор не обрезался снизу У секции повторяющийся фоновый узор, плитка 52×44px. Высота блока зависит от текста, поэтому нижний ряд плиток часто обрезается на середине. Можно поставить background-repeat: round. Но тогда браузер сжимает или растягивает саму плитку, чтобы она уместилась целиком. Решение аккуратнее: взять автоматическую высоту через calc-size() и округлить её функцией round() до кратного высоте плитки. Высота плитки лежит в переменной --tile-height. .section { height: calc-size(auto, round(up, size, var(--tile-height))); } Выглядит как фиксированная высота, но работает скорее как min-height. Блок по-прежнему подстраивается под контент, просто его высота всегда кратна высоте плитки, и узор не режется. Оговорка: на момент написания статьи это работает только в Chrome. В оригинале есть живые демо, разбор округления вверх и вниз и то, как подогнать под узор ещё и padding. 👉 @seniorFront @frontend_mind
АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ Проект «Terminal (https://t.me/+cqCn4zG0DwkzYmFi)» стал крупнейшей библиотекой бесплатного образования. В одном канале собраны курсы, книги, полезные инструменты и практические тренажёры для всех разработчиков: • Практические курсы и задания • Книги и статьи известных авторов • Полезные инструменты и ресурсы • IT-новости и инсайды Обучение по всем направлениям: SQL, Python, ML, Frontend, PHP, C++, Go, Git, Linux, QA, Java, Vibe-coding, InfoSec и др. ⌨️ подписаться (https://t.me/+cqCn4zG0DwkzYmFi) @frontend_mind
✨ Скроллбар, который следит за прокруткой без JavaScript Свой скроллбар обычно рисуют так: нативный прячут, а размер и положение ползунка считают в JS на каждое событие scroll. Это дорого: scroll летит много раз в секунду, а чтение scrollHeight может вызвать reflow. Разработчик библиотеки Taiga UI отдал эту работу CSS через scroll-driven animations. Их прогресс зависит не от времени, а от прокрутки контейнера. Хитрее всего с высотой ползунка. Анимации его краёв растягивают на высоту контейнера (100cqb) за конец прокрутки, и в крайней точке они замирают ровно там, где нужно: .bar { animation-range: 0% calc(100% + 100cqb), calc(0% - 100cqb) 100%; animation-fill-mode: both; } JS остаётся только для перетаскивания ползунка мышью. Учтите, что на момент статьи Firefox умел это лишь в Nightly, поэтому в Taiga UI новая схема включается только там, где браузер её поддерживает. Отдельно красиво решено, как прибить ползунки к краю контейнера: через anchor positioning. 👉 @seniorFront @frontend_mind
✨ CSS может заметить, что элементы вот-вот столкнутся Сбоку от секции с карточками висит декоративный элемент, и его размер и положение меняются вместе с экраном. Медиазапросом момент наезда не поймать, а спрятать декор нужно, как только зазор станет меньше 20px. Между декором и секцией через anchor positioning растягивается невидимый элемент .measure. Внутри у него псевдоэлемент шириной 20px и overflow-x: auto. Когда зазор меньше 20px, .measure переполняется. Само переполнение запускает scroll-driven анимацию, прокручивать ничего не нужно. Анимация лишь ставит --touching: 1, а style container query прячет декор: .decor { @container style(--touching: 1) { opacity: 0; } } Работает только в браузерах, где есть и scroll-driven анимации, и anchor positioning, так что это улучшение поверх обычной вёрстки. В статье есть интерактивные демо, где можно потянуть границу и поймать момент срабатывания. 👉 @seniorFront @frontend_mind
🧮 Поле ввода, в которое можно вписать формулу Часто число для формы сначала надо посчитать. С обычным приходится бегать в калькулятор и обратно. А позже в поле виден только итог, и непонятно, откуда он взялся. Bramus сделал для этого веб-компонент . Пишешь (2 + 3) * 4, уходишь из поля, и там появляется 20. Возвращаешь фокус, и снова видна формула, её можно проверить или поправить. Считает компонент своим парсером, без eval(). Он понимает обычные операторы, скобки и функции вроде sqrt, round, min, max. Внутри лежат обычные , поэтому отправка формы и валидация работают как есть. С недописанной формулой вроде 2 + форма не отправится. Учтите, что по умолчанию в поле с вашим name уходит сама формула «2 + 3», а не 5. Чтобы сервер получил число, нужен атрибут submit="result". Как устроены три поля внутри и почему стили на самом теге сразу применяются к ним, Bramus показывает в статье. 👉 @seniorFront @frontend_mind
🎨 Текст, который сам подбирает цвет под фон Если фон карточки задаётся фирменным цветом и может быть любым, подбирать к нему цвет текста вручную неудобно. CSS-функция contrast-color() берёт цвет и возвращает black или white, смотря что контрастнее: .card { --bg: var(--brand-color); background: var(--bg); color: contrast-color(var(--bg)); } Можно пойти дальше. Сохраняем результат в кастомное свойство, зарегистрированное через @property, и проверяем его запросом @container style(). Вышло white, значит фон тёмный, и текст красим в светлый оттенок цвета карточки. Вышло black, берём глубокий тон того же оттенка. Если цвета палитры задать вручную, а не выводить из фона, на результат contrast-color() уже не опереться: такие пары автор советует тщательно тестировать. В статье этот приём вместе с light-dark() собран в целую систему светлой и тёмной темы. 👉 @seniorFront @frontend_mind
🔍 Убрал повтор в скринридере и сломал кнопку Джейк Арчибальд делал кнопку-иконку «жирный» с подсказкой «Bold (⌘B)» на popover="hint". На кнопке стояли aria-label="Bold" и aria-describedby со ссылкой на подсказку. VoiceOver читал «Bold. Bold. Command B». Чтобы убрать повтор, Джейк удалил aria-label. И кнопка осталась без доступного имени, то есть без названия для скринридера. aria-describedby добавляет только описание, имя он не заменяет. JAWS в итоге собрал текст из соседних элементов и объявил кнопку сразу жирной и курсивной. Чинится заменой одного атрибута: aria-labelledby вместо aria-describedby. Он тоже ссылается на подсказку по id, но берёт из неё именно имя. Теперь VoiceOver говорит «Bold. Command B. Button». Сам Джейк советует проверять в нескольких скринридерах: один, как и один браузер, полной картины не даёт. В статье есть и вариант, где имя и сочетание клавиш разведены по разным span. 👉 @seniorFront @frontend_mind
Комментарии
Комментариев пока нет
Комментарии пишут вошедшие — так видно, кто автор.
Войти