CSS-布局-flex

CSS3 新增了弹性盒子模型( Flexible Box 或 FlexBox ),是一种新的用于在 HTML 页面实现布局的方式。使得 HTML 页面适应不同尺寸的屏幕和不同的设备时,元素是可预测地运行。

基本概念

  • 容器:使用 display:flexdisplay:inline-flex 声明的元素,称为 Flex 容器(flex container),简称 容器
  • 项目容器 中所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称 项目
  • 主轴:项目沿其一次排列的轴被称为 主轴
  • 侧轴:垂直于主轴的轴被称为 侧轴

容器的属性

  • flex-direction
    • 定义了 主轴 的方向
      • 🌟row:主轴为水平方向,起点在左端(默认
      • row-reverse:主轴为水平方向,起点在右端
      • column:主轴为垂直方向,起点在上沿
      • column-reverse:主轴为垂直方向,起点在下沿
  • flex-wrap
    • 默认情况,所有项目会在一行显示,如需换行,使用 flex-wrap
      • 🌟nowrap:不换行(默认
      • wrap:换行,第一行在上方
      • wrap-reverse:换行,第一行在下方
  • flex-flow
    • 该属性是 flex-directionflex-wrap 的简写,默认值row nowrap,水平排列,不换行。
  • justify-content
    • 定义了项目沿着 主轴线 的对齐方式
      • flex-start: 项目左对齐(默认
      • flex-end: 项目右对齐
      • 🌟center: 项目居中对齐
      • space-between: 项目两端对齐,容器首尾不留距离,项目之间的间隔都相等
      • space-around: 项目两端对齐,容器首尾留有距离
  • align-items适用于不换行的情况
    • 定义了项目所在 侧轴线 的对齐方式
      • flex-start: 侧轴 起点对齐,如果 flex-direction:row,则项目顶部对齐
      • flex-end: 侧轴 终点对齐,如果 flex-direction:row,则项目尾部对齐
      • 🌟center: 项目居中对齐
      • baseline: 项目的 第一行文字的基线 对齐
      • stretch: 如果项目 未设置高度 或者 设为auto,拉伸与容器同高(默认
  • align-content多行情况时适用
    • 定义了项目所在侧轴线的对齐方式
      • flex-start: 侧轴 起点对齐
      • flex-end: 侧轴 终点对齐
      • 🌟center: 侧轴 居中对齐
      • space-between: 两端对齐,容器首尾不留距离
      • space-around: 两端对齐,容器首尾留有距离
      • stretch: 如果项目 未设置高度 或者 设为auto,拉伸与容器同高(默认

项目属性

  • order:项目的排列顺序
    • 数值越小,排列越靠前,可以为负值
      • order:0,保持项目原来的位置(默认
  • flex-grow(扩大):定义项目的放大比例
    • 默认为0:如果容器存在剩余空间,保持原大小,不放大
    • 项目 flex-grow 属性都为 1:项目平均分配剩余空间
    • 某个项目 flex-grow 属性为 2,其他项目都为 1,那么为 2 的项目宽度为 1 的 2 倍
  • flex-shrink(缩小):定义项目的缩小比例
    • 默认为1:如果容器空间不足,项目缩小
    • 项目 flex-shrink 属性都为 1,当容器空间不足时,所有项目等比缩小
    • 某个项目 flex-shrink 属性为 0,其他项目都为 1,当容器空间不足时,为 0 的项目不缩小
  • flex-basis在分配空间之前,项目的主轴空间,相当于我们设置的 width
    • 默认值:auto,保持项目的本来大小,不作任何宽度改变
    • 可以定义项目的宽度(如200px)
    • 也可以设置 flex-basis:10%,将占据空间的10%
  • flex(常用)flex-grow flex-shrink flex-basis 的缩写
    • 默认值:0 1 auto,不放大,但缩小;
    • auto(1 1 auto):等分放大缩小
    • none(0 0 auto):不放大,不缩小
    • 🌟flex:1 (1 1 0%):相当于只设置了 flex-grow
    • 三者区别见 📖 flex:1、flex:auto区别
  • align-self:定义项目在侧轴的对齐方式。该属性可覆盖 align-items 属性。
    • 允许单个项目与其他项目不一样的对齐方式,可覆盖 align-items 属性。
    • 默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch
    • flex-start | flex-end | center | baseline | stretch 与 align-items 属性完全一致

📖 flex布局小案例

css 中 div 宽度和高度

在 CSS 中,div 元素的默认宽度是它父元素的 100%默认高度是 0,因为 div 是块级元素。如果没有设置高度,div的高度将仅受内容影响。如果内容是内联元素,由 line-height 决定高度。

如果你想设置 div 的默认高度和宽度,你可以在 CSS 中指定它们。例如:

div {
  width: 200px; /* 设置宽度为200像素 */
  height: 100px; /* 设置高度为100像素 */
}

如果你想让 div 的高度和宽度根据其内容自动调整,你可以使用 width 和 height 属性的值 auto:

div {
  width: auto; /* 宽度根据内容自动调整 */
  height: auto; /* 高度根据内容自动调整 */
}

Flex弹性盒子尺寸特点

align-items、align-self

align-items 默认值是 stretch,如果项目 未设置高度 或者设为 auto拉伸与容器同高align-self默认值是 auto,继承父元素的 align-items 属性,也可以单独为项目设置属性。

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>侧轴对齐方式</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
 
        .box {
            display: flex;
			width: 400px;
            height: 200px;
            border: 1px solid #000;
        }
 
        .box div {
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
 
<body>
    <div class="box">
        <div>1</div>
        <div>2</div>
        <div>3</div>
    </div>
</body>
 
</html>
  • 父容器有高度,子项目有宽度、有高度:子项目宽度=设置宽度,高度=设置高度
  • 父容器有高度,子项目有宽度、无高度:子项目宽度=设置宽度,高度=在侧轴拉伸到和父容器一样高
  • 父容器有高度,子项目无宽度、有高度:子项目宽度=内容的宽度,高度=设置高度
  • 父容器有高度,子项目无宽度、无高度:子项目宽度=内容的宽度,高度=在侧轴拉伸到和父容器一样高

在这里插入图片描述

设置 align-items:center,如果项目未设置高度或者设为auto高度为内容的高度

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>侧轴对齐方式</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
 
        .box {
            display: flex;
			width: 400px;
            height: 200px;
            border: 1px solid #000;
			align-items:center;
        }
 
        .box div {
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
 
<body>
    <div class="box">
        <div>1</div>
        <div>2</div>
        <div>3</div>
    </div>
</body>
 
</html>
  • 父容器有高度,子项目有宽度、有高度:子项目宽度=设置宽度,高度=设置高度
  • 父容器有高度,子项目有宽度、无高度:子项目宽度=设置宽度,高度=内容的高度
  • 父容器有高度,子项目无宽度、有高度:子项目宽度=内容的宽度,高度=设置高度
  • 父容器有高度,子项目无宽度、无高度:子项目宽度=内容的宽度,高度=内容的高度

在这里插入图片描述

flex-grow、flex-shrink

设置 flex: 1;,子项目宽度会等分放大缩小。

<style>
    * {
        margin: 0;
        padding: 0;
    }

    .box {
        display: flex;
		width: 400px;
        height: 200px;
        border: 1px solid #000;
    }

    .box div {
        width: 100px;
        height: 100px;
        background-color: pink;
		flex: 1;
    }
</style>

在这里插入图片描述

📌 引申:

处理内容溢出:
overflow: hidden 隐藏超出范围

登录页面

<!DOCTYPE html>
<html>
<head>
    <title>vue</title>
	<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<style>
#app {
  height: 98vh; 
  display: flex; 
  justify-content:center; 
  align-items:center; 
  background-color: #0f9876;
}
.mainBox {
  width: 50%;
  display: flex;
  background-color: white;
  border-radius: 5px;
  overflow: hidden;
}
.imgBox {
  flex: 1;
}
.loginBox {
  flex: 1;
  display: flex;
  justify-content:center;
  align-items:center;
}
</style>
<body>
 <div id="app">
	<div class="mainBox">
		<div class="imgBox">  
			<img src="F:\login.jpg" alt="" style="width: 100%; height: 100%;" >
		</div>
		<div class="loginBox" >
			<el-form :model="user" style="width: 80%;">
				<div style="font-size: 20px; font-weight: blod; text-align:center; margin-bottom: 20px;"> 欢迎登录后管管理系统 </div>
				<el-form-item prop="username">
                  <el-input prefix-icon="el-icon-user" size="medium" v-model="user.username" placeholder="请输入账号"></el-input>
                </el-form-item>
				<el-form-item prop="password">
                  <el-input prefix-icon="el-icon-lock" size="medium" show-password v-model="user.password" placeholder="请输入密码"></el-input>
                </el-form-item>
				<el-form-item>
                  <el-button type="primary" style="width: 100%;"> 登 录 </el-button>
                </el-form-item>
				<div style="display: flex" >
					<div style="flex: 1">还没有账号?请 <span style="color: #0f9876; cursor: pointer">注册</span></div>
					<div style="flex: 1; text-align:right;"><span style="color: #0f9876; cursor: pointer">忘记密码</span></div>
				</div>
			</el-form>
		</div>
	</div>
 </div>
</body>
<script>
var vm = new Vue({
    el: "#app",
    data: {
        user: {
			username: "",
			password: ""
		}
    },
    methods: {
        leftClick: function() {
            this.num--;
        },
        rightClick: function() {
            this.num++;
        }
    }
});
</script>
</html>

在这里插入图片描述
在这里插入图片描述

### CSS Flex布局中的`flex-basis` #### `flex-basis`定义 `flex-basis`用于设置或检索弹性盒模型对象子元素的初始主轴空间。它指定了在分配多余的空间之前,项目占据的默认大小[^2]。 #### 默认行为 当未指定`flex-basis`时,默认值为`auto`,这意味着项目的尺寸由其内容决定。如果设置了具体的宽度或其他尺寸,则会按照设定值来计算基础尺寸[^1]。 #### 实际应用案例 下面是一个简单的例子展示如何利用`flex-basis`控制容器内项目的起始宽度: ```css .container { display: flex; } .item1 { background-color: lightblue; flex-basis: 100px; /* 设定item1的基础宽度 */ } .item2 { background-color: pink; flex-basis: 20%; /* 可以使用百分比 */ } ``` 在这个实例里,`.item1`将拥有固定的100像素宽作为它的基本宽度;而`.item2`则依据父级容器总宽度的百分之二十来进行初始化显示[^3]。 #### 结合其他属性一起工作 通常情况下,`flex-basis`不会单独作用,而是与其他两个属性——`flex-grow`和`flex-shrink`配合起来形成完整的`flex`声明语句。这允许更灵活地调整各个项之间的相对比例以及它们应对可用空间变化的方式。 例如,在一个具有多个相同类名 `.box` 的 div 中: ```css .box { flex: 1 1 200px; /* grow shrink basis */ } ``` 这里表示每个盒子都有相同的增长因子(`grow`)、收缩因子(`shrink`),并且都尝试保持至少200px的基本宽度(`basis`)。如果有额外空间的话,这些盒子将会均匀扩展填充整个行[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会叫的狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值