当前位置: 首页 > 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 发现了新的方法制这种恶意程序
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • bootstrap创建登录注册页面
  • Electron入门介绍
  • golang中接口赋值与方法集
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java知识点总结(JavaIO-打印流)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Terraform入门 - 3. 变更基础设施
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue.js框架原理浅析
  • vue-router的history模式发布配置
  • 使用parted解决大于2T的磁盘分区
  • 数据科学 第 3 章 11 字符串处理
  • 正则表达式-基础知识Review
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (力扣)1314.矩阵区域和
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (图)IntelliTrace Tools 跟踪云端程序
  • (五)关系数据库标准语言SQL
  • (循环依赖问题)学习spring的第九天
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)u-boot-nand.bin的下载
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net MySql
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net 代码性能 - (1)
  • .Net6 Api Swagger配置
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @EnableWebMvc介绍和使用详细demo
  • @JsonFormat与@DateTimeFormat注解的使用
  • @property python知乎_Python3基础之:property