Якщо monobank після сьогоднішнього дня не зробить доповідь на Highload Fwdays, то я навіть не знаю, нашо це все було.
До речі, один з лимонів можна знайти, відкривши чиюсь банку. Можна і цю. Бо збір на детектори дронів для 115-ї бригади шось засмутивсь і стоїть.
https://send.monobank.ua/jar/AeXQ6YRf2X
До речі, один з лимонів можна знайти, відкривши чиюсь банку. Можна і цю. Бо збір на детектори дронів для 115-ї бригади шось засмутивсь і стоїть.
https://send.monobank.ua/jar/AeXQ6YRf2X
Telegram
Дивовижний світ веброзробки
#коштозбір
Товариство, маємо новий запит від військових.
Для роти матеріально-технічного забезпечення 115 бригади потрібно два детектори дронів "Чуйка".
Детектори треба для бензовозів, які заправляють тяжку техніку на Покровському напрямку.
Наразі це…
Товариство, маємо новий запит від військових.
Для роти матеріально-технічного забезпечення 115 бригади потрібно два детектори дронів "Чуйка".
Детектори треба для бензовозів, які заправляють тяжку техніку на Покровському напрямку.
Наразі це…
❤35😁16
Товариство, давно хотів вам розповісти про одну благочинну ініціативу, яка триває вже кілька років. Я назвав її Незамовлений Гепі Міл. Народилась ця ідея на початку повномасштабки. Ми всі тоді були шоковані, а найбільше — тим, що росіяни абсолютно спокійно вбивали дітей. Як вони це роблять і зараз.
І я захотів почати робити щось на вшанування памʼяти дітей, загиблих від рук росіян. І водночас допомогти тим дітям, які цієї допомоги дійсно потребують. Так і народився "ГепіМіл" — коли я раз на тиждень пересилаю зібрані кошти до "Міста Добра" — найбільшого прихистку України для жінок, дітей та бабусь.
Керівницю центру я знаю особисто. Те, що вона робить — це титанічна і часто невдячна праця, і найменше, що ми можемо зробити для цього центру — це раз на тиждень трошечки їм допомогти.
А чого Незамовлений Гепі Міл, спитаєте ви? Бо у нас в сімʼї колись була традиція щопʼятниці замовляти ГепіМіли, сідати в залі та усі разом дивитися якогось кіна чи мультика. А потім МакДональдси закрилися, а потім знову відкрилися, і ми знову отримали змогу замовити ГепіМіла та збиратися купки за мультиком. А от діти, що загинули — вже ніколи не зможуть замовити їх собі. Звідси й назва — Незамовлений ГепіМіл.
Тож був би надзвичайно радий, якби до цієї ініціативи почали долучатися і ви, любе моє товариство.
Детальніше тут: https://news.1rj.ru/str/babichxbabich/106
Дякую вам!
І я захотів почати робити щось на вшанування памʼяти дітей, загиблих від рук росіян. І водночас допомогти тим дітям, які цієї допомоги дійсно потребують. Так і народився "ГепіМіл" — коли я раз на тиждень пересилаю зібрані кошти до "Міста Добра" — найбільшого прихистку України для жінок, дітей та бабусь.
Керівницю центру я знаю особисто. Те, що вона робить — це титанічна і часто невдячна праця, і найменше, що ми можемо зробити для цього центру — це раз на тиждень трошечки їм допомогти.
А чого Незамовлений Гепі Міл, спитаєте ви? Бо у нас в сімʼї колись була традиція щопʼятниці замовляти ГепіМіли, сідати в залі та усі разом дивитися якогось кіна чи мультика. А потім МакДональдси закрилися, а потім знову відкрилися, і ми знову отримали змогу замовити ГепіМіла та збиратися купки за мультиком. А от діти, що загинули — вже ніколи не зможуть замовити їх собі. Звідси й назва — Незамовлений ГепіМіл.
Тож був би надзвичайно радий, якби до цієї ініціативи почали долучатися і ви, любе моє товариство.
Детальніше тут: https://news.1rj.ru/str/babichxbabich/106
Дякую вам!
Telegram
Бабіч × Бабіч
#НезамовленийГепіМіл
Котики, як хто раптом пропустив — нині пʼятниця. А значить пора долучатися до Незамовленого Гепі Мілу.
3 450 гривень вже попрямували до чернівецького дитячого центру "Мрія Марти" (Місто Добра). А від початку року ви надіслали вже 153…
Котики, як хто раптом пропустив — нині пʼятниця. А значить пора долучатися до Незамовленого Гепі Мілу.
3 450 гривень вже попрямували до чернівецького дитячого центру "Мрія Марти" (Місто Добра). А від початку року ви надіслали вже 153…
❤28
#мислення_розробника
useLess
Спробую коротенько викласти основні думки моєї доповіді на React+ Fwdays'25. Відразу попереджаю, що до самих хуків доберемся далеко не відразу.
Отже, найперша теза — на мою особисту думку, архітектура React безбожно застаріла. І саме цим пояснюється постійне намагання вигадати чергові чудодійні покращення та магічні "оптимізації".
Теза друга — якщо ваш застосунок повільно працює, то у переважній більшості випадків React тут ні до чого, а проблема знаходиться по ту сторону монітора.
Думка третя — без розуміння недоліків інструменту неможливо ефективно ним користуватися. Якщо вашим першим рішенням буде втулити черговий useMemo — для мене це очевидна ознака, що ви взагалі не знаєте, як працює React, і які у нього є проблеми.
Теза четверта: кожен хук — точка доданої складності. React мусить в неочевидний для нас спосіб відслідковувати порядок їх виклику, робити додаткові перевірки, витрачати ресурси на перевірку залежностей і все це тримати в доволі кучерявій структурі даних з доволі кучерявою логікою відтворення.
Пʼята думка — завжди треба ставити під сумнів сферу відповідальности UI-компонентів. Чи мають тягнутися дані саме тут? Чи потрібне це обчислення саме тут? І так далі. Потрапивши під вплив магічного мислення "хуки оптимізують", дуже легко втратити здоровий ґлузд і перетворити маленький компонент на звалище.
І нарешті, остання теза — use Less. Менше хуків, більше логіки. Треба писати на JS, а не на хуках, тобто змінити напрямок мислення. Бо в першу чергу наша задача зробити так, аби воно працювало, а про всілякі плюшечки й рюшечки варто думати в кінці.
Звичайно ж, це не панацея. Що спрацює для одного випадку, зашкодить в іншому. В одному місці можна викинути useMemo, в іншому без нього ніяк.
Головний принцип, за яким завжди мають прийматися архітектурні рішення — IT DEPENDS. Тому кожен випадок треба розглядати окремо.
Але центральною думкою завжди має бути — "Нашо воно тут?". Якщо ви не можете виправдати useCallback чи useEffect — їм тут не місце.
Наостанок ще побіжно згадаю про React Compiler, що вийшов буквально кілька днів тому. Так от, друзі, радіти тому, що от нарешті можна викинути useMemo чи useCallback, ще зарано.
RC вводить примусове кешування. До того ж доволі прямолінійне. Це один з моментів, які найперше кинулися мені в очі. Однозначно вилізуть моменти, коли що він, що useMemo будуть заважати.
А найбільшою проблемою його, на мою особисту думку, є те, що RC вводить ще один додатковий, до того ж прихований, рівень складності.
Він буде покривати багато моментів, але із ним вам треба бути ще обережнішими, бо на додачу до жонглювання хуками доведеться ще й тримати в голові, чи увімкнутий тут Compiler, чи ні.
А найсумніше в усій цій історії те, що найбільша проблема так і не буде ніколи вирішена. Я говорю про сам React, усі зусилля з оптимізації якого зводяться до того, аби хоч якось обліпити подорожниками й пластирями його підхід з віртуальним DOM. Це було проривне рішення для 2013 року, але у 2025 році це вже просте латання дірок.
Якщо ж спробувати ще більше скоротити зміст доповіді, то вийде щось на кшталт:
Спочатку думайТЕ, а вже потім пишіТЕ.
Гарного усім початку робочого тижня! Якщо цікаво більше подискутувати про те, чому React — гімно (як і все інше), можете дати мені про це знати вподобайкою та донатом на детектори дронів для 115 бригади.
Подякував!
@babichdev
useLess
Спробую коротенько викласти основні думки моєї доповіді на React+ Fwdays'25. Відразу попереджаю, що до самих хуків доберемся далеко не відразу.
Отже, найперша теза — на мою особисту думку, архітектура React безбожно застаріла. І саме цим пояснюється постійне намагання вигадати чергові чудодійні покращення та магічні "оптимізації".
Теза друга — якщо ваш застосунок повільно працює, то у переважній більшості випадків React тут ні до чого, а проблема знаходиться по ту сторону монітора.
Думка третя — без розуміння недоліків інструменту неможливо ефективно ним користуватися. Якщо вашим першим рішенням буде втулити черговий useMemo — для мене це очевидна ознака, що ви взагалі не знаєте, як працює React, і які у нього є проблеми.
Теза четверта: кожен хук — точка доданої складності. React мусить в неочевидний для нас спосіб відслідковувати порядок їх виклику, робити додаткові перевірки, витрачати ресурси на перевірку залежностей і все це тримати в доволі кучерявій структурі даних з доволі кучерявою логікою відтворення.
Пʼята думка — завжди треба ставити під сумнів сферу відповідальности UI-компонентів. Чи мають тягнутися дані саме тут? Чи потрібне це обчислення саме тут? І так далі. Потрапивши під вплив магічного мислення "хуки оптимізують", дуже легко втратити здоровий ґлузд і перетворити маленький компонент на звалище.
І нарешті, остання теза — use Less. Менше хуків, більше логіки. Треба писати на JS, а не на хуках, тобто змінити напрямок мислення. Бо в першу чергу наша задача зробити так, аби воно працювало, а про всілякі плюшечки й рюшечки варто думати в кінці.
Звичайно ж, це не панацея. Що спрацює для одного випадку, зашкодить в іншому. В одному місці можна викинути useMemo, в іншому без нього ніяк.
Головний принцип, за яким завжди мають прийматися архітектурні рішення — IT DEPENDS. Тому кожен випадок треба розглядати окремо.
Але центральною думкою завжди має бути — "Нашо воно тут?". Якщо ви не можете виправдати useCallback чи useEffect — їм тут не місце.
Наостанок ще побіжно згадаю про React Compiler, що вийшов буквально кілька днів тому. Так от, друзі, радіти тому, що от нарешті можна викинути useMemo чи useCallback, ще зарано.
RC вводить примусове кешування. До того ж доволі прямолінійне. Це один з моментів, які найперше кинулися мені в очі. Однозначно вилізуть моменти, коли що він, що useMemo будуть заважати.
А найбільшою проблемою його, на мою особисту думку, є те, що RC вводить ще один додатковий, до того ж прихований, рівень складності.
Він буде покривати багато моментів, але із ним вам треба бути ще обережнішими, бо на додачу до жонглювання хуками доведеться ще й тримати в голові, чи увімкнутий тут Compiler, чи ні.
А найсумніше в усій цій історії те, що найбільша проблема так і не буде ніколи вирішена. Я говорю про сам React, усі зусилля з оптимізації якого зводяться до того, аби хоч якось обліпити подорожниками й пластирями його підхід з віртуальним DOM. Це було проривне рішення для 2013 року, але у 2025 році це вже просте латання дірок.
Якщо ж спробувати ще більше скоротити зміст доповіді, то вийде щось на кшталт:
Спочатку думайТЕ, а вже потім пишіТЕ.
Гарного усім початку робочого тижня! Якщо цікаво більше подискутувати про те, чому React — гімно (як і все інше), можете дати мені про це знати вподобайкою та донатом на детектори дронів для 115 бригади.
Подякував!
@babichdev
❤69👍14🔥11🤔1
Товариство, аби не пропустити найкращі срачі дискусії, долучайтесь до чату при каналі:
https://news.1rj.ru/str/babichdevchat
https://news.1rj.ru/str/babichdevchat
❤8
#нове_відео
Товариство, нове відео на каналі!
Вирішив розповісти трошки про події вказівника у бравзері. Що буде, якщо клацнуть, тицьнуть, скрольнуть і поводить — розповідаю, ще й показую на прикладах з кодом. А ще одним оком глянемо на Pointer Events. Приємного перегляду!
За підтримку й мотивацію зробити це відео дякую компанії Logitech.
https://www.youtube.com/watch?v=i0K3CMp8Ogc
Товариство, нове відео на каналі!
Вирішив розповісти трошки про події вказівника у бравзері. Що буде, якщо клацнуть, тицьнуть, скрольнуть і поводить — розповідаю, ще й показую на прикладах з кодом. А ще одним оком глянемо на Pointer Events. Приємного перегляду!
За підтримку й мотивацію зробити це відео дякую компанії Logitech.
https://www.youtube.com/watch?v=i0K3CMp8Ogc
YouTube
КЛАЦ, ТИЦЬ чи КЛІК — як веб бравзер розуміє, що ви робите мишкою.
🔥 Нова Logitech MX Master 4 уже в продажу! https://surli.cc/jiypts
Повний огляд подій миші та сучасних Pointer Events: від класичних click, mousedown, mouseup, mousemove, mouseover, wheel до універсальних pointerdown, pointermove і pointerup. Разом ми розберемось…
Повний огляд подій миші та сучасних Pointer Events: від класичних click, mousedown, mouseup, mousemove, mouseover, wheel до універсальних pointerdown, pointermove і pointerup. Разом ми розберемось…
❤39🔥14👍2
#js_in_action
Pointer Events
В останньому відео про події миші я побіжно розглянув і Pointer Events, які стали логічним продовженням розвитку Mouse Events. Сьогодні ж хочу подивитися до них дещо детальніше (але не дуже).
Тривалий час, аби підтримувати пристрої з дотиком, нам доводилось користуватися одночасно двома різними інтерфейсами: Mouse Events та Touch Events. Це привносило додаткову складність та могло призводити до прикрих багів та халеп, найпростішою з яких було просто забути продублювати логіку.
І ось у 2013 році Microsoft, на диво для всіх, зробила щось неочікуване: створила Pointer Events — єдину модель взаємодій для всіх типів вказівників. Згодом її стандартизували у W3C, а нині її підтримують усі сучасні браузери, включно з Safari.
Що таке Pointer Events
Pointer Events — це уніфікована модель DOM-подій, у якій поняття "вказівник" (pointer) охоплює мишу, дотик та стилус. Замість трьох різних наборів подій ми маємо одну логічну систему:
Події
У кожної взаємодії є власний
Один код — усі пристрої
Основна перевага Pointer Events — універсальність. Можна реалізувати drag’n’drop, малювання або будь-який інший інтерактив без окремих костилів для миші та дотиків.
Якщо користувач натискає пальцем, викликається
Для мультитачу кожен дотик має свій
Крім того, Pointer Events підтримують так званий pointer capture — механізм, який дозволяє "прив’язати" вказівник до елемента навіть після того, як курсор або палець вийде за його межі.
Тонке налаштування
Бравзери, що підтримують Pointer Events, усе ще генерують події миші (
Тобто при торканні кнопки може спрацювати і
Розв’язання просте: якщо викликати
Також системну взаємодію на кшталт zoom та panning через JS взагалі неможливо перехопити, лише за допомогою CSS:
Mouse vs Pointer — що вибрати?
Якщо ваш застосунок орієнтований лише на десктоп — старі події миші цілком ок. Вони простіші, і багато бібліотек досі працюють саме з ними.
Якщо ж ваш продукт має мобільну авдиторію, або ви працюєте з Canvas, жестами чи стилусом — Pointer Events однозначно кращі.
Проте, якщо у вас є специфічні кейси (наприклад, HTML5 Drag’n’Drop), де Pointer Events ще не інтегровані — можна тимчасово поєднати обидві моделі.
Щодо drag'n'drop — щоб не заглиблюватись, гляньте в спеку, вони побудовані повністю на MouseEvents,
Підсумок
Не варто сприймати Pointer Events як просто "ще один API". Це логічна еволюція, що прибирає штучний поділ між пристроями й робить взаємодію у вебі дійсно універсальною.
Колись ми писали купу різних обробників для однієї кнопки, а тепер достатньо одного —
Як на мене, PointerEvents є одним з тих прикладів, коли розвиток специфікації не намагається вигадати щось кардинально нове, а поступово й логічно надбудовує нові можливості, залишаючи при цьому старі досі актуальними.
Що почитати:
📖 W3C Pointer Events Level 3
📖 MDN: Pointer Events
📖 Chrome Developers Blog: "Pointing the way forward"
@babichdev
Pointer Events
В останньому відео про події миші я побіжно розглянув і Pointer Events, які стали логічним продовженням розвитку Mouse Events. Сьогодні ж хочу подивитися до них дещо детальніше (але не дуже).
Тривалий час, аби підтримувати пристрої з дотиком, нам доводилось користуватися одночасно двома різними інтерфейсами: Mouse Events та Touch Events. Це привносило додаткову складність та могло призводити до прикрих багів та халеп, найпростішою з яких було просто забути продублювати логіку.
І ось у 2013 році Microsoft, на диво для всіх, зробила щось неочікуване: створила Pointer Events — єдину модель взаємодій для всіх типів вказівників. Згодом її стандартизували у W3C, а нині її підтримують усі сучасні браузери, включно з Safari.
Що таке Pointer Events
Pointer Events — це уніфікована модель DOM-подій, у якій поняття "вказівник" (pointer) охоплює мишу, дотик та стилус. Замість трьох різних наборів подій ми маємо одну логічну систему:
element.addEventListener('pointerdown', e => {
console.log(e.pointerType, e.pressure);
});Події
pointerdown, pointermove, pointerup, pointerenter, pointerleave працюють однаково для всіх пристроїв.У кожної взаємодії є власний
pointerId (щоб відстежувати кілька дотиків), pointerType ("mouse" | "touch" | "pen"), pressure (сила натиску), а також координати, кнопки, модифікатори — поєднуючи класичні MouseEvent та специфічні для дотиків властивості.click, до речі, лишили як універсальну подію.Один код — усі пристрої
Основна перевага Pointer Events — універсальність. Можна реалізувати drag’n’drop, малювання або будь-який інший інтерактив без окремих костилів для миші та дотиків.
Якщо користувач натискає пальцем, викликається
pointerdown; якщо мишею — теж pointerdown.Для мультитачу кожен дотик має свій
pointerId, що дозволяє легко опрацьовувати складні жести чи визначати кількість активних точок.Крім того, Pointer Events підтримують так званий pointer capture — механізм, який дозволяє "прив’язати" вказівник до елемента навіть після того, як курсор або палець вийде за його межі.
element.setPointerCapture(e.pointerId);
Тонке налаштування
Бравзери, що підтримують Pointer Events, усе ще генерують події миші (
mousedown, mouseup, click) для сумісності.Тобто при торканні кнопки може спрацювати і
pointerdown, і mousedown. Якщо ви вже перейшли на нову модель, це може призвести до непотрібного дублювання.Розв’язання просте: якщо викликати
event.preventDefault() на pointerdown, браузер не згенерує певні сумісні мишачі події (принаймні для touch і pen). Але це стосується лише "контактних" подій на кшталт mousedown. Події штибу mousemove чи mouseenter в такий спосіб, на жаль, не блокуються.Також системну взаємодію на кшталт zoom та panning через JS взагалі неможливо перехопити, лише за допомогою CSS:
canvas {
touch-action: none; /* вимикає зум і прокрутку */
}Mouse vs Pointer — що вибрати?
Якщо ваш застосунок орієнтований лише на десктоп — старі події миші цілком ок. Вони простіші, і багато бібліотек досі працюють саме з ними.
Якщо ж ваш продукт має мобільну авдиторію, або ви працюєте з Canvas, жестами чи стилусом — Pointer Events однозначно кращі.
Проте, якщо у вас є специфічні кейси (наприклад, HTML5 Drag’n’Drop), де Pointer Events ще не інтегровані — можна тимчасово поєднати обидві моделі.
Щодо drag'n'drop — щоб не заглиблюватись, гляньте в спеку, вони побудовані повністю на MouseEvents,
dragstart стартує після звʼязки mousedown + mousemove.Підсумок
Не варто сприймати Pointer Events як просто "ще один API". Це логічна еволюція, що прибирає штучний поділ між пристроями й робить взаємодію у вебі дійсно універсальною.
Колись ми писали купу різних обробників для однієї кнопки, а тепер достатньо одного —
pointerdown.Як на мене, PointerEvents є одним з тих прикладів, коли розвиток специфікації не намагається вигадати щось кардинально нове, а поступово й логічно надбудовує нові можливості, залишаючи при цьому старі досі актуальними.
Що почитати:
📖 W3C Pointer Events Level 3
📖 MDN: Pointer Events
📖 Chrome Developers Blog: "Pointing the way forward"
@babichdev
❤55👍10🔥2
#коштозбір
Коротенький апдейт по нашому збору на детектори дронів для 115 бригади.
Ми встали в чергу на виготовлення, тому маємо трошки часу на те, щоб дозбирати кошти. Але, поки минав час, загальна вартість дещо підросла.
В общім, зараз саме час закинути 20 гривень на збір, а взагалі було б файно його закрити, бо в черзі вже інші запити від військових.
🔗Посилання на банку
https://send.monobank.ua/jar/AeXQ6YRf2X
💳Номер картки банки
5375411202918178
Дякую вам за кожен донат!
Коротенький апдейт по нашому збору на детектори дронів для 115 бригади.
Ми встали в чергу на виготовлення, тому маємо трошки часу на те, щоб дозбирати кошти. Але, поки минав час, загальна вартість дещо підросла.
В общім, зараз саме час закинути 20 гривень на збір, а взагалі було б файно його закрити, бо в черзі вже інші запити від військових.
🔗Посилання на банку
https://send.monobank.ua/jar/AeXQ6YRf2X
💳Номер картки банки
5375411202918178
Дякую вам за кожен донат!
❤14
Дивовижний світ веброзробки pinned «#коштозбір Коротенький апдейт по нашому збору на детектори дронів для 115 бригади. Ми встали в чергу на виготовлення, тому маємо трошки часу на те, щоб дозбирати кошти. Але, поки минав час, загальна вартість дещо підросла. В общім, зараз саме час закинути…»
#dom_api
Не буду стверджувати, що обхід DOM-дерева є повсякденною рутиною, але іноді така потреба постає, і тоді перед нами постає вибір: або ми це робимо рекурсивно і вручну, або нормально. Питання лише в тому, що про нормальний спосіб мало хто знає. От я знаю про нього вже кілька років, а на практиці довелося використати буквально днями.
Мова йтиме про TreeWalker. Як я вже казав, про його існування я знав давно, але прикладних задач для нього не мав. Аж тут сталося цікаве співпадіння: по-перше, Дмитро Тарасенко розповідав про свою маленьку бібліотечку для скрапінгу на React+ Fwdays'25, чим нагадав мені про існування TreeWalker взагалі, і, по-друге, днями я брав участь в досить цікавому лайвкодингу, де мені довелося в прямому етері, так би мовити, вперше з цим API попрацювати. Тож в двох словах розповім про нього.
Якщо коротко, то TreeWalker дозволяє послідовно обходити дерево вузлів DOM. Але є кілька дуже важливих нюансів. Перше, можна фільтрувати тип вузлів за власними правилами. Друге — він не обмежує нас в напрямку руху обходу, на відміну від рекурсії.
Так-так, він завжди памʼятає поточну ноду і дозволяє рухатися як вверх-вниз, так і по сусідах, а не лише вперед і вниз.
Це робить його дуже гнучким інструментом для швидкого обходу дерева, бо з ним можна не лише мандрувати в будь-якому напрямку, а зупинити обхід у будь-який момент та потім, згодом, відновити його з того ж місця.
Виглядає ініціалізація приблизно так:
і потім перебираємо як нам до вподоби:
TreeWalker не є альтернативою NodeIterator, а радше його "прокачаною" версією. NodeIterator також послідовно рухається деревом, але строго вперед або назад, більше нагадуючи ручний рекурсивний підхід, але з можливістю "перемотки".
З вас вподобайка і поширення, навіть якщо досі ні чорта не зрозуміло.
Найчастіше TreeWalker використовується тоді, коли потрібний саме обхід дерева, а не просто
Звичайно ж, без підводних каменів нікуди. По-перше, TreeWalker не бачить Shadow DOM. Ну, на те він і Shadow, звичайно.
По-друге, фільтр
І, по-третє, TreeWalker працює з живим DOM, тому, певно, варто уникати операцій з деревом під час обходу, інакше він може несподівано затягнутись.
TreeWalker — це маленький, але дуже потужний API. Він дозволяє пройтись DOM не "згори донизу", а саме так, як тобі зручно, дозволяючи самотужки задавати правила, перестрибувати від сусідів до сусідів, від батьківських вузлів до дочірніх і усе це — з кнопками "play", "pause", "rewind" і "forward" прямо з коробки. Така собі міжпросторова рекурсія з подорожами в часі (так, я полюбляю безглузді метафори).
Я навіть не буду питати, чи ви вже використовували його в проді, а якщо використовували — отримайте від мене щиру заздрість, що працюєте з такими цікавими задачами )
Що почитати:
📖 MDN: TreeWalker
📖 MDN: NodeIterator
Що почитати душнілам:
📖 W3C: Document Object Traversal
📖 WHATWG: TreeWalker
P.S. Товариство, детектори дронів самі себе не куплять, запрошую закинути пару гривень на збір.
Не буду стверджувати, що обхід DOM-дерева є повсякденною рутиною, але іноді така потреба постає, і тоді перед нами постає вибір: або ми це робимо рекурсивно і вручну, або нормально. Питання лише в тому, що про нормальний спосіб мало хто знає. От я знаю про нього вже кілька років, а на практиці довелося використати буквально днями.
Мова йтиме про TreeWalker. Як я вже казав, про його існування я знав давно, але прикладних задач для нього не мав. Аж тут сталося цікаве співпадіння: по-перше, Дмитро Тарасенко розповідав про свою маленьку бібліотечку для скрапінгу на React+ Fwdays'25, чим нагадав мені про існування TreeWalker взагалі, і, по-друге, днями я брав участь в досить цікавому лайвкодингу, де мені довелося в прямому етері, так би мовити, вперше з цим API попрацювати. Тож в двох словах розповім про нього.
Якщо коротко, то TreeWalker дозволяє послідовно обходити дерево вузлів DOM. Але є кілька дуже важливих нюансів. Перше, можна фільтрувати тип вузлів за власними правилами. Друге — він не обмежує нас в напрямку руху обходу, на відміну від рекурсії.
Так-так, він завжди памʼятає поточну ноду і дозволяє рухатися як вверх-вниз, так і по сусідах, а не лише вперед і вниз.
Це робить його дуже гнучким інструментом для швидкого обходу дерева, бо з ним можна не лише мандрувати в будь-якому напрямку, а зупинити обхід у будь-який момент та потім, згодом, відновити його з того ж місця.
Виглядає ініціалізація приблизно так:
const walker = document.createTreeWalker(
// корінь обходу
document.body,
// тип вузлів, які враховуємо
NodeFilter.SHOW_ELEMENT,
// кастомний фільтр
{
acceptNode(node) {
return node.tagName === 'P'
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_SKIP;
}
}
);
і потім перебираємо як нам до вподоби:
let node = walker.currentNode;
while (node) {
console.log(node.tagName);
node = walker.nextNode();
}
TreeWalker не є альтернативою NodeIterator, а радше його "прокачаною" версією. NodeIterator також послідовно рухається деревом, але строго вперед або назад, більше нагадуючи ручний рекурсивний підхід, але з можливістю "перемотки".
Найчастіше TreeWalker використовується тоді, коли потрібний саме обхід дерева, а не просто
querySelectorAll. Наприклад, коли нам потрібно знайти фрагменти дерева, що відповідає певній структурі, чи елемент за певними правилами, які не можна описати селектором. І так, на відміну від querySelector*, він дозволяє обходити саме вузли, не лише елементи.Звичайно ж, без підводних каменів нікуди. По-перше, TreeWalker не бачить Shadow DOM. Ну, на те він і Shadow, звичайно.
По-друге, фільтр
acceptNode викликається для кожного вузла, тому при великому DOM варто уникати зайвих перевірок.І, по-третє, TreeWalker працює з живим DOM, тому, певно, варто уникати операцій з деревом під час обходу, інакше він може несподівано затягнутись.
TreeWalker — це маленький, але дуже потужний API. Він дозволяє пройтись DOM не "згори донизу", а саме так, як тобі зручно, дозволяючи самотужки задавати правила, перестрибувати від сусідів до сусідів, від батьківських вузлів до дочірніх і усе це — з кнопками "play", "pause", "rewind" і "forward" прямо з коробки. Така собі міжпросторова рекурсія з подорожами в часі (так, я полюбляю безглузді метафори).
Я навіть не буду питати, чи ви вже використовували його в проді, а якщо використовували — отримайте від мене щиру заздрість, що працюєте з такими цікавими задачами )
Що почитати:
📖 MDN: TreeWalker
📖 MDN: NodeIterator
Що почитати душнілам:
📖 W3C: Document Object Traversal
📖 WHATWG: TreeWalker
P.S. Товариство, детектори дронів самі себе не куплять, запрошую закинути пару гривень на збір.
🔥66❤24👍12🤔1
Щойно записав нове відео, що вийде на Геловін. Про що? Не буду відкривати усі таємниці, але вам від нього однозначно стане моторошно і ви точно почнете остерігатися слова "рефакторинг"… Бу!
Поки ж я його монтуватиму, а ви чекатимете на нього із нетерпінням, хочу нагадати, що збір на детектори дронів для 115 бригади ще досі не завершено, тож саме зараз чудова нагода долучитися до нього та закинути кілька гривень.
Дякую за кожен ваш внесок, товариство!
🔗Посилання на банку
https://send.monobank.ua/jar/AeXQ6YRf2X
💳Номер картки банки
5375411202918178
Поки ж я його монтуватиму, а ви чекатимете на нього із нетерпінням, хочу нагадати, що збір на детектори дронів для 115 бригади ще досі не завершено, тож саме зараз чудова нагода долучитися до нього та закинути кілька гривень.
Дякую за кожен ваш внесок, товариство!
🔗Посилання на банку
https://send.monobank.ua/jar/AeXQ6YRf2X
💳Номер картки банки
5375411202918178
send.monobank.ua
Безпечний переказ коштів
Надсилайте безкоштовно та безпечно кошти
❤18🔥3
Запис нової публічної онлайн співбесіди відбудеться цієї суботи!
Так, тепер спочатку ми будем записувати співбесіди, а вже потім я викладатиму на ютуб. Причин тому декілька, більшість із них технічні, основні зміни ж такі:
Максимально незручний для усіх (окрім мене) час та день запису. Це значить, що і я, і учасники, і таємні експерти зможуть бути дещо гнучкішими з графіком;
Зможемо збирати донати для ЗСУ. А, значить, розігрувати дуже класні і ексклюзивні подарунки від партнерів серед тих, хто присутній під час запису.
"Питання від партнера" лишається. Не переживайте, виграти подарунок за відповідь на питання так само буде можна, але просто не такий крутий і ексклюзивний, як під час запису.
Випуски на ютубі будуть коротші і в набагато кращій якості, аніж збережені стрими. Це те, що бентежило мене дуже тривалий час, особливо у випадках, коли виникали перебої зі світлом чи інтернетом, зокрема у мене.
Ну а поки запрошую вас відмітити в календарі дату й час запису наступної співбесіди:
📆 1 листопада, 13:00
🔗 ПОСИЛАННЯ НА РЕЄСТРАЦІЮ
Детальніше про співбесіду розповім аж у пʼятницю, а доти потримаю інтригу.
@babichdev
Так, тепер спочатку ми будем записувати співбесіди, а вже потім я викладатиму на ютуб. Причин тому декілька, більшість із них технічні, основні зміни ж такі:
Максимально незручний для усіх (окрім мене) час та день запису. Це значить, що і я, і учасники, і таємні експерти зможуть бути дещо гнучкішими з графіком;
Зможемо збирати донати для ЗСУ. А, значить, розігрувати дуже класні і ексклюзивні подарунки від партнерів серед тих, хто присутній під час запису.
"Питання від партнера" лишається. Не переживайте, виграти подарунок за відповідь на питання так само буде можна, але просто не такий крутий і ексклюзивний, як під час запису.
Випуски на ютубі будуть коротші і в набагато кращій якості, аніж збережені стрими. Це те, що бентежило мене дуже тривалий час, особливо у випадках, коли виникали перебої зі світлом чи інтернетом, зокрема у мене.
Ну а поки запрошую вас відмітити в календарі дату й час запису наступної співбесіди:
Детальніше про співбесіду розповім аж у пʼятницю, а доти потримаю інтригу.
@babichdev
Please open Telegram to view this post
VIEW IN TELEGRAM
❤25🔥6
Завтра буде трошки моторошно на ютубі. Бо підготував для вас страшні, кринжові і страшно кринжові історії про веброзробку.
А от щоб мені не було страшно прикро, хотілося б, щоб збір на детектори дронів для 115 бригади на Покровський напрямок хоча б трошки заворушивсь.
Наразі зібрано 26 062 гривні з необхідних 51 000. Буду вдячний за кожну гривню!
🔗Посилання на банку
https://send.monobank.ua/jar/AeXQ6YRf2X
💳Номер картки банки
5375411202918178
P.S. До речі, всі ж тут підписані на youtube.com/@babichweb ? Правда? ПРАВДА?!
А от щоб мені не було страшно прикро, хотілося б, щоб збір на детектори дронів для 115 бригади на Покровський напрямок хоча б трошки заворушивсь.
Наразі зібрано 26 062 гривні з необхідних 51 000. Буду вдячний за кожну гривню!
🔗Посилання на банку
https://send.monobank.ua/jar/AeXQ6YRf2X
💳Номер картки банки
5375411202918178
P.S. До речі, всі ж тут підписані на youtube.com/@babichweb ? Правда? ПРАВДА?!
❤28🔥6
Вітаю, товариство!
Чи готові ви лякатися, як ніколи в житті? Чи здатні ви постати перед надприродним жахом? Чи будете ви спроможні писати код і далі, знаючи, які моторошні наслідки він може спричинити?
Сьогодні ваша кров холонутиме в жилах, адже ви почуєте історії про те, як рефакторинг може позбавити життя, як одне питання на співбесіді може вартувати вам усього, і як ваш власний код може вами оволодіти!
Готові? Тоді не гаймо часу, моторошні історії про веброзробку чекають на вас!
https://youtu.be/XUwYZw48CXY
Чи готові ви лякатися, як ніколи в житті? Чи здатні ви постати перед надприродним жахом? Чи будете ви спроможні писати код і далі, знаючи, які моторошні наслідки він може спричинити?
Сьогодні ваша кров холонутиме в жилах, адже ви почуєте історії про те, як рефакторинг може позбавити життя, як одне питання на співбесіді може вартувати вам усього, і як ваш власний код може вами оволодіти!
Готові? Тоді не гаймо часу, моторошні історії про веброзробку чекають на вас!
https://youtu.be/XUwYZw48CXY
YouTube
Моторошні історії про веброзробку (Геловінський спешл)
Чи готові ви лякатися, як ніколи в житті? Чи здатні ви постати перед надприродним жахом? Чи будете ви спроможні писати код і далі, знаючи, які моторошні наслідки він може спричинити?
Сьогодні ваша кров холонутиме в жилах, адже ви почуєте історії про те,…
Сьогодні ваша кров холонутиме в жилах, адже ви почуєте історії про те,…
🔥32👍3😁3
Senior Frontend. Запис ОНЛАЙН з живою авдиторією завтра. Не забудьте.
Проясню щодо реєстрації: вона треба, щоб ви собі додали подію до календаря і не забули про неї. Більш ніякої мети у неї нема. Я завтра перед записом скину сюди пряме посилання на ОНЛАЙН студію, бо вхід відкритий.
І я прямо дуже раджу прийти саме на запис. По-перше, ви так само зможете душнити в чаті. По-друге, разом з партнером ексклюзивно серед глядачів наживо ми розіграємо крутезний подарунок — рюкзак просто бомба. І розіграємо його за донати на ЗСУ. Раптом ви забули, у нас з вами збір іде.
Співбесіда буде дуже цікава. Бо я роблю її за мотивами реальної вакансії, це раз, і два — ми з учасницею говоритимемо про різні етапи та аспекти розробки єдиної фічі, тож буде дуже сфокусовано.
Тому я прямо дуже раджу саме зареєструватися і взяти участь в завтрашньому записі як глядачі. Ну і ще однією, дуже важливою причиною це зробити є те, що я дуже засмучений через кількість реєстрацій.
📆 РЕЄСТРАЦІЯ НА ЗАПИС НОВОЇ СПІВБЕСІДИ
***
Партнером цього випуску є Universe Group — компанія, що створює технологічні бізнеси й перетворює ідеї на глобальні продукти. До групи входять Guru Apps, FORMA та Wisey — команди, чиї рішення об’єднують понад 200 мільйонів користувачів у 186 країнах світу, спрощуючи щоденні процеси та відкриваючи нові можливості для розвитку. Окрім цього, Universe Group розвиває власний R&D-центр, який досліджує нові ідеї, впроваджує інноваційні рішення та запускає бізнеси, здатні масштабуватися на глобальному технологічному ринку.
Вакансії Universe Group
Проясню щодо реєстрації: вона треба, щоб ви собі додали подію до календаря і не забули про неї. Більш ніякої мети у неї нема. Я завтра перед записом скину сюди пряме посилання на ОНЛАЙН студію, бо вхід відкритий.
І я прямо дуже раджу прийти саме на запис. По-перше, ви так само зможете душнити в чаті. По-друге, разом з партнером ексклюзивно серед глядачів наживо ми розіграємо крутезний подарунок — рюкзак просто бомба. І розіграємо його за донати на ЗСУ. Раптом ви забули, у нас з вами збір іде.
Співбесіда буде дуже цікава. Бо я роблю її за мотивами реальної вакансії, це раз, і два — ми з учасницею говоритимемо про різні етапи та аспекти розробки єдиної фічі, тож буде дуже сфокусовано.
Тому я прямо дуже раджу саме зареєструватися і взяти участь в завтрашньому записі як глядачі. Ну і ще однією, дуже важливою причиною це зробити є те, що я дуже засмучений через кількість реєстрацій.
📆 РЕЄСТРАЦІЯ НА ЗАПИС НОВОЇ СПІВБЕСІДИ
***
Партнером цього випуску є Universe Group — компанія, що створює технологічні бізнеси й перетворює ідеї на глобальні продукти. До групи входять Guru Apps, FORMA та Wisey — команди, чиї рішення об’єднують понад 200 мільйонів користувачів у 186 країнах світу, спрощуючи щоденні процеси та відкриваючи нові можливості для розвитку. Окрім цього, Universe Group розвиває власний R&D-центр, який досліджує нові ідеї, впроваджує інноваційні рішення та запускає бізнеси, здатні масштабуватися на глобальному технологічному ринку.
Вакансії Universe Group
🔥24❤6
Знаєте, як називається, коли тобі приходить пул-ріквест на 5000 рядочків, написаний без дотримання конвенцій?
«Review та стогну».
«Review та стогну».
😁142🤔2👍1
Веб не стоїть на місці, а це значить, що якісь частини стандарту неминуче замінюються іншими та поступово виходять із вжитку. Часто такий процес проходить через стадію так званої депрекації, коли користуватися певним функціоналом не забороняється, але вже й не заохочується.
Важливо розрізняти, коли щось deprecated, а коли — obsolete чи removed. Наприклад, такі теги, як
А от, до прикладу,
Коротко життєвий шлях HTML-тегу виглядає приблизно так: Proposed → Living Standard → Deprecated → Obsolete → Removed. Їхню ж долю вирішують WHATWG разом з W3C.
Приблизно причини депрекації можна розділити на такі умовні групи:
Представлення проти семантики.
HTML подолав шлях від того, як сторінка виглядає, до того, що означають її складові. Тому певні теги набувають статусу deprecated через те, що їхня роль тепер виконується CSS. Прикладом можна навести ті ж
Безпека та підтримка
Деякі теги були покликані розширити функціонал сторінки та надати можливість декларативно його описувати. Але те, що на папері виглядало як чудове рішення, іноді на практиці ставало справжнім пеклом для підтримки. А часом — і суттєвою діркою в безпеці, як той самий
Кращі альтернативи
Іноді призначення старого тегу ставало частиною ширшої специфікації нового, як у випадку з
Чому нам важливо дотримуватися рекомендацій специфікації? Я знаю, бравзери відображають наші сторінки незалежно від того, чи дотримані найостанніші стандарти, а чи у вас там вилито три баняки div-супу. Але не варто забувати про асистивні технології, те саме SEO, та взагалі передбачуваність розмітки. Якщо ви раптом вирішите використати
Так само це може перетворитися на "тихий" технічний борг, бо хто ж звертатиме увагу на якийсь там HTML? Але це може потягнути за собою такі самі "тихі" баги: відображення елементів може відрізнятися, ба більше, бравзери можуть включити quirks-mode, який може зламати ще більше.
Очевидно, що дотримання рекомендацій специфікації дозволить вам зробити вашу розмітку більш стійкою до викликів майбутнього і при цьому не оглядатися постійно назад на помилки минулого.
Веб знаходиться в постійному русі і безперервно розвивається, HTML у тому числі, не зважаючи на те, що багато хто з нас ігнорує його існування. Тому важливо звертати увагу на цей розвиток, аби не опинитися одного дня на узбіччі у валідаційній канаві.
До речі, зʼявилися думка присвятити цей тиждень HTML та зробити короткий огляд його основних версій, а також розібрати, чому світ ніколи не побачить HTML 6. Дайте знати в коментарях, чи хотіли б ви почитати про це якомога скоріше.
І не забувайте про вподобайки. І про донати на детектори дронів для 115 бригади на Покровський напрямок.
Всім цьом у лобіка і гарного початку тижня.
@babichdev
Важливо розрізняти, коли щось deprecated, а коли — obsolete чи removed. Наприклад, такі теги, як
<font>, <center> чи <menuitem> — deprecated, вони можуть частково підтримуватись якимись бравзерами для зворотньої сумісності. Вжиток таких тегів втратив сенс через появу CSS, але їхнє використання в більшості своїй не сильно шкодить.А от, до прикладу,
<keygen> чи <applet> видалено зі специфікації повністю, і бравзери їхній функціонал не підтримують, навіть для зворотньої сумісності, бо ця підтримка ставить під сумнів кібербезпечність сторінки.Коротко життєвий шлях HTML-тегу виглядає приблизно так: Proposed → Living Standard → Deprecated → Obsolete → Removed. Їхню ж долю вирішують WHATWG разом з W3C.
Приблизно причини депрекації можна розділити на такі умовні групи:
Представлення проти семантики.
HTML подолав шлях від того, як сторінка виглядає, до того, що означають її складові. Тому певні теги набувають статусу deprecated через те, що їхня роль тепер виконується CSS. Прикладом можна навести ті ж
<font>, <center>, <marquee> та інші.Безпека та підтримка
Деякі теги були покликані розширити функціонал сторінки та надати можливість декларативно його описувати. Але те, що на папері виглядало як чудове рішення, іноді на практиці ставало справжнім пеклом для підтримки. А часом — і суттєвою діркою в безпеці, як той самий
<keygen>. Він був покликаний створювати public-private пару ключів у бравзері та надсилати публічний ключ при сабміті форми. Що ж могло піти не так? Питань, насправді, на практиці, виникло багато: різні бравзери могли генерувати ключі різної надійності, за бажання зловмисний код міг спокійно вставити власний <keygen> у сторінку, непрозорий механізм, відсутність API для керування ключами та інші.Кращі альтернативи
Іноді призначення старого тегу ставало частиною ширшої специфікації нового, як у випадку з
acronym, який рекомендується заміняти на abbr.Чому нам важливо дотримуватися рекомендацій специфікації? Я знаю, бравзери відображають наші сторінки незалежно від того, чи дотримані найостанніші стандарти, а чи у вас там вилито три баняки div-супу. Але не варто забувати про асистивні технології, те саме SEO, та взагалі передбачуваність розмітки. Якщо ви раптом вирішите використати
<center> для розмітки якоїсь центральної секції, ніхто не може гарантувати, що усі бравзери викинули його зворотню підтримку, і якийсь із них раптом не почне центрувати текст.Так само це може перетворитися на "тихий" технічний борг, бо хто ж звертатиме увагу на якийсь там HTML? Але це може потягнути за собою такі самі "тихі" баги: відображення елементів може відрізнятися, ба більше, бравзери можуть включити quirks-mode, який може зламати ще більше.
Очевидно, що дотримання рекомендацій специфікації дозволить вам зробити вашу розмітку більш стійкою до викликів майбутнього і при цьому не оглядатися постійно назад на помилки минулого.
Веб знаходиться в постійному русі і безперервно розвивається, HTML у тому числі, не зважаючи на те, що багато хто з нас ігнорує його існування. Тому важливо звертати увагу на цей розвиток, аби не опинитися одного дня на узбіччі у валідаційній канаві.
До речі, зʼявилися думка присвятити цей тиждень HTML та зробити короткий огляд його основних версій, а також розібрати, чому світ ніколи не побачить HTML 6. Дайте знати в коментарях, чи хотіли б ви почитати про це якомога скоріше.
І не забувайте про вподобайки. І про донати на детектори дронів для 115 бригади на Покровський напрямок.
Всім цьом у лобіка і гарного початку тижня.
@babichdev
🔥52👍20❤5
Товариство, тут, виявляється, відкрили подачу заявок на Премію DOU 2026.
Номінації цього року такі:
— Найпотужніша ініціатива від ІТ-компанії, що наближає перемогу
— Найпотужніша ініціатива від ІТ-спеціалістів, що наближає перемогу
— Найперспективніший проєкт у Defense Tech галузі
— Найкраща ініціатива, яка сприяє розвитку ІТ-галузі
— Найкраща соціально орієнтована ІТ-ініціатива
— Вони — надихають
— Стартап з найбільшим потенціалом
Подати свій проєкт, кандидатуру чи подати когось можна тут:
https://forms.gle/Rsq6TvjG2yLA7JRj7
Я, як і минулого року, свою кандидатуру не подаватиму. Якщо товариство вважає, що я усе ще гідний нагороди, то товариство скаже своє слово )
Номінації цього року такі:
— Найпотужніша ініціатива від ІТ-компанії, що наближає перемогу
— Найпотужніша ініціатива від ІТ-спеціалістів, що наближає перемогу
— Найперспективніший проєкт у Defense Tech галузі
— Найкраща ініціатива, яка сприяє розвитку ІТ-галузі
— Найкраща соціально орієнтована ІТ-ініціатива
— Вони — надихають
— Стартап з найбільшим потенціалом
Подати свій проєкт, кандидатуру чи подати когось можна тут:
https://forms.gle/Rsq6TvjG2yLA7JRj7
Я, як і минулого року, свою кандидатуру не подаватиму. Якщо товариство вважає, що я усе ще гідний нагороди, то товариство скаже своє слово )
❤11🔥7
#css_in_action
Чи стикалися ви колись із тим, що задаєте елементу
Це така собі "область видимості", в межах якої застосовуються правила накладання елементів. Ми зазвичай це бачимо як "один елемент закриває інший", бо екран не передає нам глибину. Але насправді ця глибина існує, просто вона віртуальна.
Давайте розглянемо ось таку структуру для прикладу:
А тепер уявіть собі стос папірців. Цей стос буде представляти відображення усіх елементів з числами всередині (але не самі елементи, це важливо). Отой stacking order визначатиме порядок цих папірців у стосі. За замовчуванням він відповідатиме порядку й вкладеності цих елементів в DOM. Проте, якщо, до прикладу, листку з номером 8 призначити
Чому? Для цього треба зрозуміти, як саме визначається порядок всередині контексту. Так от, шари контексту впорядковуються наступним чином:
1. Фон і бордер елемента, що створює контекст;
2. Елементи з негативним z-index;
3. Блоки без позиціонування (static);
4. Елементи з z-index: auto;
5. Елементи з додатним z-index (у порядку значень).
А тепер нехай ми задамо елементу
Насправді, створити його набагато легше, ніж нам здається. Окрім усім відомого
Наприклад, елементи, що мають
На сторінці завжди існує щонайменше один такий контекст, утворений кореневим елементом. І, що очевидно, ці контексти можуть вкладатися один в один, як ті самі прозорі файлики з папірцями. Це завжди варто мати на увазі, бо навіть найбільший
Тому найпершою порадою буде не зловживати
В двох словах — слідкуйте за stacking context та памʼятайте, що загорнути купку елементів у файлик на ділі дуже просто, але — не завжди очевидно.
Що почитати:
📖 MDN: Stacking context
📖 MDN: Understanding z-index
📖 MDN: Top layer
Що почитати душнілам:
📖 W3C: z-index
📖 CSSWG: Containment Module Level 3
Як і завжди, з мене цікавий допис, а з вас вподобайка, поширення і донат на детектори дронів для 115 бригади на Покровський напрямок.
@babichdev
Чи стикалися ви колись із тим, що задаєте елементу
z-index: 9999, а він усе ніяк не хоче вигулькувати поверх іншого елементу? Якщо так, то вітаю — ви побачили, як на практиці працює stacking context.Це така собі "область видимості", в межах якої застосовуються правила накладання елементів. Ми зазвичай це бачимо як "один елемент закриває інший", бо екран не передає нам глибину. Але насправді ця глибина існує, просто вона віртуальна.
Давайте розглянемо ось таку структуру для прикладу:
<div>1</div>
<div id="stack-1">
<div>2</div>
<div>3</div>
<div>4</div>
<div id="stack-1-1">
<div>5</div>
<div>6</div>
</div>
</div>
<div id="stack-2">
<div>7</div>
<div>8</div>
<div id="stack-2-1">
<div>9</div>
<div>10</div>
</div>
</div>
А тепер уявіть собі стос папірців. Цей стос буде представляти відображення усіх елементів з числами всередині (але не самі елементи, це важливо). Отой stacking order визначатиме порядок цих папірців у стосі. За замовчуванням він відповідатиме порядку й вкладеності цих елементів в DOM. Проте, якщо, до прикладу, листку з номером 8 призначити
z-index: 1, він одразу переміститься наперед.Чому? Для цього треба зрозуміти, як саме визначається порядок всередині контексту. Так от, шари контексту впорядковуються наступним чином:
1. Фон і бордер елемента, що створює контекст;
2. Елементи з негативним z-index;
3. Блоки без позиціонування (static);
4. Елементи з z-index: auto;
5. Елементи з додатним z-index (у порядку значень).
А тепер нехай ми задамо елементу
#stack-2 position: relative. Ми побачимо, що восьмий папірець уже не опиняється з самого верху стосу. Чому? Бо ми перетворили #stack-2 на прозорий файлик, і тепер папірці в ньому можуть змінювати свій порядок лише всередині нього. Ми створили новий stacking context.Насправді, створити його набагато легше, ніж нам здається. Окрім усім відомого
position зі значенням, відмінним від static (і то з умовами), до утворення нового контексту може призвести використання різноманітних стилів, про деякі з них ви й не могли подумати, що вони здатні на подібне.Наприклад, елементи, що мають
z-index (не auto) та знаходяться всередині flex чи ґріду. Або з mask. Чи з container-type з певними значеннями (не всіма!). Найпідступніше, напевно, це opacity зі значенням менше 1. А повний перелік умов можна буде знайти за прикріпленим посиланням нижче.На сторінці завжди існує щонайменше один такий контекст, утворений кореневим елементом. І, що очевидно, ці контексти можуть вкладатися один в один, як ті самі прозорі файлики з папірцями. Це завжди варто мати на увазі, бо навіть найбільший
z-index не зможе вирватися за межі свого контексту.Тому найпершою порадою буде не зловживати
position: absolute та особливо z-index, і вживати інших заходів для керування розташуванням відображення. Якщо ми говоримо про модалки та тултипи, то краще за можливості використовувати той самий dialog для модалок та властивість popover для других. Якщо показувати ці елементи за допомогою API showModal, showPopover, то вони тоді рендеряться в так званому top-layer, і відпаде потреба вручну керувати їхнім розташуванням.В двох словах — слідкуйте за stacking context та памʼятайте, що загорнути купку елементів у файлик на ділі дуже просто, але — не завжди очевидно.
Що почитати:
📖 MDN: Stacking context
📖 MDN: Understanding z-index
📖 MDN: Top layer
Що почитати душнілам:
📖 W3C: z-index
📖 CSSWG: Containment Module Level 3
Як і завжди, з мене цікавий допис, а з вас вподобайка, поширення і донат на детектори дронів для 115 бригади на Покровський напрямок.
@babichdev
❤49🔥17