当前位置: 首页 > news >正文

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很难解决或无法解决的问题。

相关文章:

  • VB之SendKeys键盘模拟
  • win 下 apache 虚拟主机配置方式
  • php libevent 详解与使用
  • Weex技术峰会精华集锦:揭秘火爆Github排行版的跨平台移动开发工具背后技术
  • 用js使得输入框input只能输入数字
  • /usr/bin/env: node: No such file or directory
  • 感觉世界变化太快...
  • Effective C++ iterm4
  • 用虚拟 router 连通 subnet - 每天5分钟玩转 OpenStack(141)
  • ECMAScript 6 入门
  • 指令周期 机器周期 状态周期 振荡时钟周期(时钟周期)(转)
  • 关于java的print()
  • Laravel / Lumen 实践总结
  • 对象存储、快存储、文件存储的区别
  • 恶意程序入侵 dbuspm-session 发现了新的方法制这种恶意程序
  • $translatePartialLoader加载失败及解决方式
  • happypack两次报错的问题
  • linux安装openssl、swoole等扩展的具体步骤
  • nginx 负载服务器优化
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • python3 使用 asyncio 代替线程
  • ReactNative开发常用的三方模块
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Tornado学习笔记(1)
  • webgl (原生)基础入门指南【一】
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从输入URL到页面加载发生了什么
  • 仿天猫超市收藏抛物线动画工具库
  • 诡异!React stopPropagation失灵
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端性能优化--懒加载和预加载
  • 移动端 h5开发相关内容总结(三)
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ​学习一下,什么是预包装食品?​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #define,static,const,三种常量的区别
  • (13)Hive调优——动态分区导致的小文件问题
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (二)丶RabbitMQ的六大核心
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十八)SpringBoot之发送QQ邮件
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .htaccess配置常用技巧
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • [<死锁专题>]
  • [Android 13]Input系列--获取触摸窗口
  • [Android 数据通信] android cmwap接入点
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽
  • [dts]Device Tree机制
  • [HDOJ4911]Inversion