Flex布局到底解决了什么问题

Flex布局到底解决了什么问题--这一直是让我觉得困惑的地方。

响应式设计出现好多年,这些年我们一直使用浮动与block来布局,也没觉得什么不好。。

flex的教程看了挺多,但理解总是很模糊。这几天我从另一个角度开始了flex的学习,在实际对比了flex和普通布局后,发现它不仅更加符合响应式设计的特点,而且以前的一些布局难点也迎刃而解了。

一种似曾熟悉的感觉袭来,就像在我使用gulp后突然明白了grunt为什么会被取代一样。

以下全当总结


1.如何在一个超短的页面中,使footer固定在最下方。代码如下

<body>
    <div class="wrapper">
        <p>404 not found</p>
    </div>
    <div class="footer">
        <p>Copyright (c) 2008</p>
    </div>
</body>

正如404这种页面,一般的解决方案为如下。通过设置负边距来容纳页脚,达到全屏的效果。

.wrapper {
  height: 100%;
  margin: 0 auto -2em;
}
.footer {
  height: 2em;
}

利用flex本身自适应的特点如下,达到的效果一致。但不用手动设置footer的宽高,完美实现footer放置在最下面的需求。

body {
  display: flex;
  flex-direction: column;
}
.wrapper {
  flex: 1;
}

2.如何使表单对齐。

<div class="cover">
  <form class="flex-form">
      <input type="search" placeholder="Where do you want to go?">
      <label for="from">From</label>
      <input type="date" name="from">
      <label for="from">To</label>
      <input type="date" name="to">
      <select name="" id="">
        <option value="1">1 Guest</option>
        <option value="2">2 Guest</option>
      </select>
      <input type="submit" value="Search">
  </form>
</div>

一个长表单。input输入框有大有小不整齐,标签文字与表单文字没有对齐。按照普通方案搞定这些将非常麻烦:涉及到元素高度,文字居中。。。

.cover {
  display: flex;
}
.flex-form {
  display: flex;
  align-items: center;
  border: 1px solid black;
}

/*以下为完善效果所需*/
.flex-form > * {
  border: 0;
  padding:10px;
  font-size: 20px;
  line-height: 50px;
  outline: 0;
  border-right:1px solid rgba(0,0,0,0.2);
  -webkit-appearance:none;
}

.flex-form > *:not([type="date"]) {
  border-top:1px solid white;
  border-bottom:1px solid white;
}

.flex-form input[type="submit"] {
  background:#FF5A5F;
  border-top: 1px solid #FF5A5F;
  border-bottom: 1px solid #FF5A5F;
  color:white;
}

还是利用flex自适应高度的特点,我们没有设置任何一个框的宽高,就达到了文字全部水平对齐的效果。

3.响应式设计

如果上面两个例子依然让你觉得flex没什么大不了的话,第三个例子绝对会让你大吃一惊。
在设计页面时,为了达到响应式的效果,我们在最初布局时就需要考虑到在移动端的显示效果。情况往往是当需要移动端实现某些效果时,才发现html里的结构已经固定了,某些板块布置起来怎么写css都无法实现。有时耗费的时间比开发两套页面还要多。但flex布局的出现使css有了改变html结构的能力。footer板块可以放置到header板块之上还不用改变html结构,就这么神奇!

<div class="wrapper">
    <header class="top">
        <h1>What The Flexbox?!</h1>
    </header>
    <nav class="flex-nav">
        <a href="#" class="toggleNav">☰ Menu</a>
        <ul>
            <li><a href="#">Item 01</a></li>
            <li><a href="#">Item 02</a></li>
            <li><a href="#">Item 03</a></li>
        </ul>
    </nav>
</div>
<script type="text/javascript">
  const toggle = document.querySelector('.toggleNav');
  const menu = document.querySelector('.flex-nav ul')
  toggle.addEventListener('click', () => menu.classList.toggle('open'));
</script>

这个页面由两部分组成。标题是第一部分,菜单是第二部分,但在移动端呈现时往往是菜单在最上面,以前的css是无法实现这种效果的
。利用flex可以设置子元素的排序,这个特性可以把页面中的块变得像积木一样--我们想怎么搭就怎么搭,随便你排列组合。

.wrapper {
  display: flex;
  flex-direction: column;
}
.top {
  text-align: center;
}
h1 {
  padding: 40px 0;
  background-image: linear-gradient(60deg, #2bcfd8 0%, #93d02b 100%);
}
a {
  display: inline-block;
  text-decoration: none;
  background-image: linear-gradient(260deg, #2376ae 0%, #c16ecf 100%);
  padding: 20px 5px;
  text-align: center;
  width: 100%;
}
.flex-nav ul {
  display: flex;
  margin: 0 auto;
  border:1px solid black;
}
.toggleNav{
  display: none;
}

ul li{
  flex: 3;
}


@media all and (max-width:500px) {
  .wrapper > * {
    order: 999;
  }
  .toggleNav {
    display: block;
  }
  .flex-nav {
    order: 1;
  }
  .flex-nav ul{
    display: none;
  }
  .top {
    order: 2;
  }
  .flex-nav .open {
    display: block;
  }
}

在pc端时,标题在上方菜单在下方,当屏幕小于500px时,菜单移动到最上面。
这个事例简单介绍了flex灵活的排列方式,即便你有 10 个内容块,在响应式设计的时候也可以随意更改他们的排序,达到任何你想要的效果。省时省力。


当然flex远远不止这些,但它的出现解决了不少css长久以来积累下的布局疼点。利用浮动和行内块来布局导致的各种BUG层出不穷,因为它们的初衷均不是用来布局。在响应式设计已经成为网站标配的状况下,浮动和行内块越显得力不从心,这也是flex出现的原因。flex更符合响应式的特点,你从不用给它设置一个固定的宽高,它就能达到你想要的效果。

分享两个flex学习资源:

  1. css-tricks flex完全指南 图多字少,清晰明了。

  2. github上的一个项目 flex解决了哪些问题 告诉你flex到底解决了哪些以往css很难解决或无法解决的问题。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值