display:flex css

本文详细介绍了Flex布局的使用方法及属性,通过实例展示了如何利用flex-grow、flex-shrink和flex-basis来实现元素的自适应布局。

本文介绍下flex的用法和属性

这个一个自适应的3列盒子

<div class="flex">
  <div style="background-color:red;">红色</div>
  <div style="background-color:blue;">蓝色</div>  
  <div style="background-color:green;">绿色</div>
</div>
<style>
.flex{ display: flex;}
.flex div{border: 1px solid #000; flex:auto; height: 100px;}
</style>

 

红色
蓝色
绿色

 

flex: flex-grow flex-shrink flex-basis|auto|initial|inherit;

flex主要带3个属性值

分别是flex-grow   规定项目将相对于其他灵活的项目进行扩展的量。

红色
蓝色
绿色

 

<div class="flex1">
  <div style="background-color:red;">红色</div>
  <div style="background-color:blue;">蓝色</div>  
  <div style="background-color:green;">绿色</div>

</div>
<style>
.flex1{ display: flex; width:400px;}
.flex1 div{border: 1px solid #000; flex:auto; height: 200px;}
.flex1 div:nth-child(1){-webkit-flex:1 0 100px;flex:1 0 100px;}
.flex1 div:nth-child(2){-webkit-flex:2 0 100px;flex:2 0 100px;}
.flex1 div:nth-child(3){-webkit-flex:3 0 100px;flex:3 0 100px;}
</style>

如上面的例子,当父容器的宽度大于子元素的宽度和的时候触发

因为设置了flex-basis为100px

flex的宽度为400px,里面的3个dom的总长度设置为300px;那么多了100的剩余宽度。

第一个子元素的扩展量:(1/(1+2+3))*100,即约等于16px;

第二个子元素的扩展量:(2/(1+2+3))*100,即约等于32px;

第三个子元素的扩展量:(3/(1+2+3))*100,即约等于48px;

 

 

 分别是flex-shrink 规定项目将相对于其他灵活的项目进行收缩的量。

红色
蓝色
绿色

 

<div class="flex2">
  <div style="background-color:red;">红色</div>
  <div style="background-color:blue;">蓝色</div>  
  <div style="background-color:green;">绿色</div>

</div>
<style>
.flex2{ display: flex; width:400px;}
.flex2 div{border: 1px solid #000; flex:auto; height: 100px;}
.flex2 div:nth-child(1){-webkit-flex:0 1 200px;flex:0 1 200px;}
.flex2 div:nth-child(2){-webkit-flex:0 2 200px;flex:0 2 200px;}
.flex2 div:nth-child(3){-webkit-flex:0 3 200px;flex:0 3 200px;}
</style>

如上面的例子,当父容器的宽度小于子元素的宽度和的时候触发

因为设置了flex-basis为200px

flex的宽度为400px,里面的3个dom的总长度设置为600px;那么少了200px的剩余宽度。

因为设定过收缩的量所以需要200*1+200*2+200*3=1200;

所以第1个子容器的宽度为200-(200*1/1200)*200=166px

所以第2个子容器的宽度为200-(200*2/1200)*200=134px

所以第3个子容器的宽度为200-(200*3/1200)*200=100px

 

 

 

当「flex-basis」在「flex」属性中不为0时(包括值为auto,此时伸缩基准值等于自身内容宽度),「flex子项」将分配容器的剩余空间(剩余空间即等于容器宽度减去各项的伸缩基准值)

当「flex-basis」在「flex」属性中等于0时,「flex子项」将分配容器的所有空间(因为各项的伸缩基准值相加等于0,剩余空间等于容器宽度减去各项的伸缩基准值,即减0,最后剩余空间值等于容器宽度),所以可以借助此特性,给各子项定义「flex: n」来进行按比例均分容器总宽度

 

 

  • 浅绿 = 支持
  • 红色 = 不支持
  • 粉色 = 部分支持
ValuesIEFirefoxChromeSafariOperaiOS SafariAndroid BrowserAndroid Chrome
Basic Support6.0-10.02.0-21.04.0-20.06.015.0+-webkit-6.0-6.12.1-4.318.0-19.0
11.0+22.0+21.0+-webkit-6.1+-webkit-17.0+7.0+-webkit-4.4+20.0+-webkit-
29.0+9.0+9.0+28.0+

 

转载于:https://www.cnblogs.com/youku/p/7085244.html

<think>我们正在回答用户关于CSS display:flex的问题。用户要求详细解释该属性的使用方法和布局效果。 根据引用内容,我们可以整理出以下要点: 1. display:flex用于创建一个弹性容器(flex container),其子元素成为弹性项目(flex items)。 2. 弹性布局的主要属性可以分为容器属性和项目属性。 3. 容器属性包括:flex-direction, flex-wrap, justify-content, align-items, align-content。 4. 项目属性包括:order, flex-grow, flex-shrink, flex-basis, flex(复合属性), align-self。 我们将按照以下结构组织回答: 一、弹性布局基本概念 二、容器属性详解 三、项目属性详解 四、常见布局场景示例 五、注意事项 注意:在回答中,我们将使用行内数学表达式(不需要,因为这里没有数学公式)和独立公式(同样不需要)。但需要按照要求使用$...$和$$...$$,但这里主要是CSS代码,所以用代码块展示。 同时,在回答末尾,我们会生成相关问题。 开始回答:</think>### CSS `display: flex` 属性详解与布局教程 #### 一、基本概念 `display: flex` 用于创建弹性布局容器,容器内的子元素自动成为**弹性项目(flex items)**,支持响应式排列和动态调整尺寸。核心特点: - **一维布局**:沿主轴(main axis)或交叉轴(cross axis)单方向排列。 - **自适应空间分配**:子元素可自动填充剩余空间或收缩避免溢出。 - **对齐控制**:灵活控制项目在容器内的对齐方式。 #### 二、容器属性详解(父元素) 1. **`flex-direction`**:定义主轴方向 ```css .container { flex-direction: row; /* 默认:水平排列(左→右) */ flex-direction: row-reverse; /* 反向水平(右→左) */ flex-direction: column; /* 垂直排列(上→下) */ flex-direction: column-reverse; /* 反向垂直(下→上) */ } ``` 2. **`flex-wrap`**:控制换行 ```css .container { flex-wrap: nowrap; /* 默认:不换行(可能溢出) */ flex-wrap: wrap; /* 换行(多行排列) */ flex-wrap: wrap-reverse; /* 反向换行 */ } ``` 3. **`justify-content`**:主轴对齐方式 ```css .container { justify-content: flex-start; /* 默认:左对齐 */ justify-content: flex-end; /* 右对齐 */ justify-content: center; /* 居中 */ justify-content: space-between; /* 两端对齐,项目间隔相等 */ justify-content: space-around; /* 项目两侧间隔相等 */ } ``` 4. **`align-items`**:交叉轴对齐(单行) ```css .container { align-items: stretch; /* 默认:拉伸填满容器高度 */ align-items: flex-start; /* 顶部对齐 */ align-items: flex-end; /* 底部对齐 */ align-items: center; /* 垂直居中 */ } ``` 5. **`align-content`**:多行对齐(需配合 `flex-wrap: wrap`) ```css .container { align-content: space-between; /* 多行两端对齐 */ align-content: center; /* 多行垂直居中 */ } ``` #### 三、项目属性详解(子元素) 1. **`flex-grow`**:分配剩余空间的比例 ```css .item { flex-grow: 1; } /* 默认0(不扩展),值越大占据空间越多 */ ``` 2. **`flex-shrink`**:空间不足时的收缩比例 ```css .item { flex-shrink: 1; } /* 默认1(可收缩),0表示不收缩 */ ``` 3. **`flex-basis`**:初始尺寸基准 ```css .item { flex-basis: 200px; } /* 类似width,但优先级更高 */ ``` 4. **`flex` 复合属性**(推荐) ```css .item { flex: 1; /* 等价于 flex: 1 1 0% */ flex: 0 0 200px; /* 不伸缩,固定宽度200px */ flex: 2 1 auto; /* 扩展比例2,可收缩,基准为内容宽度 */ } ``` 5. **`align-self`**:覆盖容器的交叉轴对齐 ```css .item { align-self: flex-end; } /* 单独控制该项目底部对齐 */ ``` #### 四、常见布局场景示例 1. **水平居中 + 垂直居中** ```css .container { display: flex; justify-content: center; /* 主轴居中 */ align-items: center; /* 交叉轴居中 */ } ``` 2. **三栏布局(两侧固定,中间自适应)** ```html <div class="container"> <div class="left">固定200px</div> <div class="middle">自适应宽度</div> <div class="right">固定200px</div> </div> ``` ```css .container { display: flex; } .left, .right { flex: 0 0 200px; } /* 不伸缩,固定200px */ .middle { flex: 1; } /* 占据剩余空间 */ ``` 3. **等高分栏** ```css .container { align-items: stretch; } /* 默认即等高 */ ``` 4. **响应式导航栏** ```css .nav { display: flex; flex-wrap: wrap; /* 小屏幕自动换行 */ } .nav-item { flex: 1; min-width: 100px; } /* 最小宽度防止过小 */ ``` #### 五、注意事项 1. **浏览器兼容性**:现代浏览器全面支持,IE10/11需前缀 `-ms-flex`。 2. **嵌套问题**:避免过度嵌套弹性容器,可能导致布局复杂化。 3. **性能优化**:`flex` 布局性能优于浮动,但大规模项目需注意 `align-content` 的计算开销。 > 引用说明:弹性布局通过主轴和交叉轴定义排列逻辑[^1],`flex` 复合属性简化了空间分配控制[^4],多行对齐需结合 `flex-wrap` 和 `align-content`[^2]。 --- ### 相关问题 1. `flex: 1` 和 `flex: auto` 有什么区别? 2. 如何实现 Flex 布局的响应式换行效果? 3. Flex 布局中 `align-items` 和 `align-content` 的区别是什么? 4. 在移动端使用 Flex 布局有哪些最佳实践? 5. Flex 布局与 Grid 布局应如何选择?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值