Layout trashing

Поделиться
HTML-код
  • Опубликовано: 6 май 2022
  • Дата выхода на Patreon: 2.04.2022
    Материалы из видео:
    * изначальный codesandbox: codesandbox.io/s/optimize-loo...
    * финальное решение: codesandbox.io/s/optimize-loo...
    * gist с layout trashing: gist.github.com/paulirish/5d5...
    Видео создано благодаря подписчикам проекта на нашем Patreon.
    Хотите получать контент на 3 месяца раньше остальных? Присоединяйтесь! / javascriptninja

Комментарии • 31

  • @hiddenlul556
    @hiddenlul556 2 года назад +26

    задачка для джунов? надеюсь ты зарофлил...

  • @jimshtepa5423
    @jimshtepa5423 2 года назад +6

    очень крутой материал и подача. спасибо!

  • @pdev5185
    @pdev5185 2 года назад +8

    Дякую, цікаве відео!
    Be aware, if you need to animate element size or position in the DOM, it's better to use transform instead css properties like (width, height, top, left etc.), it costs less and also improves performance.

  • @maksimmurza7796
    @maksimmurza7796 2 года назад +4

    В книге "Secrets of the js ninja" хорошо объяснен этот механизм. Глава так и называется - "Minimizing layout trashing".

  • @Ryold
    @Ryold 2 года назад +1

    Спасибо за видео, Илья!

  • @rammfall
    @rammfall 2 года назад +1

    Илья, спасибо, очень полезно

  • @lying6624
    @lying6624 2 года назад +9

    Интересная задача, но тут есть подвох в том, что в больших компаниях про DOM и тд в основном не спрашивают, а пичкают задачами с LeetCode, ибо по такой логике человек, который умеет писать и оценивать разные алгоритмы - сможет преодолеть всё. Не обессудь, но некоторым сеньором пришлось бы подумать перед задачей. Спасибо за задачу, делись еще!!

    • @JavaScriptNinja
      @JavaScriptNinja  2 года назад +8

      Это распространенное заблуждение. За пределами фаанга мало кто литкодит.
      Гитлаб не спрашивает литкод, нетлифай не спрашивает литкод, stackblitz и airbnb тоже. Это из тех что я знаю

    • @ahmedrapira7610
      @ahmedrapira7610 2 года назад +2

      да это ж душная задача с трудным для понимания говнокодом ) про paint и layout можно гораздо проще спросить

  • @aleksprimetv
    @aleksprimetv 2 года назад +3

    Работаю уже пару лет, но с requestAnimationFrame сталкивался только при осваивании canvas, и я думаю что у меня бы это заняло куда больше 20 мин, и не каждый сеньер столкнется с такой проблемой. Спасибо за материал!

    • @nafanya3733
      @nafanya3733 9 месяцев назад +1

      зато у автора каждый джун эту таску решает) 🤡

  • @kirsanov2008
    @kirsanov2008 Год назад +1

    Вот так кодишь 15 лет на JS, но всего не знаешь, не знал что DOM такой "ленивый", спасибо огромное! А что не так с CSS? сейчас у себя попробовал, все работает отлично (могу гист предоставить). И код у вас конечно написан "не очень", ненужные походы в дом, промежуточные массивы, но я так понял так задумано, для собеседования =)

  • @pavelk7493
    @pavelk7493 2 года назад +1

    Все таки это layout thrashing, а не trashing. А так спасибо за видео.

  • @lapetitemort1666
    @lapetitemort1666 2 года назад

    Интересная штука , тоже как - то столкнулся с этим м пошел читать
    а будет ли интересно еще лучше если width и height заменить на transform ?

    • @JavaScriptNinja
      @JavaScriptNinja  2 года назад

      Конечно, проблема вообще исчезнет, но будет другая (не в этом примере).... Но это совсем другая история... (с)

    • @pashakorenev7619
      @pashakorenev7619 2 года назад

      @@JavaScriptNinja речь идет не про баг в webkit, изза которого получается блюр-эффект(размытие)? сейчас точно не помню, как его воспроизвести. не знаю, возможно его уже пофиксили. было вроде както так: если у контейнера есть transform/translate и у дочернего элемента есть transform/translate, то дочерний элемент визуально получает размытие, например, текст может быть нечетким.
      правда, в этой задаче вроде бы вложенность ни к чему.
      Ты имел ввиду какой-то нюанс по производительности?

  • @stanislav5950
    @stanislav5950 2 года назад

    да, интересно. такое, наверняка, легче найдут и решат люди, кто уже использовал requestAnimationFrame напрямую. в этом случае уже как-то по-другому смотришь на анимации

  • @puhd4167
    @puhd4167 Год назад

    Я б такое в доме в принципе делать не стал) в пикси каком нето топчик либа)

  • @PetunenkoDV
    @PetunenkoDV 2 года назад

    Есть хорошая презентация по теме на канале Frontend Channel
    Называется "Как достичь производительного рендеринга в браузере / Глеб Михеев"
    Там он как раз рассказывает о том как это все работает

  • @HappyHippyHome
    @HappyHippyHome Год назад

    Такие вещи лучше в канвасе делать. А так да, чисто чтоб выяснить как интервьюер думает и знаком ли как работает браузер можно спросить

  • @EvilYou
    @EvilYou 10 месяцев назад +2

    Можно еще проще решить:
    function tick() {
    zone.querySelectorAll(".drop").forEach((drop) => { // Array.from не обязателен здесь
    const currentSize = parseInt(getComputedStyle(drop).width, 10);
    const newSize = currentSize + 1 + Math.random() * 6;
    queueMicrotask(() => {
    drop.style.width = `${newSize}px`;
    drop.style.height = `${newSize}px`;
    drop.style.opacity = (400 - newSize) / 400;

    if (newSize > 400) {
    drop.remove();
    }
    });
    });
    }

  • @user-ho2be2hb7r
    @user-ho2be2hb7r 2 года назад +1

    Я думал я миддл) но с этой задачей я вряд-ли бы справился с приемлемое время

  • @MrJloa
    @MrJloa 2 года назад +2

    просто надо было не использовать getComputedStyle.

    • @JavaScriptNinja
      @JavaScriptNinja  2 года назад

      Мне кажется суть видео вы не уловили :)

    • @unlike777
      @unlike777 2 года назад +1

      @@JavaScriptNinja мне вот кажется наоборот, что уловил.
      Каким образом разнесение на 2 цикла одного и того же кода способствует производительности?
      Очень похоже на баг в виртуальной машине js'a
      Т.е. layout trashing срабатывает, когда последовательно вызывается getComputedStyle + присвоение размеров дом элементу?
      а если в одном цикле сделать getComputedStyle , а в другом цикле присвоение, то уже не срабатывает?
      Это просто особенность js интерпретатора, и с точки зрения программирования это знание ничего не дает.
      Вполне возможно что в следующих версиях хромиума это вообще поправят.
      А вообще да, нужно просто все размеры изначально хранить в коде, а не дергать из элементов на странице.
      + в копилку ко всему добавляет момент, что в sandbox'e в итоге это оптимизация не проканала.

    • @JavaScriptNinja
      @JavaScriptNinja  2 года назад

      @@unlike777 это вообще не про интерпретатор и суть не в двух циклах, а в том что layout trashing глобальный и вызывая его внутри цикла мы много раз пересчитываем разметку

    • @unlike777
      @unlike777 2 года назад

      @@JavaScriptNinja т.е. мы можем сколько угодно раз вызывать getComputedStyle без пересчета разметки,
      но как только между вызовами появляется код, который изменяем дом элемент, то запускается пересчет разметки?

    • @JavaScriptNinja
      @JavaScriptNinja  2 года назад +3

      @@unlike777 да

  • @sergeys4732
    @sergeys4732 2 года назад +1

    Как не ковырял на маке этот код, перфоманс не снизился ни на долю((( кадры стабильные выдает, что за дичь

    • @19n1ght
      @19n1ght Год назад

      Аналогично. Может быть дело в М1? Поставил low end mobile, стабильно показывает 115 FPS...

  • @altmindo
    @altmindo 2 года назад

    или фикс проще - убрать getComputedStyle().width и читать свойство напрямую .style.width.trim("px");