设置header_使用CSS Flexbox 构建可靠实用的网站 Header

本文介绍了如何利用CSS Flexbox来创建可靠且实用的网站Header,包括设置Header Wrapper、使用flex-wrap属性,以及处理Header的多种形式。通过实例展示了添加按钮、搜索输入等变化,并分享了一些使用Flexbox构建Header的有用技巧,如flex-basis和间距处理。
摘要由CSDN通过智能技术生成

本文已经过原作者 Shadeed 授权翻译。 

在 CSS3 没有普及的时候,创建一个网站 header 是一项既可怕又困难的任务 ?。那时,Flexbox 还是个新东西,我们不得不使用老方法,比如 floatclearfix技术。今天,情况完全不同了,Flexbox 得到了广泛的支持,大大的减少了我们的开发工作,同时也为我们提供了更多的可能性。

有人可能会说,现在 CSS3 这么普及,制作一个网站 header 不是很容易么 ??并非如此,因为有一些有趣的挑战需要解决,在本文中我们会介绍其中的几种。

简介

首先,这里所说的网站 Header 是用户访问网站时首先看到的内容之一。通常,它包含logo或网站名称以及导航链接,如下所示:

71078b6aa85b226998caed14173acb99.png

不管 Header 的视觉设计如何,关键元素都是logo导航

Flexbox

当 flexbox 应用于 Header 元素时,它将使所有子项目在同一行中。然后,你所需要做的就是应用justify-content来分配它们之间的间距。

html

"site-header">"#" class="brand">Brand"nav">

css

.site-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

很简单,对吧?对于这样的用例,是的,可能会比这更复杂。

Header Wrapper

在上面的 lagonav 外没有包含一层 wrapper,这在大屏幕可能会出现问题。

253551acec726f256014794c90b4e4c1.png

从上可以看到第一个Header太宽了,因为它没有内部 wrapper 相比第一个,第二个看起来好多了。所以,我们可以对 HTML 进行如下调整。

"site-header">
"wrapper site-header__wrapper">"#" class="brand">"logo.svg" alt="brand" />"nav">

flexbox应该移动到.site-header__wrapper元素中。

.site-header__wrapper {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

使用 flex-wrap

当屏幕很小的时候,可以水平滚动。见下图

9bd193dccf3afefbf0eec7427613303e.png

如果没有设置flex-wrap: wrap,当屏幕过小的时候就会出现水平滚动,如果不想这样,可以加上 flex-wrap: wrap` ?。

Header 的多种形式

我喜欢使用flexbox的原因是它可以很容易地处理 header 设计的多种变化。基于前面的 header  设计,我扩展了 header 元素的一些选项,如添加按钮、搜索输入和更改子项目的顺序。

Header 变化 1

13fa1dc67974dd0588ae82635d282b21.png

假设我想要在导航链接旁边添加了一个按钮。这应该如何处理?我们应该把它作为链接添加到导航栏中吗?还是应该和导航分开?我更喜欢这样做。

"site-header">
"wrapper site-header__wrapper">"#" class="brand">"logo.svg" alt="brand" />"nav">"/track-shipment" class="button">Track

这种情况下,我们不能在用 justify-content: space-between来处理间隙,相反,我会在 nav 元素上使用 margin-left: auto

这样,它就会自动向右靠齐。

607a52eda8111b607f98f528d0a2b62d.png

将导航和 track 按钮分开对于移动设备非常有用,因为我们需要保留该按钮并在其旁边显示一个移动切换按钮。

85873836328cfb43a24593129f90ff87.png

Header 变化 2

26580934f5db11ea934701b56e767927.png

与第一个变化类似,这个变化增加了一个搜索输入,占用了剩余的可用空间。对于flexbox,这可以通过使用flex属性来实现。

html

"site-header">
"wrapper site-header__wrapper">"#" class="brand">"logo.svg" alt="brand" />
"search">
"nav">"/track-shipment" class="button">Track

css

.search {
  flex: 1;
}

现在,搜索输入将填充 brand  和nav 之间的可用空间。但是,这有一些限制。在较小的视口上,header 将如下所示:

b88e2f18d57f0abe32422c54ce37423f.png

搜索输入宽度不应小于此宽度,因为这样很难输入和查看全文。下面有两种解决方案:

4f29ed650dcc4dfba593e6551f90055e.png

我更喜欢第二种解决方案,因为它不会过早隐藏导航。一般来说,如果元素不影响布局,我会尽量避免隐藏它。

Header 变化 3

4dad563c71dd478e4fbe595efb0b447e.png

对于这个示例,HTML标记是相同的,但是 header 里的元素顺序是不同的。我们如何才能做到这一点? 你可能想到用 order 属性来解决这个问题 ?

html

"site-header">
"wrapper site-header__wrapper">"#" class="brand">"logo.svg" alt="brand" />"nav">"/track-shipment" class="button">Track

css

.site-header {
  display: flex;
  justify-content: space-between;
}

.nav {
  order: -1;
}

01410cbdc117dcb1355d4ea77dc9d30b.png

这样有个问题,间隔空间不会使 logo 居中,它只是分散项目之间的空间。

解决方案是给每个子项一个flex: 1,这将在它们之间分配可用空间。

.brand,
.nav,
.button {
  flex: 1;
}

12e90eb37e274ffe2ad381b47dc76f99.png

这样,由于flex: 1,按钮元素变宽了, 解决此问题的唯一方法是将其包裹到另一个元素中。

HTML

"site-header">
"wrapper site-header__wrapper">"#" class="brand">"logo.svg" alt="brand" />"nav">
"button-wrapper">"/track-shipment" class="button">Track

这样,我们就可以将下面的logo和按钮居中。

.logo {
  text-align: center;
}

/* 不要介意这里的命名,这只是出于演示*/
.button-wrapper {
  text-align: end; /* end 等同于LTR语言中的right */
}

9af8532ce59fc71e5c4271c66dc472c0.png

但是,如果添加了更多导航链接,这种方法很容易失败。我们需要确保导航链接的数量不会超过特定的限制。下面一个logo偏离中心的例子 ?:

e6de9da300c5461f772cea300afd5a19.png

正如在上图中看到的,logo没有居中。所以要记住这一点,以避免这种意想不到的问题 ?。

使用 Flexbox 构建 Header  的有用技巧

flex-basis

如果某个元素需要在移动设备上占据整个宽度(不能隐藏的重要导航),我会使用flex-basis: 100% ?。

be91ecefcaa9cbcea39769ac1c0de1ed.png

从上面的模型看,做起来可能很简单。实际上不是。通常,header 可能有一个内部间距(padding),当我们强制某项占据全部宽度时,除非清除padding ,否则它不会生效。但是,删除padding不切实际,因为它将影响设计中的其他元素 ?。

下面解决此问题的一种解决方法 ?:

  1. flex: 1 0 100%添加到导航元素。
  2. 如有需要,请更改其order。有时,可能还有其他元素,我们想确保导航是最后一个。
  3. 加上一个等于宽度等于 padding 的负 margin,这也会让导航占据整个宽度。
  4. 在导航中添加 padding,这会增加一些适当的空间。
  5. 最后,使用了justify-content: center将导航项居中(不重要)
.nav {
  flex: 1 0 100%; /* [1] */
  order: 2; /* [2] */
  margin: 1rem -1rem -1rem -1rem; /* [3] */
  padding: 1rem; /* [4] */
  display: flex; /* [5] */
  justify-content: center; /* [5] */
}

c84104e5fb7b320e5f2ca08668d5a9e8.png

间距

着 Chrome 和 Firefox 支持flex gap属性,现在在flex项目之间添加间距比以往任何时候都容易。考虑以下标题

63212a744dff95f684b71a92f793447a.png

要做到上图的高亮间距,只需将gap: 1rem添加到flex父节点。没有了gap,我们还是需要用旧的方式来间隔 ?。

/* 老的方式 */
.brand {
  margin-right: 1rem;
}

.sign-in {
  margin-right: 1rem;
}

/* 新的方式 */
.site-header {
  /* Other flexbox styles */
  gap: 1rem;
}

作者:Shadeed  译者:前端小智  来源:ishadeed 原文:https://ishadeed.com/article/website-headers-flexbox/

8c7f07d330088001aeacddb18349500c.png

《CSS世界特效》专栏已经更新到第二季啦,目前共有200个读者订阅,感谢读者们的支持与鼓励。你们的订阅就是我坚持分享下去的动力与激情,有需要的朋友,可以看看。

第一季:https://blog.csdn.net/qq449245884/category_9873715.html?tt_from=copy_link&utm_source=copy_link&utm_medium=&utm_campaign=client_share第二季:https://blog.csdn.net/qq449245884/category_10212382.html?utm_source=copy_link&tt_from=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值