Блог Lead JS-разработчика из Хельсинки Автор: @bekharsky По рекламе: https://telega.in/channels/htmlshit/card?r=GLOiHluU или https://t.me/it_adv Чат: https://t.me/htmlshitchat
Материалы из этого канала дают на платных курсах
Frontend Portal — настоящий портал для тех кто хочет стать востребованным frontend-разработчиком. Полезные ресурсы, шпаргалки, разбор вопросов с собеседований, задачи, викторины и многое другое
👉 Присоединяйтесь к @FrontendPortal и станьте частью дружного frontend-комьюнити!
Короч, котаны, сейчас расскажу, как обстоят дела.
С появлением общедоступных чат-ботов, которые могут моментально сгенерить нужный код по запросу, планка начинающих специалистов во фронте стремительно растёт.
А значит растёт и конкуренция — ИИ выравнивает и усредняет уровень скиллов. Это как при ручной рубке деревьев был очень важен личный скилл, а после изобретения бензопилы все стали резко равны.
Но что же теперь отличает условного синьора от джуна? На мой взгляд, это две вещи: широкое понимание рабочей области и насмотренность. В непонятной ситуации синьор будет в курсе, в какую сторону копать в фундаментальных вещах, либо какая из блидинг-эдж технологий будет в тему.
То есть, чтобы оставаться на плаву, нужно одновременно и знать, куда идёт индустрия, и шарить в основах, на которых индустрия строится.
За новинками во фронтенде и за базой можно следить в авторском канале «Виталий и Веб-платформа». Примеры постов: Proxy и мемоизация функции, таймер с помощью Web Worker, URL Pattern API или фича-флаги в CSS. Также Виталий каждую пятницу публикует подборку новостей и свежих публикаций на тему фронта.
👉 @web_platform
#такое дня
Январь — время заполнения годовых Performance Review aka оценки эффективности работы.
Я, честно, в русскоязычном пространстве не работал в компаниях, где они проводились бы. Как в вашей компании это называется?
Как правило, степень упоротости глубины проработки проблем в отчётах зависит от... да ни от чего она не зависит. Бывает, что в компании на 10 человек проводится оценка по Методу 360 градусов, а бывает, что в огромной корпорации опираются только на число закрытых PR-ов и мнение менеджера.
В любом случае, очень часто приходится писать отчёт на самого себя. С одной стороны, сам себя не похвалишь — никто не похвалит, с другой — почти все мы подвержены синдрому самозванца.
Сегодня я услышал интересное мнение:
— Я просто везде отметил «выше ожиданий» и в комментарии попросил менеджера объяснить, почему он так не считает.
Позиция, как минимум, смелая. Она точно лучше чем отчёт, котором просто бы стояло «Соответствую ожиданиям» и всё.
Но насколько ж сильна вера в менеджера...
В любом случае, мне интересно, проходят ли и как подобные раунды оценки в ваших компаниях?
#work #review
#фишка дня
Что, котан, поймал ошибку CORS aka Cross-origin resource sharing error? В переводе на русский — ошибка совместного использования ресурсов между разными источниками.
Поздравляю, ты только что перешёл на следующий уровень в разработке.
В Википедии очень простое и понятное объяснение, что это такое. А нам же с тобой нужно как-то эту проблему обойти, пусть и временно.
Весь прикол ситуации в том, что отношения между сервером и браузером построены на доверии одного другому. CORS нужен не для защиты сервера, а для защиты клиента.
Кстати, именно поэтому первым решением проблемы с CORS могут быть специальные прокси: https://nordicapis.com/10-free-to-use-cors-proxies/
Если хотите, я подробнее потом о них расскажу. И о CORS тоже.
Но что делать если использование прокси не представляется возможным?
Всё просто, открываем Chrome DevTools и меняем заголовок Access-Control-Allow-Origin на *, нажав на карандашик рядом.
Естественно, таким образом можно менять и добавлять любые заголовки.
А ещё можно создать файлик с заранее прописанными заголовками — .headers — и включить его как правило через Add overrrde rule в Sources 👉 Overrides.
Всем безоблачной разработки, котаны!
#javascript #network #cors
#фишка дня от Гарри Робертса aka csswizardry.com
Когда-то очень давно поднялся вопрос красивого обтекания картинок. И появилась такая вещь: shape-outside
.
Естественно, IE эту штуку не поддерживал вообще никогда, да и в целом современное направление фронтенда больше идёт в сторону приложений и блочной структуры, нежели документов с иллюстрациями.
Тем не менее, иногда надо. И поэтому, спешу напомнить: shape-outside
нынче очень хорошо поддерживается и если вам нужно оформлять тексты, книги и статьи — самое время!
Если коротко, shape-outside позволяет описать контуры объекта, чтобы текст обтекал его именно по этим контурам. Более того, браузерам не нужен контур, они могут определить его самостоятельно по прозрачным областям PNG!
Вот только в Firefox требуется насильный репейнт... будем думать, как победить. А Safari чуть иначе определяет форму по альфа-каналу, нежели Chrome.
Upd. Важное дополнение! Чтобы правило shape-outside работало адекватно, не прячьте изображения в блоки; Firefox сходит с ума.
Ну и кодпен, конечно же: https://codepen.io/alinaki/pen/WNLVGae
Важный момент, это правило shape-margin
, без него текст начинает прилипать к объекту.
Ну а статья, откуда взята фишка, вот: https://csswizardry.com/2023/07/the-http1liness-of-http2/
Весьма интересный обзор проблем протокола HTTP/2, если что.
#css #shape #img #бородач
#фишка дня
Вроде как все в курсе, что в CSS есть функция filter(). С её помощью мы делаем размытие, дёргаем яркость... тень, опять же!
Но она умеет больше, намного больше. Точнее, умеют фильтры SVG, а функция — на них ссылаться:
filter: url("filters.svg#filterId");
Думаешь, что программирование это про код?
В 2024 году пишут код даже 10-летние, а еще лучше нейронки. Самый ценный навык разработчика — это умение быстро обучаться и развитиваться. Чем быстрее ты начинаешь применять новые знания, тем ценнее ты на рынке. А чтобы быть в топе, учиться нужно всегда.
Для этого всего-то нужно:
~ ходить на митапы
~ читать блоги БигТеха
~ общаться с сильном комьюнити
~ следить за новинками из мира IT
Чтобы собрать все эти ресурсы требуются года, куда легче читать канал XOR. Здесь команда разработчиков постоянно следит за трендами, делится опытом и упрощает жизнь.
Подпишись, стать 10х-программистом проще, чем кажется: @xor_journal
#тип дня
Попробую вместо тега #фишка внести что-то новое для TypeScript. Пусть будет "тип", а там посмотрим.
И сегодня на повестке дня запрет определённых ключей при передаче объекта. Например, контекста в трекинге или тех же пропсов в React.
Как правило, контекст в трекинге передаётся в функцию-хелпер, а после — дополняется какими-то переменными среды. Как-то так:
function logEvent(severity: LogSeverity = "info", context: LogContext = {}) {
log(severity, {
type: "event",
userId: "rick@ro.ll",
env: "dev",
...context,
})
}
type LogContextDefaults = "type" | "userId" | "env";
type LogContext = {
[key: string]: string;
} & {
[key in LogContextDefaults]?: never;
}
#такое дня
А давайте, а давайте я вам расскажу про две драмы, произошедшие во фронтенд-сообществе на днях!
Сначала у Дэна Абрамова бомбануло от того, что люди не понимают, что такое RSC aka React Server Components.
Цитата: "React Server Components does not require a server (and never has). i get that this is confusing but i’m at loss what to do. people keep repeating that it does and speak about it as if it were a true fact. can someone spread the word pls?"
Суть в том, что слово Server в RSC не означает необходимость наличия сервера. Нейминг от бога просто.
Там шикарные треды, кстати, затрагивающие историю React вплоть до нечто под названием XHP, подрались по HTMX и сигналам. Короче, вообще не скучно.
Кончилось тем, что Даня Наше Всё пообещал статьи по RSC. Ждём.
Ну а вторая драма чуть менее весёлая.
Есть такой фронтенд-ютубер — theorants">Theo Rants. И вот он выкатил видео по поводу вынесенной в иллюстрации штучки: https://youtu.be/cH8VbLM1958
Казалось бы, ну тут-то где драма? А всё просто. В качестве доказательств он привёл обзор проекта уже знакомого нам (даже лично) Ахмада Шадида — https://defensivecss.dev/
Но не упомянул его имя, вообще. Когда ему указали на это — он забанил указавшего :)
А потом указал без имени, просто поставив ссылку. Имена остальных экспертов под видео имеются.
Ахмад немного раздул скандал и теперь всё в порядке. Но осадок остался.
Я догадываюсь о причине произошедшего, но, пожалуй, воздержусь от озвучивания.
Не будьте токсичными, котаны :)
Процесс заказной разработки можно унифицировать так, что качество продукта не пострадает, а developer experience улучшится. Об этом в своей статье пишет Тимофей Устьянцев 一 фронт-тимлид крупного веб-продакшена ДАЛЕЕ. Тимофей уже несколько лет работает над проектами Kaspersky, X5, IQOS и СБЕР, и теперь делится опытом в цикле статей.
Читайте первую статью на Хабре и переходите на канал ДАЛЕЕ 一 там посты с полезными приемами и инструментами для специалистов диджитала, советы по карьерному развитию и свежие вакансии каждый понедельник.
erid: LjN8KBhKj
#codepen дня
Яркий пример работы UI/UX сообществ.
1. Один популярный в iOS UX-сообществе автор, Робера Гелера, выдвигает идею. Например, индикатор pull-to-refresh совсем необязательно делать чем-то вроде спиннера или капли, как сейчас везде. Ну, типа, зачем это делать, когда есть скроллбар? Ну и делает пример на SwiftUI. Именно его я прикладываю к посту.
2. Потом приходит второй, популярный уже во frontend-кругах (ну Джей, конечно, кто же ещё), и говорит, что это можно легко сделать на CSS и JS.
3. Пока Джей телится с кодпеном, выходит Альваро Монторо и достаёт из широких штанин свой: https://codepen.io/alvaromontoro/pen/JjzEKWG
4. Спустя несколько часов Джей, наконец, прикладывает свой вариант: https://codepen.io/jh3y/pen/gOEgxbd
Грубо говоря, там, конечно, не настоящие скроллбары, а их имитация на SVG, анимированная через GSAP и ScrollTrigger.
Но! В скором времени нас ждёт Scroll-Driven Animations API и можно будет сделать всё то же самое. С нетерпением ждём.
Бросайте вызов устоявшимся практикам, котаны!
#css #ui #gsap #svg
#заметка дня
Итак, котаны, у нас сегодня офигительная информация от Глеба. Вы уже с ним знакомы, он автор библиотеки extended-fetch, расширяющей возможности стандартного fetch. Горячо рекомендую, кстати.
Слово автору.
Наверняка вы сталкивались с проблемой медленного eslint и очень хотели использовать все ядра процессора
По этой проблеме существует issue в репозитории eslint аж с 2015 года, однако лишь в ноябре 2023 года появился PR с добавлением параллелизма при помощи флага --parallel
(к сожалению, он до сих пор не смержен).
В комментарии к issue автор PR описывает как его вдохновил пакет @mixer/parallel-prettier
: создается очередь и распределяется по процессам с воркерами, а затем их результаты выполнения аккумулируются и создается общий отчет.
По его замерам на 6 ядрах время выполнения eslint снизилось с 4 до 1 минуты исключая правила Typescript, а с ними с 4 до 2 минут.
Конечно же, предстоит решить вопрос с кеширвоанием и шарингом кеша между процессами, ну и никуда не исчезнут нюансы парсинга Typescript.
И совсем недавно появился форк eslint с поддержкой параллельной проверки нескольких файлов.
Всё это очень краткий пересказ, поэтому лучше почитать последние комментари в issue и убедиться, что всё не так плохо и прогресс в сторону улучшения производительности есть.
Всем ускорения, котаны!
#eslint #multicore #parallel
#вакансия #go #golang #гибрид
Вакансия Golang backend developer
Компания: Market Lab
Формат работы: гибрид (Москва)
ЗП: от 350 000 до 600 000 руб. на руки
FARMLAB - внутренний стартап компании в направлении blockchain. 🔥
🔹Чем предстоит заниматься:
• Принимать участие в создании архитектуры и разработке новых фичей;
• Профилирование и оптимизация высоконагруженных микросервисов;
• Unit-testing.
✅ Что ожидаем:
• Опыт разработки на Golang от 3 лет;
• Опыт разработки микросервисов, многопоточных приложений;
• Опыт разработки Web-сервисов (REST, gRPC, Websocket), Unix-системами;
• Опыт работы с реляционными базами данных и брокерами сообщений;
• Наличие бэкграунда разработки на других языках.
💰Мы предлагаем:
• Забудь о скучных переговорках! Мы работаем в современном офисе в Москва-Сити;
• У нас нет места для лагов: мы работаем на новых макбуках;
• Комфортный рабочий день с 11 до 18, в пятницу до 17, чтобы у тебя было время на отдых;
• Ты можешь легко выбрать удобный способ получения ЗП;
• Адаптация у нас – это не формальность: помогаем плавно интегрироваться в команду.
📲 Интересно?) Для связи: @a18dima
#фишка дня
Итак, сегодня в уютный канальчик™️ с ноги залетает уже всем известный Джей c кое-чем насколько потрясающим, настолько же и забытым.
И это API document.getAnimations()
, позволяющий не только получить список всех CSS-анимаций, но и, внимание, выставить промис и дождаться их выполнения! 🤯const animations = document.getAnimations()
.map(a => a.finished)
await Promise.all(animations)
Сразу кодпен: https://codepen.io/alinaki/pen/rNoEOwX
*с некоторых пор я начал форкать пены, потому что пропадают иной раз
Теперь о применимости.
Я нынче разработчик корпоративный, потому мне интересно это, например, с позиции совершения какой-нибудь операции по скрытию уведомления-тоста. Во время онбординга, например.
Ну а разработчикам промо-сайтов важность синхронизации действий и анимаций объяснять не надо.
Отличный пример забытых технологий 🙂
Не, ну серьёзно, оно с 75 Firefox доступно, как я мог его проглядеть?
А я знаю, как. Я же писал уже, что PR-служба Chrome работает прекрасно только в том случае, когда что-то появилось там первым...
#css #js #animations #promise #бородач
#такое дня
Нераскрытая история веба. Этим невозможно не поделиться:
1990: HTML invented
1994: CSS invented to fix HTML
1995: JS invented to fix HTML/CSS
2006: jQuery invented to fix JS
2010: AngularJS invented to fix jQuery
2013: React invented to fix AngularJS
2014: Vue invented to fix React & Angular
2016: Angular 2 invented to fix AngularJS & React
2019: Svelte 3 invented to fix React, Angular, Vue
2019: React hooks invented to fix React
2020: Vue 3 invented to fix React hooks
2020: Solid invented to fix React, Angular, Svelte, Vue
2020: HTMX 1.0 invented to fix React, Angular, Svelte, Vue, Solid
2021: React suspense invented to fix React, again
2023: Svelte Runes invented to fix Svelte
2024: jQuery still used on 75% of websites
#тип дня
Типом дня назначается вон тот в кожаной куртке. Да-да, о тебе говорю!
TL;DR: вычисленный тип функции с дженерик-аргументом можно сузить, декларируя тип как const.
Кроме шуток, разве тебя не бесит, что указываешь вот дженерик тип аргумента функции, производишь манипуляции над переданным объектом — а в ответ тебе вычисленный базовый тип?
Непонятно? Давай так:
function wrapNames <T>(names:T[]) {
return names.map<{name: T}>(name => ({name}));
}
const [first, second] = wrapNames(['Sergey', 'Alex'])
{
name: string;
}
function wrapNames <const T>(names:T[])
{
name: "Sergey" | "Alex";
}
// initValidator
function parse<const T extends { name: string; surname: string }>(users: T[]) {
return (name: T['name']) => users.find(u => u.name === name)?.surname;
}
// validate
const getSurname = parse([
{
name: 'Joe',
surname: 'Doe',
age: 30,
},
{
name: 'John',
surname: 'Dohn'
}
]);
getSurname: (name: "Joe" | "John") => string | undefined
#codepen дня
Давно собирался написать игру по Гарри Поттеру, но не знал, как?
Не расстраивайся, я принёс решение! Steve Gardner и его прекрасное создание Spell Caster!
Вот: https://codepen.io/ste-vg/full/zYerxoR
Я обожаю подобные примеры. Игра буквально укладывается в несколько экранов кода, но красива до безобразия.
Из технологий — Three.js и стейт-машина Stately, позволяющая описывать состояния приложения через удобные диаграммы.
Много комментариев по коду, интересная реализация распознавания жестов. Хоть сейчас бери и в магазин выкладывай :)
Я залип, в общем, как в игре, так и в её исходниках.
#webgl #threejs #game #бородач
Ваш Level Up в мире Frontend-разработки
WEBIK — канал для каждого, кто стремится проверить и углубить свои знания в вебе.
Там публикуют:
✓ Тесты на понимание кода с объяснениями
✓ Разборы задач и вопросов с собеседований
✓ Авторские обучающие статьи простым языком
✓ Макеты и эффекты для ваших пет-проектов
✓ Крутые рецепты кода
✓ Очень смешные мемасики
Вступай в WEBIK и становись крутым web разрабом!
#codepen дня
Ну что, кажется, настало то время, когда для стилизации радиокнопок и чекбоксов не нужно больше изгаляться с input:checked+i
. Это освобождает мозг и руки для более приятных вещей.
Итак, смотрим на пример от Джона Кантнера: https://codepen.io/alinaki/pen/ExMXbqz
1. Для начала, обнуляем все браузерные стили и предположения браузера об внешнем виде радиокнопок вообще через appearance
: none
.
2. Я вам этого не говорил, но, технически, уже давно можно на поля ввода накладывать псевдоэлементы. Но не на select. Я всё хочу написать большой пост про реализацию select, пока вот так.
Благодаря этой возможности, собственно, можно стилизовать чекбокс как душе угодно: ::before, ::after, :checked::before, :checked::after
... В целом, лично я бы обошёлся радиальным градиентом и одним псевдоэлементом.
3. Освободившиеся ресурсы мозга и тот факт, что теперь все элементы красиво вложены в label (как минимум, не нужны for и id), можно отправить на реализацию разных эффектов.
Например, проверить, есть ли лейбл с выделенным чекбоксом и подвинуть к нему рамку:
label:nth-of-type(2):has(input[type="radio"]:checked) ~ .selection {
transform: translateY(100%);
}
Каналы любого уважающего себя разработчика:
Java Developer — поможет узнать обо всех тонкостях и секретах языка Java.
Python Developer — научит программировать на Python как настоящий разработчик.
Подписывайся и прокачивай свои навыки👇🏻
#фишка дня
Мне снилось, что есть такой сайт, где описаны все виды центрирования контента в CSS...
Я проснулся — а его нет. Зато есть вот что: https://codepen.io/alinaki/pen/VwqXKOL
Здесь собраны шесть вариантов центрирования контента на флексах и гридах и наглядно показана разница между place-content
и place-items
в разных контекстах! Я, честно, эти правила толком и не использовал... стыд и позор 🤦♀️
В общем, не зря утро прошло.
#css #grid #flex #center #бородач
#статья дня
Давно не было интерактивных статей от кого-то, кроме Шадида и Комо :)
Время исправлять.
Сегодня — статья про концепцию и варианты реализации Drag&Drop-интерфейсов от Амита Пателя и Red Blob Games: https://www.redblobgames.com/making-of/draggable/
Давайте сразу: Red Blob Games это не компания, это сайт, собственно, Амита, где он объясняет используемые в играх и интерфейсах концепции: от поиска пути и генерации шестиугольной карты, до простейшего ИИ для игр.
Так вот, возвращаясь к статье: рассмотрены варианты реализации на мыши, тач-девайсах, скроллинг и различные сопутствующие проблемы (ну чтобы вам не пришлось разбираться, как, например, отключить выделение текста, пока тащишь элемент).
Прекрасная статья и проект вообще, моя горячая рекомендация.
#javascript #games #drag #drop
Идеальное время никогда не наступит, путешествуй сейчас
Пока рутина не поглотила с головой — погнали в путешествие! Если желание посмотреть мир притягательнее, чем перспектива провести время за сериалами на любимом диване.
Если тюлений отдых в Турции приелся, приглашаем в поездку на максималках с командой Ibicheskiy – секретные локации и нестандартные маршруты, еда от шеф-повара, премиум-отель и развлечения в духе золотой карты из “Орёл и решка”. Териберка, ЮАР, Байкал, Мексика, Бали и многое другое.
На канале есть вся подробная информация о направлениях. А за подписку по ссылке дарят 2000 на путешествие, здесь же можно узнать все цены и даты.
Реклама. ИП Суриков Сергей Сергеевич. ИНН 270815293493, erid 2SDnjcPRFgt
#статья дня
Скорее даже заметка от Софии Валитовой о порядке применения трансформаций в CSS, но концентрация знаний зашкаливает. В чём же весь вопрос?
Как вы можете помнить, не так давно все современные движки браузеров стали поддерживать определение трансформаций не только в правиле transform, но и в индивидуальных. То есть:
transform: translateX(20px) rotate(40deg) scale(1.5);
может быть записано как:
translate: 20px;
rotate: 40deg;
scale: 1.5;
Но так ли это на самом деле? И да и нет. В первом случае порядок важен, во втором — нет, он всегда будет translate
👉rotate
👉scale
. И, естественно, повторяющиеся правила будут схлопнуты.
Подробнее — в заметке Софии. Вообще у неё очень много полезного выходит, глубоко копает в спеки.
#css #transform #бородач
#баг дня
Кастомные скроллбары — штука прекрасная, хоть за 20 лет так и не нашедшая свой путь в стандарты. До сих пор полноценная стилизация возможна только в Blink aka Chromium и WebKit aka Safari.
В Firefox как не работало, так и не работает.
К слову, хорошая статья Ахмада Шадида на тему: https://ishadeed.com/article/custom-scrollbars-css/
Короче, суть бага: если вы решились таки стилизовать скроллбар, то не рассчитывайте, что Safari правильно применит стили по наведению мыши :)
Я, правда, не знаю, кому может прийти в голову менять стили скроллбара по hover.
Раз сработает, два сработает, а на третий — всё, нет. Смотрим видео, собственно.
Решение от Брамуса Ван-Дамма довольно забавное: нужно стриггерить инвалидацию стилей, для чего можно рандомной CSS-переменной присвоить неопределённое значение. Вот так:
.section:hover {
--force-rerender: ;
}
Псс… Расширить свои возможности не желаешь?
Карты зарубежных банков — это уже не роскошь, а необходимость. Как и получение визы или ВНЖ. Каковы реалии, таковы и запросы.
Кирилл из Travelers помог уже сотням своих клиентов и на отдых слетать, и без проблем переехать. С тебя только выбор страны, а все остальное в руках профессионалов 👌
Подписывайся на канал, и всегда будешь в курсе актуального в мире тревел и всего за неделю сможешь оформить зарубежную карту удаленно. А если будет сильно пригорать, то и с ВНЖ на Луну вопросы порешаешь.
Такие контакты на дороге не валяются, подписывайся, сохраняй, пересылай — Travelers
#новость дня
14 января 2006 года на конференции BarCamp в Нью-Йорке Джон Ресиг представил первую версию jQuery.
Что это значит?
Что jQuery сегодня исполнилось 18 лет!
Сейчас, пожалуй, невозможно представить как же было сложно писать веб без jQuery.
Скольким подписчикам канала меньше? У вас всё ещё впереди, котаны :)
Да и у остальных тоже, камон.
#статья дня
А знаете ли вы, котаны, что такое безопасный треугольник печали? Aka safe triangle.
Этим термином обозначается виртуальная область в меню, внутри которой можно безопасно водить курсором мыши без риска затронуть элементы ниже или выше. Смотрим на иллюстрации.
Да-да, в вашей Windows или MacOS такое тоже есть. Проверьте сами.
Собственно, почему я о нём заговорил? А тут вышла новая статья Ахмада Шадида и посвящена она такой важной вещи как "область взаимодействия".
Например, всем понятно, что на мобильных устройствах кнопки должны быть чуть побольше, потому что мы в них тыкаем пальцем. Но в то же время многие люди на десктопе заставляют нас тыкать курсором в чекбокс размером 12х12 пикселей, хотя рядом есть большой лейбл.
В общем, с чего всё началось, зачем это нужно и как сделать сайты удобными — в первой интерактивно статье Шадида: https://ishadeed.com/article/target-size
Огромное количество примеров, просто новый уровень для автора. Моё увожение.
#css #ui #ux #safe #target
7-дневный бесплатный онлайн-интенсив по frontend-разработке, на котором ты создашь фронтенд-проект на Angular с нуля без знаний в разработке.
– Сверстаешь веб-сайт на HTML + CSS
– Реализуешь функционал на JavaScript
– Используешь фронтенд-фреймворк Angular
– Подключишь Backend и загрузишь сайт на хостинг
Будет проверка домашек от экспертов и разные бонусы!
➡️ Регистрируйся
#фишка дня
В посте про поиск диагоналей в сетке и CSS-функции linear() вы могли заметить, что анимацию можно перезапустить, кликнув по экрану. Вот, кто пропустил: /channel/htmlshit/2439
И, на самом деле, сходу можно придумать, как этого достичь: удалить элемент и добавить его снова.
Но это звучит как какой-то бред. Если анимация добавляется по классу, разве нельзя просто взять и этот самый класс передёрнуть?
К сожалению, нет. Браузеры — штуки ленивые. Точнее, они берегут вычислительные ресурсы, батарею... и не знаю, что там ещё.
Убрали класс, вернули класс... дерево не поменялось. Браузеру, стало быть, пофигу и никакого reflow (перестройки лейаута), так необходимого для анимации, не случится.
А чтобы случилось, нужно просто подёргать за разные ниточки. Например, обратиться к element.offsetWidth или element.offsetHeight.
Эти свойства — ленивые, они вернут ширину или высоту элемента с учётом отступов, полей, скроллбаров...
Чтобы их взять точно и в нужный момент, браузеру придётся остановить выполнение JS, выполнить обновление "экрана" и, собственно, вычислить.
Кстати, если этот путь кажется слишком хитрожопым, можно воспользоваться Web Animations API, достать анимации документа и перезапустить:
const replayAnimations = () => {
document.getAnimations().forEach((ani) => {
ani.cancel();
ani.play();
});
};