Я реализую модуль гибкой компоновки блока CSS3 , как определено W3C, который аналогичен Коробочная модель Mozilla для xul . Хотя эти стандарты определяют, как должна вести себя модель, они не содержат никаких подробностей о том, как они должны быть реализованы.
Меня интересуют следующие части модели:
- Ящики имеют ширину и высоту.
- Ящики могут содержать другие ящики.
- Контейнерные ящики (родительские ящики) отвечают за размер и расположение коробки, которые они содержат (дочерние блоки).
- Коробки имеют ориентацию, которая может быть горизонтальной или вертикальной. Ориентация определяет, как дочерние блоки располагаются и изменяются в размерах.
- Дочерние блоки могут быть гибкими или негибкими. Если дочерний блок негибкий, он отрисовывается с размером, указанным в параметрах ширины и высоты. Если он гибкий, то его размер изменяется в соответствии с доступным пространством в родительском контейнере.
- Гибкость относительно других дочерних блоков в том же контейнере, блоки с большей гибкостью изменяются больше, чем блоки с меньшей гибкостью.
- ] Дочерние блоки можно ограничить минимальным или максимальным размером. Если дочерний блок является гибким, родительский блок никогда не изменит его размер ниже минимального или выше максимального.
Функции 1-5 могут быть реализованы довольно эффективно. Функция 6 проблематична, поскольку наиболее эффективный алгоритм, который я могу придумать, довольно наивен. Алгоритм работает следующим образом:
- Поместите все блоки в список.
- Прокрутите каждый дочерний блок и измените его размер, используя гибкость, чтобы определить величину для изменения его размера.
- Если размер превышает один из limit, затем установите размер окна до предела, удалите его из списка и начните с начала списка.
На шаге 3 эффективность падает. Например, если в списке десять элементов, а последний имеет ограничение, алгоритм вычисляет размер для первых девяти элементов, а затем, когда он достигает десятого, ему необходимо повторить все вычисления. Я подумал о том, чтобы сохранить список отсортированным и сначала определить размеры всех ограниченных блоков, однако это связано с затратами на дополнительную сложность и накладными расходами на сортировку списка.
Я ожидаю, что существует признанное оптимальное решение, учитывая, что это довольно распространенная функция в браузерах и фреймворках (XUL, .Net, Flex и т. д.).
задан Luke Van In 2 August 2011 в 07:54
поделиться