Проблема:
Проблема называется «Переполнение макета» и возникает из-за того, что браузер пытался немедленно обновить/перерисовать после каждого рисунка Рафаэля.
Например, это может привести к сбою макета:
var a = document.getElementById('element-a');
var b = document.getElementById('element-b');
a.clientWidth = 100;
var aWidth = a.clientWidth;
b.clientWidth = 200;
var bWidth = b.clientWidth;
«В этом простом примере браузер дважды обновит весь макет. Это связано с тем, что после установки ширины первого элемента вы просите получить ширину элемента. При получении свойства css браузер знает, что ему нужны обновленные данные, поэтому он затем идет и обновляет все дерево DOM в памяти. Только после этого он переходит к следующей строке, которая вскоре вызовет другое обновление по тем же причинам».
Это можно просто исправить, изменив порядок кода, например:
var a = document.getElementById('element-a');
var b = document.getElementById('element-b');
a.clientWidth = 100;
b.clientWidth = 200;
var aWidth = a.clientWidth;
var bWidth = b.clientWidth;
«Теперь браузер будет обновлять оба свойства одно за другим без обновления дерева».
Источники:
https://blog.idrsolutions.com/2014/08/beware-javascript-layout-thrashing/
http://www.codeproject.com/Articles/758790/Debugging-and-solving-the-Forced-Synchronous-Layou
http://www.stubbornella.org/content/2009/03/27/reflows-repaints-css-performance-making-your-javascript-slow/
https://dev.opera.com/articles/efficient-javascript/?page=3#reflow
Душа:
Один из способов исправить это (действительно быстрый и грязный способ) — скрыть() элемент div, в который вы рисуете, а затем, когда вы закончите, показать() его. . У меня были удачные результаты с этим с Рафаэлем, и это было странно. Однако он работает быстрее...
«Когда стиль отображения элемента не установлен, его не нужно перерисовывать, даже если его содержимое изменено, поскольку он не отображается. Это можно использовать как преимущество. Если необходимо внести несколько изменений в элемент или его содержимое, и невозможно объединить эти изменения в одну перерисовку, для элемента можно установить значение display:none, можно внести изменения, после чего элемент может вернуться к своему обычному отображению».
Вот результаты:
![введите здесь описание изображения](https://i.stack.imgur.com/QVks4.jpg)
Этот способ работал для меня!
person
Katie
schedule
20.02.2015
lopaLayoutArray
, это могло бы помочь выяснить, где именно это это происходит - person konkked   schedule 20.02.2015