предисловие
Недавно друг пожаловался мне, что во время собеседования его вдруг спросили, как реализовать компоновку и принцип, и он немного растерялся. JavaScript-часть предыдущего ответа была очень хороша, но здесь лодка перевернулась, и идеи не было вообще, и последующий статус интервью резко упал. В конце концов, как он и ожидал, его не приняли.
После того, как я дал ответ этому другу, я пошел домой и разобрал эту статью. Я надеюсь, что другие друзья смогут спокойно ответить, когда их спросят о расположении Святого Грааля в интервью.
В этой статье будет представлен принцип классической вёрстки — вёрстка Holy Grail и два метода реализации: float и flex.
Что такое макет Святого Грааля?
Макет Святого Грааля должен обсудить реализацию «жидкого макета с тремя столбцами», самая ранняя совершенная реализация - это статья, написанная Мэтью Левином в 2006 году.«В поисках Святого Грааля», который в основном рассказывает о том, как лучше всего достичь Святого Грааля на веб-страницах.
Он имеет следующие требования:
- Верхний (шапка) и нижний (нижний колонтитул) занимают всю ширину экрана.
- Раздел между верхом и низом (контейнер) представляет собой трехколоночный макет.
- Ширина обеих сторон трехколоночного макета остается неизменной, а средняя часть автоматически заполняет всю область.
- Высота средней секции равна высоте самой высокой секции в трех столбцах.
Далее будут представлены два метода реализации. Их конечный эффект такой же, как показано ниже:
Метод реализации 1: плавающий
Сначала код:
<div class="header">
<h4>header</h4>
</div>
<div class="container">
<div class="middle">
<h4>middle</h4>
<p>middle-content</p>
</div>
<div class="left">
<h4>left</h4>
<p>left-content</p>
</div>
<div class="right">
<h4>right</h4>
<p>right-content</p>
</div>
</div>
<div class="footer">
<h4>footer</h4>
</div>
.header, .footer {
border: 1px solid #333;
background: #ccc;
text-align: center;
}
.footer {
clear: both;
}
.container {
padding:0 220px 0 200px;
overflow: hidden;
}
.left, .middle, .right {
position: relative;
float: left;
min-height: 130px;
}
.middle {
width: 100%;
background: blue;
}
.left {
margin-left: -100%;
left: -200px;
width: 200px;
background: red;
}
.right {
margin-left: -220px;
right: -220px;
width: 220px;
background: green;
}
Проанализируйте идею:
- В html сначала определите стили верхнего и нижнего колонтитула, чтобы они заполнялись по горизонтали.
- Три столбца в контейнере настроены на плавающее и относительное позиционирование (которое будет использоваться позже), средний должен быть помещен впереди, а нижний колонтитул должен быть очищен для плавающего положения.
- Левый и правый столбцы трех столбцов установлены на 200 пикселей и 220 пикселей соответственно, а средняя часть заполнена на 100%.
- Таким образом, из-за плавающих отношений середина будет занимать весь контейнер, а левая и правая области будут выдавлены.
- Далее установите левый
margin-left: -100%;, позвольте левому вернуться к самой левой стороне предыдущей строки - Но это закроет середину, поэтому в это время установите внешний контейнер.
padding: 0 220px 0 200px;, чтобы освободить место для левого - В настоящее время левый не крайний левый, потому что относительное позиционирование было задано ранее, поэтому передайте
left: -200px;Потяните левый назад в крайнее левое положение - Аналогично, для правой области установите
margin-left: -220px;потяните право назад к первой линии - В этом случае пустое место справа от 220 пикселей, окончательный набор `right: -220px; ## вытянут справа от правой области на линии.
Метод реализации 2: гибкая эластичная коробка
Использовать flexbox для создания макета Holy Grail очень просто, вам нужно использовать flex layout только для средней части.
<div class="header">
<h4>header</h4>
</div>
<div class="container">
<div class="left">
<h4>left</h4>
<p>left-content</p>
</div>
<div class="middle">
<h4>middle</h4>
<p>middle-content</p>
</div>
<div class="right">
<h4>right</h4>
<p>right-content</p>
</div>
</div>
<div class="footer">
<h4>footer</h4>
</div>
.header, .footer {
border: 1px solid #333;
background: #ccc;
text-align: center;
}
.container {
display: flex;
}
.left {
width: 200px;
background: red;
}
.middle {
flex: 1;
background: blue;
}
.right {
width: 220px;
background: green;
}
Проанализируйте идею:
- Верхний и нижний колонтитулы такие же, как и выше, полностью по горизонтали. Больше не нужно очищать и перемещать нижний колонтитул
- Левое, среднее и правое в контейнере можно расположить последовательно, и нет необходимости размещать среднее впереди.
- Установить гибкий макет для контейнера
display: flex; - ЛЕВАЯ и ПРАВАЯ область, средние настройки
flex: 1;Только что
Суммировать
В общем, эластичная компоновка является наиболее подходящим методом реализации макета Святого Грааля.По сравнению с плавающей структурой эластичной компоновки она более понятна и понятна, и нет необходимости беспокоиться о проблеме адаптации мобильного терминала.
Плавающий метод, с которым можно столкнуться на собеседовании, в основном проверяет способность понимать макет. Поэтому рекомендуется скопировать плавающий пример и смоделировать его самостоятельно, чтобы углубить свое понимание.
Обновление (2019-01-17)
Спасибо @shenmo за предложение, я добавлю его сюда.
Еще одно ядро макета Святого Грааля:Важный контент загружается первым. Как и в этой статье, средний находится спереди, а левый и правый - сзади.
PS: Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись «Super Brother Front-end Small Stack», чтобы обменяться идеями и технологиями.