CSS——弹性盒子布局(display: flex)

news2024/9/20 17:59:49

CSS——弹性盒子布局(display: flex)

我们经常听说一种布局:Flexbox或者是弹性布局,它的全称叫做弹性盒子布局(Flexible Box Layout),那么它到底该如何实现呢?从我们熟悉的 display 属性开始。给元素添加 display: flex,该元素变成了一个弹性容器(flex container),它的直接子元素变成了弹性子元素(flex item)。那么最简单的弹性盒子布局就完成了,它具有以下的效果:

  • 弹性容器像块元素一样填满可用宽度(注意,这里只是弹性容器,即添加了display: flex的元素),高度由自身内容决定,但是弹性子元素不一定填满其弹性容器的宽度。
  • 弹性子元素默认是在同一行按照从左到右的顺序并排排列。
  • 弹性子元素高度相等,该高度由它们的内容决定。

当然,我们可以手动的设置它们的宽高,但是在Flexbox布局中,弹性是其最突出的属性,所有一般我们不建议这样做。在大致了解了它最显著的作用之后,下面我们来进行细致深入的学习。

基础概念

Flexbox布局中,有两根重要的轴线——主轴&副轴,其属性几乎都是围绕着这两根轴线来描述的。默认情况下,主轴是水平的,它的起点为最左侧,终点为最右侧,对应的,有一根与之垂直相交的副轴,它的起点是最上侧,终点是最下侧。当然,这些方向可以改变,我们稍后介绍。
在这里插入图片描述

相关属性

  1. flex-direction
    作用:决定主轴的方向(弹性子元素的排列方向)

    • row(默认值):水平,起始在左端
    • row-reverse:水平,起始在右端
    • column:竖直,起始在上沿
    • column-reverse:竖直,起始在下沿
      在这里插入图片描述
  2. flex-wrap
    作用:决定直接子元素是否换行以及如何换行

    • nowrap(默认):不换行
    • wrap:换行,第一行在上方
    • wrap-reverse:换行,第一行在下方
      在这里插入图片描述
  3. flex-flow
    作用:前面两个属性的简写,默认值为 row nowrap

  4. justify-content
    作用:决定弹性子元素在主轴上的对齐方式

    • flex-start(默认值):左对齐
    • flex-end:右对齐
    • center:居中
    • space-between:两端对齐,弹性子元素之间的间隔相等
    • space-around:弹性子元素两侧的间隔相等,相邻之间的间隔会叠加
      在这里插入图片描述
  5. align-content
    作用:决定多行/列弹性子元素在交叉轴上的的对齐方式 (前提是要开启flex-wrap)

    • stretch(默认值):每行元素将会被拉伸,直至撑满整个交叉轴,每行/列之间的间隔相等
    • flex-start:与交叉轴起点对齐
    • flex-end:与交叉轴终点对齐
    • center:在交叉轴上居中对齐
    • space-between:与交叉轴两端对齐,弹性子元素之间的间距相等
    • space-around:弹性子元素两侧的间隔相等,相邻之间的间隔会叠加
      在这里插入图片描述
  6. flex-items
    作用:决定单行/列弹性子元素在交叉轴上的对齐方式

    • stretch(默认值):如果没有设置高度/高度设置为auto,那么将撑满整个盒子
    • flex-start、flex-end、center属性值的效果同上
    • baseline:项目的第一行文字的基线对齐(效果如下,紫色是盒子)
      在这里插入图片描述
  7. flex-basis
    作用:指定子元素未受flex-grow或flex-shrink影响时的初始大小
    取值:<length>或<percent>,初始值是auto(此时会检查元素是否设置了width属性。如果有,则使用 width 的值作为 flex-basis 的值;如果没有,则用元素内容自身的大小。如果 flex-basis 的值不是 auto,width 属性会被忽略)

  8. flex-grow
    作用:每个弹性子元素的 flex-basis 值计算出来后,它们(加上子元素之间的外边距)加起来会占据一定的宽度。加起来的宽度不一定正好填满弹性容器的宽度,可能会有留白。多出来的留白(或剩余宽度)会按照 flex-grow(增长因子)的值分配给每个弹性子元素。
    取值:非负,初始值是0(此时元素的宽度不会超过flex-basis的宽度,不参与分配)
    示例:flex-grow 的值越大,元素的“权重”越高,也就会占据更大的剩余宽度。一个 flex-grow: 2 的子元素增长的宽度为 flex-grow: 1 的子元素的两倍,如下图:
    在这里插入图片描述

  9. flex-shrink
    作用: flex-shrink 属性与 flex-grow 遵循相似的原则。计算出弹性子元素的初始主尺寸后,它们的累加值可能会超出弹性容器的可用宽度。如果不用 flex-shrink,就会导致溢出,每个子元素的 flex-shrink 值代表了它是否应该收缩以及相应的收缩比例以防止溢出。(在开启了flex-wrap之后会忽略此属性)
    取值:非负,初始值为1(为 0 时,不会缩小)

    效果

    • 如果元素A的flex-shrink为0,而其他的元素都为0,那么A不会缩小
    • 如果元素A的flex-shrink为2,元素B的flex-shrink为1,那么A的缩小的部分的长度是B的缩小部分的长度的2倍
      在这里插入图片描述

    示例:如下图:
    在这里插入图片描述
    代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>flex-shrink缩放</title>
  <style>
    * {
      padding: 0;
      margin: 0;
      box-sizing: border-box;
    }

    body {
      padding: 1em;
    }

    #content {
      display: flex;
      width: 500px;
    }

    #content div {
      flex-basis: 120px;
      border: 3px solid rgba(0, 0, 0, 0.2);
    }

    .box {
      flex-shrink: 2;
    }

    .box1 {
      flex-shrink: 1;
    }

    .result {
      margin-top: 20px;
    }

    p {
      line-height: 1.5em;
    }
  </style>
</head>

<body>
  <p>容器宽度为 500px, 弹性子元素的flex-basic 是120px</p>
  <p>A, B, C 设置 flex-shrink:2, D 和 E 设置 flex-shrink:1</p>
  <p>根据js打印输出可知,A、B、C缩小的长度是D、E缩小长度的2倍</p>
  <div id="content">
    <div class="box" id="A" style="background-color:red;">A</div>
    <div class="box" style="background-color:lightblue;">B</div>
    <div class="box" style="background-color:yellow;">C</div>
    <div class="box1" id="D" style="background-color:brown;">D</div>
    <div class="box1" style="background-color:lightgreen;">E</div>
  </div>

  <div class="result"></div>
  <script>
    const A = document.getElementById("A");
    const A_width = getComputedStyle(A).width;
    const D = document.getElementById("D");
    const D_width = getComputedStyle(D).width;
    const content = document.getElementById("content");
    const content_width = getComputedStyle(content).width;
    const result = document.querySelector(".result");
    result.innerHTML = `A, B, C 缩放之后的长度是${A_width},<br />
    E缩放之后的长度是${D_width}, <br />
    容器宽度是${content_width}`
  </script>

</body>

</html>
  1. flex
    作用flex-growflex-shrinkflex-basis三个属性的简写
    取值

    • 单值语法:值必须是以下之一:
      • 一个 <flex-grow> 的有效值:此时简写会扩展为 flex: <flex-grow> 1 0
      • 一个<flex-basis>的有效值:此时简写会扩展为 flex: 1 1 <flex-basis>
      • 关键字 none 或者全局关键字(见后面)之一。
    • 双值语法
      • 第一个值必须是一个 flex-grow 的有效值。
      • 第二个值必须是以下之一:
        • 一个 flex-shrink的有效值:此时简写会扩展为 flex: <flex-grow> <flex-shrink> 0
        • 一个 flex-basis 的有效值:此时简写会扩展为 flex: <flex-grow> 1 <flex-basis>
    • 三值语法:值必须按照以下顺序指定:
      • 一个 flex-grow 的有效值。
      • 一个 flex-shrink 的有效值。
      • 一个 flex-basis 的有效值。

    全局关键字

    • initial
      元素会根据自身宽高设置尺寸。它会缩短自身以适应 flex 容器,但不会伸长并吸收 flex 容器中的额外自由空间来适应 flex 容器。相当于将属性设置为"flex: 0 1 auto"。

    • auto
      元素会根据自身的宽度与高度来确定尺寸,但是会伸长并吸收 flex 容器中额外的自由空间,也会缩短自身来适应 flex 容器。这相当于将属性设置为 “flex: 1 1 auto”.

    • none
      元素会根据自身宽高来设置尺寸。它是完全非弹性的:既不会缩短,也不会伸长来适应 flex 容器。相当于将属性设置为"flex: 0 0 auto"。

    注意

    • flex属性与以往的简写属性不同,推荐使用简写形式,因为这样可以尽可能避免多次分开书写导致的布局不一致,并且可以提高对浏览器的兼容性。

    • <'flex-grow'>
      定义 flex 项目的 flex-grow 。负值无效。省略时默认值为 1。 (初始值为 0)

    • <'flex-shrink'>
      定义 flex 元素的 flex-shrink 。负值无效。省略时默认值为1。 (初始值为 1)

    • <'flex-basis'>
      定义 flex 元素的 flex-basis 属性。若值为0,则必须加上单位,以免被视作伸缩性。省略时默认值为 0。(初始值为 auto)

    简记采用逻辑推断的方法,初始值肯定会从安全性的角度考虑,所以,元素尽量不要随意放大,所以flex-grow属性初始为0;容器会尽量容纳下所有的元素,所以flex-shrink属性初始值为1;为了以元素自身为主导,flex-basis初始值为auto。而所谓的默认值,是在flex简写的写法中被省略时补充的值,以上规则能够体现出来。

  2. order
    作用:将弹性子元素从兄弟节点中移动到指定位置,覆盖源码顺序,值越小,位置越靠前
    取值:整数,初始值是0
    注意:慎重使用,因为视觉布局与源码顺序差别太大会影响网站的可访问性。在大多数浏览器里使用 Tab 键浏览元素的顺序与源码保持一致,如果视觉上差别太大就会令人困惑。视力受损的用户使用的大部分屏幕阅读器也是根据源码的顺序来的。

  3. align-self
    作用:跟弹性容器的 align-items 属性效果相同,但是它能单独给弹性子元素设定不同的对齐方式。
    取值与效果:auto 为初始值,会以容器的 align-items 值为准。其他值会覆盖容器的设置。align-self属性支持的关键字与 align-items 一样:flex-start、flex-end、center、stretch 以及 baseline。

结尾

感谢大家支持,如有错误,恳请指出,希望与大家共同进步!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM World:轻松驾驭大模型价格

当今&#xff0c;人工智能蓬勃发展&#xff0c;大模型的应用也如繁星般不断涌现。 大模型提供商为了在竞争激烈的市场中脱颖而出并获取最大利润&#xff0c;往往采用复杂的差异化定价策略。不同的功能模块、使用场景&#xff08;如企业级应用、科研用途、小型创业公司试用等&a…

数据结构-2.8.单链表的建立

一.尾插法建立单链表&#xff1a;取数据元素插入单链表表尾 1.图解&#xff1a; 对于时间复杂度&#xff0c;最好的时间复杂度是第一次&#xff0c;因为此时内层循环即找第i-1个结点就不执行了(不满足j<i-1)&#xff0c; 内层循环和外层循环时间复杂度都是O(n)&#xff0c…

devops的道法术器

devops的道法术器 道、法、术、器自上而下是系统思考的层次&#xff0c;自下而上是解决问题的层次 “道”是目标、价值观&#xff0c;对价值的定位。 快速交付价值&#xff0c;灵活响应变化&#xff0c;这是从价值层面的追求&#xff0c;或者是从第一性原理的角度来讲&#xf…

相亲交友系统 现代爱情的导航仪

在这个数字化的时代&#xff0c;人们的生活方式发生了翻天覆地的变化&#xff0c;其中最显著的变化之一便是交友方式的转变。编辑h17711347205随着社会节奏的加快&#xff0c;越来越多的人选择通过相亲交友系统来寻找人生伴侣。相亲交友系统不仅简化了传统的交友流程&#xff0…

pig4cloud自定义SecurityFilterChain、Filter

1. 环境 SpringBoot版本&#xff1a;2.7.16 SpringSecurity版本&#xff1a;5.7.11 pig4cloud版本&#xff1a;3.7.1-JDK8 2. 概述 pig4cloud也没有自定义SecurityFilterChain的实现&#xff0c;还是基于SpringSecurity去实现的。但是pig4cloud使用的SpringSecurity的5.7.…

鸿蒙手势交互(四:多层手势)

四、多层手势 指父子组件嵌套时&#xff0c;父子组件均绑定了手势或事件。有两种&#xff0c;一种默认多层级手势事件&#xff0c;一种自定义多层级手势事件。 默认多层级手势事件&#xff1a;需要分清两个概念&#xff0c;触摸事件&#xff0c;手势与事件 触摸事件&#xf…

MySQL数据库:掌握备份与恢复的艺术,确保数据安全无忧(二)

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 ​编辑 正…

springbootKPL比赛网上售票系统

基于springbootvue实现的KPL比赛网上售票系统 &#xff08;源码L文ppt&#xff09;4-068 4.2 系统结构设计 架构图是系统的体系结构&#xff0c;体系结构是体系结构体系的重要组成部分。KPL比赛网上售票系统的总体结构设计如图4-2所示。 图4-2 系统总体架构图 4.3数据…

【Java面向对象二】static(二)修饰成员方法的应用场景

文章目录 前言一、static修饰成员方法的应用场景二、使用例子三、工具类没有创建对象的需求&#xff0c;建议将工具类的构造方法进行私有总结 前言 记录学习过程中的工具类的使用。 一、static修饰成员方法的应用场景 1、类方法的常见应用场景 类方法最常见的应用场景是做工…

Java设计模式——工厂方法模式(完整详解,附有代码+案例)

文章目录 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现 5.3 工厂方法模式 针对5.2.3中的缺点&#xff0c;使用工厂方法模式就可以完美的解决&#xff0c;完全遵循开闭原则。 5.3.1概述 工厂方法模式&#xff1a;定义一个创建对象的接口&#xff08;这里的接口指的是工厂&…

01_WebRtc_一对一视频通话

文章目录 通话网页的设计客户端实现Web的API 服务端实现 2024-9-20 很久没有写博客啦&#xff0c;回顾总结这段时间的成果&#xff0c; 写下博客放松下&#xff08;开始偷懒啦&#xff09;主要内容&#xff1a;实现网页&#xff08;html&#xff09;打开摄像头并显示到页面需要…

泳池软管检测系统源码分享

泳池软管检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

C++: 使用红黑树模拟实现STL中的map和set

目录 1. 红黑树的迭代器和-- 2. 改造红黑树3. set的模拟实现4. map的模拟实现5. RBTree的改造代码 博客主页 : 酷酷学 正文开始 1. 红黑树的迭代器 迭代器的好处是可以方便遍历&#xff0c;是数据结构的底层实现与用户透明 打开C的源码我们可以发现, 其实源码中的底层大概如…

数据结构应试-树和二叉树

1. 2. 结点的度&#xff1a;结点拥有的子树数量称为结点的度 树的度&#xff1a;树内各结点度的最大值&#xff0c;即上图 D 结点的度就是此树的度 叶子&#xff1a;度为 0 的节点称为叶子或终端节点 结点的层次和树的深度 森林&#xff1a;m棵互不相交的树的集合。 3. 为啥…

司南 OpenCompass 九月大语言模型评测榜单启动召集,欢迎新合作厂商申请评测

主要概览 司南 OpenCompass 大语言模型官方自建榜单&#xff08;9 月榜&#xff09;评测拟定于 10 月上旬发布&#xff0c;现诚挚邀请新加入的合作方参与评测。本次评测围绕强化能力维度&#xff0c;全面覆盖语言、推理、知识、代码、数学、指令跟随、智能体等七大关键领域&am…

layui时间选择器选择周 日月季度年

<!-- layui框架样式 --><link type"text/css" href"/static/plugins/layui/css/layui.css" rel"stylesheet" /><!-- layui框架js --><script type"text/javascript" src"/static/plugins/layui/layui.js&qu…

【LeetCode】每日一题 2024_9_20 统计特殊整数(数位 DP)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;统计特殊整数 代码与解题思路 func countSpecialNumbers(n int) int { // 今天的题目是数位 DP&#xff0c;我不会做&#xff0c;所以现场学习了一下灵神的数位 DP 模版s : strconv.Itoa…

11个推特大V发文推广的数据分析技巧

社交媒体已经成为了现代社会中不可或缺的一部分&#xff0c;而推特作为其中的重要一员&#xff0c;吸引了许多用户。对于那些成千上万的粉丝拥有者&#xff08;也被称为“大V”&#xff09;&#xff0c;他们能够有效地利用推特平台&#xff0c;推广自己的观点和产品。我们将介绍…

让医院更智慧,让决策更容易

依托数字孪生技术&#xff0c;赋能智慧医院&#xff0c;对使用者和决策者带来了众多的优势。数字孪生技术是将物理实体与数字模型相结合&#xff0c;实现实时监测、仿真预测和智能决策的一种先进技术。在智慧医院中应用数字孪生技术&#xff0c;不仅可以提升医疗服务的质量和效…

阿里云容器服务Kubernetes部署新服务

这里部署的是前端项目 1.登录控制台-选择集群 2.选择无状态-命名空间-使用镜像创建 3.填写相关信息 应用基本信息&#xff1a; 容器配置&#xff1a; 高级配置&#xff1a; 创建成功后就可以通过30006端口访问项目了