Задать вопрос
@Denisido

Кто сталкивался с нарушением как принудительная перерисовка при выполнении JavaScript сценария в DOM?

Есть таблица в стиле CSS grid со стилями. Которая имеет 12 колонок. Из них на экране только 11, а 12-я спрятана слева за пределами монитора в качестве дополнительного меню для строки (заявки). Всего 100vw (что видно сразу) плюс 100vw (меню) минус 1-я колонка (тип заявки). Т.е. всего, если говорит грубо, то 100% + 100% - 40px. Но экран показывает только 100%, а остальное умно спрятано с помощью overflow-x: hidden, так что ничего не вылезает.
По мнению автора, при десктопном разрешении должно эмулироваться что-то типа свайпа на мобильном, в тот момент когда пользователь тянет блок с типом заявки слева направо и, в случае закрытия, наоборот - справа налево.
При реализации возникла проблема в том, что появляется запись о нарушении:
[Violation] Forced reflow while executing JavaScript took ..ms

В динамике пользователь может добавлять сколько угодно строк (выбор и показ заявок). Чем больше строк, тем больше увеличивается время на принудительную перерисовку для DOM-элементов.


[Violation] 'mousemove' handler took 442ms
[Violation] Forced reflow while executing JavaScript took 439ms
[Violation] 'mousemove' handler took 1520ms


5e29ac4732a18046578338.png
5e29acb104635764252924.png

Пример:
CodePen

Помогите разобраться почему так происходит.
  • Вопрос задан
  • 810 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
lazalu68
@lazalu68
Salmon
Отвечая на вопрос "почему так происходит?": потому что у вас реализован достаточно сложный грид со сложными условиями, к элементам которого вы еще динамически применяете какие-то кастомные стили (конкретно речь о сдвиге), вынуждающие движок перерисовывать всё-всё-всё - как элементы после целевого, так и до. Решение - либо не юзать грид (не знаю насколько это адекватный выход), либо (что мне кажется более адекватным) реализовать сдвиг как-нибудь по-другому. Например сгруппировать ячейки в строки, и двигать уже эти строки, попутно не влияя на другие элементы; это полностью решит проблему тотальной перерисовки.

Еще можно попытаться оптимизировать уже имеющийся код, ибо в нем дофига лишнего, но по сути это проблемы не решит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы