在本教程中,我们将学习如何使用flexbox构建全屏响应页面。 我们的页面将包括全屏背景图像,垂直居中的内容和页脚发粘。
快速浏览一下我们要构建的页面( 全屏版本可能会为您提供更好的主意):
1.定义容器
我们首先定义一个容器,在其中放置三个元素。 header
, main
和footer
。 这是页面结构:
<div class="wrapper">
<header class="page-header">
<!-- content here -->
</header>
<main class="page-main">
<!-- content here -->
</main>
<footer class="page-footer">
<!-- content here -->
</footer>
</div>
我们希望页面至少是全屏的,但是当页面高度大于浏览器窗口高度时,我们希望出现滚动条。
借助flexbox,我们能够非常轻松地创建此功能。 这是必需CSS:
.wrapper {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.wrapper > * {
padding: 20px;
}
.page-main {
flex-grow: 1;
}
通过在main
元素上设置flex-grow: 1
,它会扩展以覆盖flex容器内部的可用空间。 header
和footer
元素具有基于其内容的默认宽度。
Internet Explorer警告
当Flex容器的高度最小时,某些版本的Internet Explorer 不能正常工作 。 在我们的示例中(如果您有兴趣支持IE),解决此问题的一种方法是添加以下规则:
body {
display: flex;
flex-direction: column;
}
另一个简单的解决方法是用height: 100vh
代替min-height: 100vh
height: 100vh
。
无论如何,如果您的项目中需要支持IE,请选择最适合您的内容和布局的方法。
到目前为止的进展
这是我们制造的起始笔(为清晰起见,包括一些颜色):
现在,让我们仔细看看容器的后代。
2.标题
我们的页面标题包括三个元素。 徽标,导航和号召性用语。 这是标题标记:
<header class="page-header">
<nav>
<h2 class="logo">
LOGO
</h2>
<ul>
<!-- list items here -->
</ul>
<button class="cta-contact">
get in touch
</button>
</nav>
</header>
其布局根据视口大小而变化。 在窄屏(<550px)上,它看起来像这样:
在更大的屏幕上,布局更改如下:
为了实现这种轻微的布局转换,我们的样式必须满足以下要求:
- 元素应垂直对齐。
- 在小屏幕上,菜单应该是最后一个元素,而在大屏幕上,按钮应该是最后一个元素。
- 在小屏幕上,标题元素分为两行。 导航本身涵盖了第二行。 在较大的屏幕上,所有元素均均匀地分布在一行中。
遵循移动优先的方法,让我们看看标题的最关键规则:
.page-header nav {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
.page-header ul {
display: flex;
order: 1;
width: 100%;
margin-top: 15px;
}
@media screen and (min-width: 550px) {
.page-header ul {
width: auto;
margin-top: 0;
}
.page-header .cta-contact {
order: 1;
}
}
提示: flex元素的默认order
值为0
。 具有相同order
值的元素将根据它们在源文档中出现的顺序进行布局。 因此,在宽屏(≥550px)上导航之后,该按钮才出现。
3.主要内容
我们页面的主要内容包括一些垂直居中并位于背景图片上方的文本。
这是本节的结构:
<main class="page-main">
<div>
<!-- content here -->
</div>
</main>
以及最重要的样式,包括CSS变量:
/* variables */
:root {
--main-white-color: white;
--main-purple-color: #9e89b8;
}
.page-main {
display: flex;
flex-direction: column;
justify-content: center;
min-height: 350px;
background: var(--main-purple-color) url(IMG_SRC) no-repeat center / cover;
background-blend-mode: luminosity;
color: var(--main-white-color);
}
.page-main div {
max-width: 500px;
}
@media screen and (min-width: 768px) {
.page-main {
padding-left: 90px;
}
}
4.页脚
页脚包含两个元素; 一个拥有版权信息,另一个具有指向社交媒体渠道的链接。 这是标记:
<footer class="page-footer">
<small>
<!-- content here -->
</small>
<ul>
<!-- list items here -->
</ul>
</footer>
同样,此处的布局应根据视口大小进行更改。
在窄屏(<550px)上,它看起来像这样:
在更大的屏幕上,布局如下:
考虑以上屏幕截图,应该发生以下情况:
- 在小屏幕上,文本应该是最后一个元素,而在大屏幕上,社交个人资料列表应该是最后一个元素。
- 在小屏幕上,页脚元素分为两行。 另一方面,在较大的屏幕上,所有元素都垂直居中并均匀地分布在单行中。
页脚的主要样式:
.page-footer {
display: flex;
flex-direction: column-reverse;
}
.page-footer ul {
display: flex;
font-size: 1.5rem;
margin-bottom: 5px;
}
@media screen and (min-width: 550px) {
.page-footer {
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.page-footer ul {
margin-bottom: 0;
}
}
图示
最后但并非最不重要的一点是,对于本部分中使用的图标,我已将Ionicons图标包合并到笔中。
结论
在本教程中,我们介绍了使用flexbox创建全屏响应页面的过程。 该过程非常简单,为我们提供了练习一些不同的flexbox技能的机会。