Я создаю панель инструментов, которая должна помещаться на экране в два столбца. Элементы на экране будут динамическими и разных размеров, размеры каждого будут меняться со временем. Поэтому я выбрал макет div с несколькими столбцами, это позволит красиво заполнить столбцы по вертикали и равномерно распределить содержимое по двум столбцам.
Для таблиц с большим количеством строк идея состоит в том, чтобы поместить эти таблицы в прокручиваемый контейнер фиксированной высоты. Таким образом, все элементы по-прежнему будут помещаться на экране, оставляя видимыми только верхние X строк каждой таблицы.
Я поместил эти контейнерные таблицы в элементы li внутри многоколоночного блока div. Затем я использую javascript для вычисления высоты первых X строк, которые должны быть видны без прокрутки.
Все идет нормально.
К чему все это сводится:
CSS:
div.multiColumn {
-moz-column-count: 2;
-webkit-column-count: 2;
column-count: 2;
}
ul.noBullets {
list-style: none;
padding: 0;
margin: 0 0.5rem 0 0.5rem;
display: -webkit-box;
display: box;
}
ul.noBullets > li {
display: inline-block;
width: 100%;
}
.scrollingTableDiv {
overflow-y: auto;
}
HTML:
<div class="multiColumn">
<ul class="noBullets" id="ulMultiColumn">
<li>
<div class="scrollingTableDiv"> <!-- this is the container -->
<table class="scrollingTable" id="list1">
....
</table>
</li>
</ul>
</div>
JavaScript:
$(".scrollingTable").each(function() {
var table = this;
maxRows = 10;
var wrapper = table.parentNode;
var rowsInTable = table.rows.length;
var height = 0;
if (rowsInTable > maxRows) {
for (var i = 0; i < maxRows; i++) {
height += table.rows[i].clientHeight;
}
wrapper.style.height = height + "px";
}
});
Рабочий пример в JS Fiddle:
Этот jsfiddle будет нормально работать в IE и Firefox (показывая два столбца, как и должно быть).
Но в Chrome отображается только 1 большой столбец с большим количеством пробелов под ним.
.
В чем я думаю проблема:
Кажется, что Chrome не учитывает новую высоту контейнера при расчете того, как элементы li должны быть распределены по столбцам. Это потому, что высота контейнера была обновлена функцией javascript. Это показано пробелами под элементами первого столбца.
Интересно, что если я удалю класс multiColumn из div с id="divMultiColumn", а затем вручную повторно применю класс с помощью функции "проверить элемент", тогда Chrome будет работать так, как я ожидал, и распределит содержимое по двум столбцам. , как это делают IE и Firefox. Если я использую JS для имитации удаления и повторного применения класса multiColumn, то это не сработает (см. закомментированные биты javascript в скрипте).
Кроме того, если я устанавливаю свойство высоты контейнера таблицы с помощью статического CSS, хром работает нормально.
Я не могу понять, почему Chrome не пересчитывает, как контент должен распределяться по столбцам после использования JS для динамического изменения высоты элементов внутри столбца. Это ошибка?
Есть ли у кого-нибудь идея обходного пути?