在本教程中,我们将学习如何使用 flexbox 构建全屏响应式页面。我们的页面将包括一个全屏背景图像、垂直居中的内容和一个粘性页脚。
下面是我们将要构建的页面的快速浏览(全屏版本可能会给您一个更好的主意):
See the Pen How to Build a Full-Screen Responsive Page With Flexbox by Envato Tuts+ (@tutsplus) on CodePen.
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;
}
通过设置 flex-grow: 1元素main,它会扩展以覆盖 flex 容器内的可用空间。header和footer元素具有基于其内容的默认宽度。
Internet Explorer 警告
当 flex 容器具有最小高度时,某些版本的 Internet Explorer无法正常工作。在我们的示例中(如果您对支持 IE 感兴趣),解决此问题的一种方法是添加以下规则:
body {
display: flex;
flex-direction:
column;}
另一个直接的解决方法是将 替换 min-height: 100vh为height: 100vh.
无论如何,如果您的项目需要支持 IE,请选择最适合您的内容和布局的方法。
迄今为止的进展
这是我们构建的起始笔(为了清晰起见,包括一些颜色):
See the Pen How to Build a Full-Screen Responsive Page With Flexbox: Step 1 by Envato Tuts+ (@tutsplus) on CodePen.
现在让我们仔细看看容器的后代。
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)上的导航之后。
三、主要内容
我们页面的主要内容包括一些垂直居中并位于背景图像顶部的文本。
这是本节的结构:
<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;
}
}
这里没有发生非常复杂的事情。再次感谢 flexbox,我们能够将main内容垂直居中。
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 技能。
- Internet Explorer 警告
- 迄今为止的进展
- 图标