前端学习<二>CSS基础——13-CSS3属性:Flex布局图文详解

前言

CSS3中的 flex 属性,在布局方面做了非常大的改进,使得我们对多个元素之间的布局排列变得十分灵活,适应性非常强。其强大的伸缩性和自适应性,在网页开中可以发挥极大的作用。

flex 初体验

我们先来看看下面这个最简单的布局:

上面这张图中的布局是我们都熟悉的:默认文档流中,在一个父容器里放置多个块级的子元素,那么,这些子元素会默认从上往下排列。

在此基础之上,如果我给父容器仅仅加一个 display: flex属性,此时,这些子元素的布局会摇身一变:

没错,子元素们会在水平方向上,从左至右排列,就是这么神奇。到此为止,你已经掌握了关于 flex 的一半的知识。

flex 布局的优势

1、flex 布局的子元素不会脱离文档流,很好地遵从了“流的特性”。

但你如果用 float 来做布局,float 属性的元素会脱离文档流,而且会涉及到各种 BFC、清除浮动的问题。浮动相关的问题,比较麻烦,所以也成了面试必问的经典题目。但有了 flex 布局之后,这些问题都不存在的。

2、flex 是一种现代的布局方式,是 W3C 第一次提供真正用于布局的 CSS 规范。 flex 非常提供了丰富的属性,非常灵活,让布局的实现更佳多样化,且方便易用。

flex 唯一的缺点就在于,它不支持低版本的 IE 浏览器。

flex 的兼容性问题

上图中可以看到, flex 布局不支持 IE9 及以下的版本;IE10及以上也只是部分支持。如果你的页面不需要处理 IE浏览器的兼容性问题,则可以放心大胆地使用 flex 布局。

但是,比如网易新闻、淘宝这样的大型网站,面对的是海量用户,即便使用低版本浏览器的用户比例很少,但绝对基数仍然是很庞大的。因此,这些网站为了兼容低版本的 IE 浏览器,暂时还不敢尝试使用 flex 布局。

概念:弹性盒子、子元素

在讲 flex 的知识点之前,我们事先约定两个概念:

  • 弹性盒子:指的是使用 display:flexdisplay:inline-flex 声明的父容器

  • 子元素/弹性元素:指的是父容器里面的子元素们(父容器被声明为 flex 盒子的情况下)。

概念:主轴和侧轴

在上面的“初体验”例子中,我们发现,弹性盒子里面的子元素们,默认是从左至右排列的,这个方向,代表的就是主轴的方向。

在此,我们引入主轴和侧轴的概念。

如上图所示:

  • 主轴:flex容器的主轴,默认是水平方向,从左向右。

  • 侧轴:与主轴垂直的轴称作侧轴,默认是垂直方向,从上往下。

PS:主轴和侧轴并不是固定不变的,可以通过 flex-direction 更换方向,我们在后面会讲到。

弹性盒子

声明定义

使用 display:flexdisplay:inline-flex 声明一个父容器为弹性盒子。此时,这个父容器里的子元素们,会遵循弹性布局。

备注:一般是用 display:flex这个属性。display:inline-flex用得较少。

flex-direction 属性

flex-direction:用于设置盒子中子元素的排列方向。属性值可以是:

属性值描述
row从左到右水平排列子元素(默认值)
column从上到下垂直排列子元素
row-reverse从右向左排列子元素
column-reverse从下到上垂直排列子元素

备注:如果我们不给父容器写flex-direction这个属性,那么,子元素默认就是从左到右排列的。

代码演示:

 <!DOCTYPE html>
 <html>
 <head lang="en">
     <meta charset="UTF-8">
     <title></title>
     <style>
         *{
             margin: 0;
             padding: 0;
             list-style: none;
         }
        body{
            background-color: #eee;
            font-family: "Microsoft Yahei";
            font-size:22px;
        }
 ​
         h3{
             font-weight: normal;
         }
         section{
             width: 1000px;
 ​
             margin:40px auto;
         }
 ​
         ul{
             background-color: #fff;
             border: 1px solid #ccc;
 ​
         }
 ​
         ul li{
             width: 200px;
             height: 200px;
             background-color: pink;
             margin:10px;
         }
         section:nth-child(1) ul{
             overflow: hidden; /* 清除浮动 */
         }
         section:nth-child(1) ul li{
             float: left;
         }
         /* 设置伸缩盒子*/
         section:nth-child(2) ul{
             display: flex;
         }
 ​
         section:nth-child(3) ul{
             /* 设置伸缩布局*/
             display: flex;
             /* 设置主轴方向*/
             flex-direction: row;
         }
 ​
         section:nth-child(4) ul{
             /* 设置伸缩布局*/
             display: flex;
             /* 设置主轴方向 :水平翻转*/
             flex-direction: row-reverse;
         }
 ​
         section:nth-child(5) ul{
             /* 设置伸缩布局*/
             display: flex;
             /* 设置主轴方向 :垂直*/
             flex-direction: column;
         }
 ​
         section:nth-child(6) ul{
             /* 设置伸缩布局*/
             display: flex;
             /* 设置主轴方向 :垂直*/
             flex-direction: column-reverse;
         }
     </style>
 </head>
 <body>
     <section>
         <h3>传统布局</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 ​
     <section>
         <h3>伸缩布局 display:flex</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 ​
     <section>
         <h3>主轴方向 flex-direction:row</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 ​
     <section>
         <h3>主轴方向 flex-direction:row-reverse</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 ​
     <section>
         <h3>主轴方向 flex-direction:column</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 ​
     <section>
         <h3>主轴方向 flex-direction:column-reverse</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 </body>
 </html>

flex-wrap 属性

flex-wrap:控制子元素溢出时的换行处理。

justify-content 属性

justify-content:控制子元素在主轴上的排列方式。

弹性元素

justify-content 属性

  • justify-content: flex-start; 设置子元素在主轴上的对齐方式。属性值可以是:

    • flex-start 从主轴的起点对齐(默认值)

    • flex-end 从主轴的终点对齐

    • center 居中对齐

    • space-around 在父盒子里平分

    • space-between 两端对齐 平分

代码演示:(在浏览器中打开看效果)

 <!DOCTYPE html>
 <html>
 <head lang="en">
     <meta charset="UTF-8">
     <title></title>
     <style>
         *{
             margin: 0;
             padding: 0;
             list-style:none;}
         body{
             background-color: #eee;
             font-family: "Microsoft Yahei";
 ​
         }
         section{
             width: 1000px;
             margin:50px auto;
         }
         section h3{
             font-size:22px;
             font-weight: normal;
         }
 ​
         ul{
             border: 1px solid #999;
             background-color: #fff;
             display: flex;
 ​
         }
 ​
         ul li{
             width: 200px;
             height: 200px;
             background: pink;
             margin:10px;
 ​
         }
 ​
         section:nth-child(1) ul{
             /* 主轴对齐方式:从主轴开始的方向对齐*/
             justify-content: flex-start;
         }
 ​
         section:nth-child(2) ul{
             /* 主轴对齐方式:从主轴结束的方向对齐*/
             justify-content: flex-end;
         }
 ​
         section:nth-child(3) ul{
             /* 主轴对齐方式:居中对齐*/
             justify-content: center;
         }
 ​
         section:nth-child(4) ul{
             /* 主轴对齐方式:在父盒子中平分*/
             justify-content: space-around;
 ​
            }
 ​
         section:nth-child(5) ul{
             /* 主轴对齐方式:两端对齐 平分*/
             justify-content: space-between;
         }
     </style>
 </head>
 <body>
     <section>
         <h3>主轴的对齐方式:justify-content:flex-start</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 ​
     <section>
         <h3>主轴的对齐方式:justify-content:flex-end</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 ​
     <section>
         <h3>主轴的对齐方式:justify-content:center</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 ​
     <section>
         <h3>主轴的对齐方式:justify-content:space-round</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
         </ul>
     </section>
 ​
     <section>
         <h3>主轴的对齐方式:justify-content:space-bettwen</h3>
         <ul>
             <li>1</li>
             <li>2</li>
             <li>3</li>
             <li>4</li>
         </ul>
     </section>
 </body>
 </html>

align-items 属性

align-items:设置子元素在侧轴上的对齐方式。属性值可以是: - flex-start 从侧轴开始的方向对齐 - flex-end 从侧轴结束的方向对齐 - baseline 基线 默认同flex-start - center 中间对齐 - stretch 拉伸

代码演示:

 <!DOCTYPE html>
 <html>
 <head lang="en">
     <meta charset="UTF-8">
     <title></title>
     <style>
         *{
             margin: 0;
             padding: 0;
             list-style:none;
         }
         body{
             background-color: #eee;
             font-family: "Microsoft Yahei";
 ​
         }
         section{
             width: 1000px;
             margin:50px auto;
         }
         section h3{
             font-size:22px;
             font-weight: normal;
         }
 ​
         ul{
             border: 1px solid #999;
             background-color: #fff;
             display: flex;
             height:500px;
 ​
         }
 ​
         ul li{
             width: 200px;
             height: 200px;
             background: pink;
             margin:10px;
 ​
         }
 ​
         section:nth-child(1) ul{
             /* 侧轴对齐方式 :从侧轴开始的方向对齐*/
             align-items:flex-start;
         }
 ​
         section:nth-child(2) ul{
             /* 侧轴对齐方式 :从侧轴结束的方向对齐*/
             align-items:flex-end;
         }
 ​
         section:nth-child(3) ul{
             /* 侧轴对齐方式 :居中*/
             align-items:center;
         }
 ​
         section:nth-child(4) ul{
             /* 侧轴对齐方式 :基线 默认同flex-start*/
             align-items:baseline;
         }
 ​
         section:nth-child(5) ul{
             /* 侧轴对齐方式 :拉伸*/
             align-items:stretch;
 ​
         }
 ​
         section:nth-child(5) ul li{
             height:auto;
         }
 ​
 ​
     </style>
 </head>
 <body>
 <section>
     <h3>侧轴的对齐方式:align-items :flex-start</h3>
     <ul>
         <li>1</li>
         <li>2</li>
         <li>3</li>
     </ul>
 </section>
 ​
 <section>
     <h3>侧轴的对齐方式:align-items:flex-end</h3>
     <ul>
         <li>1</li>
         <li>2</li>
         <li>3</li>
     </ul>
 </section>
 ​
 <section>
     <h3>侧轴的对齐方式:align-items:center</h3>
     <ul>
         <li>1</li>
         <li>2</li>
         <li>3</li>
     </ul>
 </section>
 ​
 <section>
     <h3>侧轴的对齐方式:align-itmes:baseline</h3>
     <ul>
         <li>1</li>
         <li>2</li>
         <li>3</li>
     </ul>
 </section>
 ​
 <section>
     <h3>侧轴的对齐方式:align-itmes: stretch</h3>
     <ul>
         <li>1</li>
         <li>2</li>
         <li>3</li>
     </ul>
 </section>
 </body>
 </html>

flex属性:设置子盒子的权重

代码演示:

 <!DOCTYPE html>
 <html>
 <head lang="en">
     <meta charset="UTF-8">
     <title></title>
     <style>
         *{
             margin: 0;
             padding: 0;
             list-style:none;
         }
         body{
             background-color: #eee;
             font-family: "Microsoft Yahei";
 ​
         }
         section{
             width: 1000px;
             margin:50px auto;
         }
         section h3{
             font-size:22px;
             font-weight: normal;
         }
 ​
         ul{
             border: 1px solid #999;
             background-color: #fff;
             display: flex;
 ​
         }
 ​
         ul li{
             width: 200px;
             height: 200px;
             background: pink;
             margin:10px;
 ​
         }
 ​
         section:nth-child(1) ul li:nth-child(1){
             flex:1;
         }
 ​
         section:nth-child(1) ul li:nth-child(2){
             flex:1;
         }
 ​
         section:nth-child(1) ul li:nth-child(3){
             flex:8;
         }
 ​
         section:nth-child(2) ul li:nth-child(1){
 ​
         }
 ​
         section:nth-child(2) ul li:nth-child(2){
             flex:1;
         }
 ​
         section:nth-child(2) ul li:nth-child(3){
            flex:4;
         }
 ​
 ​
     </style>
 </head>
 <body>
 <section>
     <h3>伸缩比例:flex</h3>
     <ul>
         <li>1</li>
         <li>2</li>
         <li>3</li>
     </ul>
 </section>
 ​
 <section>
     <h3>伸缩比例:flex</h3>
     <ul>
         <li>1</li>
         <li>2</li>
         <li>3</li>
     </ul>
 </section>
 ​
 ​
 </body>
 </html>

相关链接

CSS Flexbox 可视化手册

可视化的截图如下:(请点开链接,查看大图)

http://img.smyhvae.com/20190821_2101.png

相关文章:

  • 【英文原版】 CSS Flexbox Fundamentals Visual Guide:https://medium.com/swlh/css-flexbox-fundamentals-visual-guide-1c467f480dac

  • 【中文翻译】CSS Flexbox 可视化手册:CSS Flexbox 可视化手册 - 知乎

flex 相关的推荐文章

  • flex 效果在线演示:https://demos.scotch.io/visual-guide-to-css3-flexbox-flexbox-playground/demos/

  • A Complete Guide to Flexbox | 英文原版:A Complete Guide to Flexbox | CSS-Tricks - CSS-Tricks

  • CSS3 Flexbox 布局完全指南 | 中文翻译:https://www.html.cn/archives/8629

flex 相关的教程

  • 后盾人 flex 教程

技巧:使用 margin 自动撑满剩余空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504485.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

笔记: JavaSE day16笔记 - string字符串

第十六天课堂笔记 学习任务 Comparable接口★★★★ 接口 : 功能的封装 > 一组操作规范 一个抽象方法 -> 某一个功能的封装多个抽象方法 -> 一组操作规范 接口与抽象类的区别 1本质不同 接口是功能的封装 , 具有什么功能 > 对象能干什么抽象类是事物本质的抽象 &…

学习刷题-14

3.29 贪心算法 跳跃游戏 II 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 贪心的思路&#xff0c;局部最优&#xff1a;当前可移动距离尽可能多…

Redis 常见数据结构及命令

目录 一.Redis常见的数据结构 二.Redis数据结构对应的命令 1.String类型 2.Hash类型 3.List类型 4.Set类型 5.Sorted Set类型 一.Redis常见的数据结构 Redis支持多种数据结构&#xff0c;包括字符串&#xff08;string&#xff09;、哈希&#xff08;hash&#xff09;、…

B端:甲方吐槽界面丑,少反驳,气势能得100分,体验永远0分

2023-10-24 10:20贝格前端工场 甲方吐槽B端系统界面丑陋时&#xff0c;作为设计师或开发者&#xff0c;我们不应该立即反驳或争辩。相反&#xff0c;我们应该以积极的态度倾听甲方的意见&#xff0c;并采取以下措施&#xff1a; 理解甲方需求&#xff1a; 首先要理解甲方对界…

二维码门楼牌管理应用平台建设:一扫即知,智慧生活新篇章

文章目录 前言一、二维码门楼牌管理的创新之处二、二维码门楼牌管理应用平台的实际应用三、二维码门楼牌管理应用平台的未来展望 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台应运而生&#xff0c;为城市管理和居民生活带来了极大的便利。只需轻轻一扫&a…

CentOS7 磁盘相关的命令及磁盘重新调整分配

umount 在CentOS 7中&#xff0c;umount是一个常用的命令&#xff0c;用于卸载文件系统。以下是一些常用的umount命令&#xff1a; 卸载指定的文件系统&#xff1a; umount /dev/sdXN 其中&#xff0c;/dev/sdXN是你想要卸载的分区。例如&#xff0c;/dev/sda1。 卸载并…

传参的指针,你的值到底变了没?!(有关函数形参修改的另类案例)

我们都知道&#xff0c;想要在函数中修改某个变量的值&#xff0c;传变量本身是没有用的。原因在于不同的函数在不同的空间上&#xff0c;函数的生命周期随着函数的调用而结束&#xff0c;因此在函数内部进行的值操作是不会对函数外的变量产生影响的。所以在函数里面想要修改变…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月31日,星期日

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年3月31日 星期日 农历二月廿二 1、 医保局&#xff1a;北京、广西、内蒙古、甘肃已将辅助生殖纳入医保报销。 2、 百日咳卷土重来&#xff0c;今年已有13人死亡&#xff0c;医生提醒&#xff1a;久咳不愈要警惕。 3、 上海…

亚马逊云科技—云从业者认证考试限时 50% 折扣优惠 限量提供, 先到先得!

亚马逊云科技云从业者认证&#xff08;AWS Certified Cloud Practitioner&#xff09;作为全球热门的云基础认证, 对于寻求基础云知识的开发者、专业人士、学生, 以及没有技术背景的职场人士来说, 都是进阶亚马逊云认证之旅的良好起点并助您进一步提升职场竞争力&#xff01; 与…

Spring IoCDI(3)

DI详解 接下来学习一下依赖注入DI的细节. 依赖注入是一个过程, 是指IoC容器在创建Bean时, 去提供运行时所依赖的资源, 而资源指的就是对象. 在之前的案例中, 使用了Autowired这个注解, 完成了依赖注入这个操作. 简单来说, 就是把对象取出来放到某个类的属性中. 在一些文章中…

上市公司-劳动投资效率数据集-Abresid 含原始数据及处理代码(2020-2022年)

01、数据简介 劳动投资效率是指企业在进行劳动力投资时所获得的效益程度。简单来说&#xff0c;它衡量了企业对于人力资源的投入与产出之间的比率&#xff0c;反映了企业在人力资源管理方面的效果和效率。 Abresid是劳动投资效率的测度指标&#xff0c;它来源于某个回归模型的…

Vmware下减小Ubuntu系统占用系统盘大小

1、虚拟机设置下占用空间 如图&#xff0c;给虚拟机分配了120GB&#xff0c;已经占用116.9GB&#xff0c;开机会提示空间不足。 2、实际使用空间 ubuntu系统下使用“df -h”命令查看实际使用空间大小50GB左右 造成这个原因是&#xff0c;虚拟机的bug&#xff1a;在虚拟机的ub…

【PHP编程使用UI框架】——GET和POST的请求方法

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

详解 Java多线程带来的的风险-线程安全

目录 一、什么是线程安全&#xff1f; 二、线程不安全的原因 1、线程调度是随机的 2、修改共享数据&#xff1a;多个线程修改同⼀个变量 3、原⼦性 ​编辑 &#xff08;1&#xff09;什么是原⼦性 &#xff08;2&#xff09;⼀条 java 语句不⼀定是原⼦的&#xff0c;也不⼀定…

【转移表】

文章目录 一、函数指针数组1.什么事函数指针数组2.函数指针数组如何定义 二、转移表结束语 一、函数指针数组 1.什么事函数指针数组 在我们学习函数指针数组前&#xff0c;大家可以一起回顾一下我们以前学习的指针和数组。 数组指针 数组指针是指指向数组的指针。 int arr…

每日五道java面试题之springboot篇(四)

目录&#xff1a; 第一题. Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?第二题. 微服务中如何实现 session 共享 ?第三题. Spring Boot 中如何实现定时任务 ?第四题. 运行 Spring Boot 有哪几种方式&#xff1f;第五题. 开启 Spring Boot 特性有哪几种方式&#xff1f…

MySQL - 高阶语句(一)

先准备一张表 create table class1 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));insert into class1 values(1,liuyi,80,beijing,2); insert into class1 values(2,wangwu,90,shengzheng,2); insert into class1 …

Linux是怎么发送一个网络包的?

目录 摘要 1 从 send 开始 2 传输层 3 网络层 4 网络接口层 4.1 邻居子系统 4.2 网络设备子系统 4.3 软中断发送剩余的 skb 4.4 硬中断又触发软中断 总结 摘要 一个网络包的发送&#xff0c;始于应用层&#xff0c;经层层协议栈的封装&#xff0c;终于网卡。今天来循…

【C语言】贪吃蛇【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏说明&#xff1a; 一个基于C语言链表开发的贪吃蛇游戏&#xff1a; 1. 按方向键上下左右&#xff0c;可以实现蛇移动方向的改变。 2. 短时间长按方向键上下左右其中之一&#xff0c;可实现蛇向该方向的短时间…

AndroidStudio出现类似 Could not create task ‘:app:ToolOperatorDemo.main()‘. 错误

先看我们的报错 翻译过来大概意思是:无法创建任务:app:ToolOperatorDemo.main()。 没有找到名称为“main”的源集。 解决方法&#xff1a; 在.idea文件夹下的gradle.xml文件中 <GradleProjectSettings>标签下添加<option name"delegatedBuild" value"f…