Святой Грааль (веб-дизайн) - Holy grail (web design)

Макет Святого Грааля с опускающимся нижним колонтитулом

В Святой Грааль это страница в Интернете макет, который имеет несколько столбцов одинаковой высоты, определенных с помощью таблиц стилей. Это обычно желательно и реализуется, но в течение многих лет различные способы его реализации с помощью доступных технологий имели недостатки.[1] Из-за этого поиск оптимальной реализации был подобен поиску неуловимого Святой Грааль.

Ограничения CSS и HTML, желательность семантически значимых страниц, которые хорошо ранжируются в поисковых системах, и недостатки различных браузеров исторически сложились вместе, чтобы создать ситуацию, в которой не было возможности создать такой тип макета, который считался бы полностью правильным. . Поскольку лежащие в основе технологии не обеспечивали надлежащего решения, веб-дизайнеры нашли различные способы обойти ограничения. Обычные обходные пути включали изменения в структуре страницы, добавление графики, скриптов и творческое использование CSS. Эти методы были несовершенными, неудобными и, по мнению некоторых, являлись злоупотреблением веб-стандартами и их намерениями.

Более свежие веб-стандарты предоставили гораздо более полные и надежные решения для реализации этого макета. В частности, CSS Flexible Box Layout и Макет сетки CSS оба модуля предоставили полные решения.[2][3]

Проблема

Для многих веб-страниц требуется макет с несколькими (часто тремя) столбцами, с содержанием главной страницы в одном столбце (часто в центре) и дополнительным содержимым, таким как меню и рекламные объявления, в других столбцах (боковые панели). Эти столбцы обычно требуют отдельного фона с границами между ними и должны иметь одинаковую высоту независимо от того, какой столбец имеет самое высокое содержимое. Распространенным требованием является то, что боковые панели должны иметь фиксированную ширину, а размер центрального столбца регулируется для заполнения окна (жидкий или жидкий макет). Другое распространенное требование заключается в том, что, когда страница не содержит достаточно контента для заполнения экрана, нижний колонтитул должен опускаться до нижней части окна браузера, а не оставлять пустое пространство под ним.

Макет CSS с плавающими столбцами и очищенным нижним колонтитулом, без функций Святого Грааля

На пути к этому было много препятствий:

  • CSS, хотя и весьма полезен для стилизации, имел ограниченные возможности для макета страницы.
  • Высота элементов блока (например, элементов div) обычно определяется их содержимым. Таким образом, два раздела, расположенные рядом, с разным объемом контента, будут иметь разную высоту, если их высота каким-либо образом не установлена ​​на подходящее значение.
  • HTML предназначен для использования семантически; Следует выбирать элементы HTML, которые точно описывают их содержание. Внешний вид веб-страницы, отображаемой пользовательский агент следует определять самостоятельно по стилевым правилам. Многие реализации неправильно используют HTML, используя столы для нетабличных данных или вложения нескольких div элементы без смыслового назначения. Несемантическое использование HTML сбивает с толку пользователей или пользовательских агентов, которые пытаются различить структуру содержимого страницы, и является доступность проблема.[4]
  • В качестве поисковые системы может рассматривать контент в начале веб-страницы исходный код чтобы быть более соответствующий, и контент читается в порядке исходного кода при просмотре некоторыми пользовательскими агентами, такими как программы чтения с экрана, веб-дизайнеры хотят иметь возможность размещать контент в исходном коде страницы в произвольном порядке, не влияя на внешний вид страницы.
  • Потому что неправильный рендеринг содержимого в разных браузерах, метод, который работает в браузере, соответствующем стандартам, может не работать в браузере, который неправильно реализует CSS.

Известные обходные пути

Столы

До широкого внедрения CSS дизайнеры обычно использовали таблицы для размещения страниц. Иногда они добивались желаемого макета, вкладывая несколько таблиц друг в друга. Хотя размещение столбцов внутри ячеек таблицы позволяет легко добиться желаемого внешнего вида, использование таблицы семантически некорректно, хотя «роль» WAI-ARIA Атрибут HTML может быть установлен на «представление» для восстановления семантического контекста. Также нет возможности контролировать порядок столбцов в источнике страницы.

Деления с дисплеем: таблица

С помощью CSS можно сделать столбцы одинаковой высоты отображать свойство.[5] Для этого требуются вложенные разделы контейнера, для которых установлено значение дисплей: таблица и display: table-row, и столбцы, для которых установлено значение дисплей: таблица-ячейка. Это семантически правильно, поскольку влияет только на отображение. Однако в этом методе отсутствует возможность управления порядком исходного кода. Он также не будет работать с некоторыми устаревшими, неподдерживаемыми браузерами, такими как Internet Explorer 7.

Искусственные колонны

В этом методе используется фоновое изображение, обеспечивающее цвета фона и вертикальные границы всех трех столбцов.[6] Содержимое каждого столбца заключено в раздел и позиционируется над его фоном с использованием таких методов, как плавающие, отрицательные поля и относительное позиционирование. Фон обычно имеет высоту всего несколько пикселей и делается для покрытия страницы с помощью атрибута «repeat-y». Это отлично работает для макетов с фиксированной шириной и может быть адаптировано для страниц с переменной шириной на основе процентов, но не может использоваться для страниц с плавным центром.

JavaScript

В этом методе после загрузки страницы сценарий измеряет высоту каждого из столбцов и устанавливает для высоты каждого столбца большее значение. Это не будет работать в браузерах, которые не поддерживают JavaScript, или отключите JavaScript.

Фиксированное или абсолютное позиционирование

В этом методе углы разделов столбцов фиксируются в определенном месте на странице.[7] Это может быть приемлемо или даже желательно, но не решает проблему святого Грааля, поскольку это существенно другой макет. Последствия этого метода могут включать в себя отображение содержимого под столбцами (например, нижнего колонтитула), зафиксированное в нижней части экрана, пустое пространство под содержимым столбца и требование полос прокрутки для каждого столбца для просмотра всего содержимого.

Вложенные подразделения

Раздел с фоном будет увеличиваться в высоту, чтобы вместить его содержимое. Такое поведение используется для решения проблемы путем создания трех вложенных друг в друга подразделений, обеспечивающих три фона. Эти разделы размещаются в надлежащих местах с использованием методов позиционирования, а три раздела контента размещаются внутри самого внутреннего фонового раздела, размещенного над соответствующими фонами. Фоновые разделы становятся такими же высокими, как самый высокий раздел контента. К недостаткам этого метода можно отнести три несемантических разделения и сложность позиционирования элементов этого сложного макета.[8]

Цвет границы

Более простой вариант метода вложенного деления предполагает использование одного контейнерного деления. Свойства фона этого раздела обеспечивают фон центрального столбца, а левая и правая границы, ширина которых равна ширине бокового столбца, обеспечивают цвета фона боковых панелей. Содержимое каждого столбца располагается поверх его фона. Этот метод по-прежнему использует одно несемантическое деление и затрудняет применение фоновых изображений и границ к боковым панелям.[9]

Нижняя обивка

При размещении большого количества отступов в нижней части контейнера столбца фон будет простираться намного ниже содержимого столбца. Соответствующее отрицательное поле вернет содержимое под столбцами в правильное положение. Позиционирование в этом методе простое, поскольку контейнер содержимого столбца также содержит его фон. Значение заполнения 32767 пикселей - это наибольшее значение, которое распознается всеми современными браузерами. Если разница в высоте столбца больше, чем это, фон более короткого столбца не будет полностью заполнять столбец.[10]

Текущие решения

Стандарты CSS3 содержат модули, которые предназначены для размещения элементов страницы. Два из них полностью решают проблему Святого Грааля.[11][12] Поддержка этих модулей отсутствует или отсутствует в старых браузерах. Многие дизайнеры будут реализовывать эти модули, обеспечивая при этом совместимый стиль для старых браузеров, который в современных браузерах будет заменен новым синтаксисом. Поддержка старых браузеров стала менее важной в 2020 году, когда закончилась расширенная поддержка Windows 7 и использование Internet Explorer стало менее распространенным.

CSS-макет гибкого блока (Flexbox)

В Консорциум World Wide Web (W3C) подошел к вопросу макета через различные предложения. Наиболее зрелым предложением является Модуль гибкой компоновки коробки (A.K.A. Flexbox), который находится в статусе кандидата в рекомендации по состоянию на ноябрь 2018 г.[13] Установка свойства отображения элемента на дисплей: гибкий или же дисплей: встроенный гибкий заставляет элемент стать контейнером нового типа (подобным блоку или встроенному блоку, соответственно) с новыми методами позиционирования дочерних объектов. Контент может течь в любом направлении и отображаться в любом порядке. Предложение W3C содержит пример, который обеспечивает макет столбца Святого Грааля с помощью четырех простых правил CSS и делает макет адаптивным с помощью простого правила медиа-запроса. Модуль также можно использовать для решения многих других проблем с компоновкой.

Модуль гибкой компоновки окна поддерживается всеми современными браузерами, хотя в реализации Internet Explorer есть проблемы.[14]

Макет сетки CSS

В Модуль компоновки сетки аналогично позволяет дизайнеру создавать контейнер для макета, который содержит строки и столбцы фиксированного или переменного размера, в которые можно помещать элементы. По состоянию на август 2020 года он находится в статусе кандидата в рекомендации.[15] Он поддерживается всеми современными браузерами, однако реализация Internet Explorer имеет проблемы.[16] Этот модуль является продолжением предыдущей работы, выполненной как модуль позиционирования сетки, модуль макета шаблона и модуль расширенного макета.[17]

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

Хотя модуль Flexible Box может выполнять двухмерную разметку страницы, его предполагаемое назначение - позиционировать элементы в основном вдоль одной оси. Макет в виде сетки предпочтителен для компоновки сложных страниц и страниц, макет которых сильно различается в адаптивном дизайне.[18]

История

Первый трехколоночный дизайн с фланками, в котором использовался чистый CSS, был разработан Робом Чанданаисом из BlueRobot.[19] для сайтаrongwaygoback.com в 2001 году. В тот момент Нил Талбот использовал JavaScript для определения положения правого столбца. Чанданаис придумал элегантное решение для позиционирования, используя вместо этого чистый CSS, и вскоре его окрестили. Святой Грааль Эрика Костелло из Glish.com.[20]

Смотрите также

Рекомендации

  1. ^ .appendTo: Решение разметки Святого Грааля
  2. ^ «Макет Святого Грааля - Решено с помощью Flexbox - Очиститель, CSS без взлома». philipwalton.github.io. Получено 2019-03-26.
  3. ^ «Макет Святого Грааля с 5 строками CSS». CSS-хитрости. Получено 2019-03-26.
  4. ^ W3C: HTML5 / Элементы / Семантика
  5. ^ Build Internet: четыре метода создания столбцов одинаковой высоты
  6. ^ Список отдельно: искусственные столбцы
  7. ^ W3C: HOWTO по макету без таблицы
  8. ^ Мэтью Джеймс Тейлор: столбцы одинаковой высоты с кроссбраузерным CSS
  9. ^ Отдельный список: статьи: макеты с несколькими столбцами - нестандартные решения
  10. ^ Положение - это все: столбцы одинаковой высоты - еще раз - в поисках единого верного макета
  11. ^ .appendTo: Решение разметки Святого Грааля
  12. ^ Макет Святого Грааля - Решено с помощью Flexbox - Чистый CSS без взлома
  13. ^ W3C: модуль CSS Flexible Box Layout
  14. ^ «Могу ли я использовать ... таблицы поддержки HTML5, CSS3 и т. Д.». CanIUse.com. Получено 2016-02-27.
  15. ^ W3C: CSS Grid Layout
  16. ^ Могу ли я использовать: CSS Grid Layout
  17. ^ W3C: модуль макета шаблона CSS
  18. ^ Почему Flexbox не подходит для макета страницы
  19. ^ BlueRobot: трехколонный фланкирующий макет В архиве 25 апреля 2013 г. Wayback Machine
  20. ^ "Техника верстки Glish.com - 3 колонки, Святой Грааль". Архивировано из оригинал на 2008-12-01. Получено 2013-05-15.