CSS中Flex布局应用实践总结

① 两端对齐

比如 要求ul下的li每行四个,中间间隔但是需要两段对齐,如下图所示:

这是除了基本的flex布局外,还需要用到:nth-of-type伪类来控制每行第一个与第四个的padding。

css 复制代码
.hl_list{
		width: 100%;
		display: flex;
		align-items: flex-start;
		flex-wrap: wrap;
		justify-content: space-between;
	}
	
	.ul_list .hl_list li{
		width: 25%;
		padding: 0 10px;
	}
	.ul_list .hl_list li:nth-of-type(4n+1){
		padding-left: 0;
	}
	.ul_list .hl_list li:nth-of-type(4n+4){
		padding-right: 0;
	}

② 单行截取多余的

css 复制代码
display: flex;
flex-wrap: nowrap;
overflow-x: hidden;

flex-wrap: nowrap;规定item不换行。
overflow-x: hidden;规定X轴的超出隐藏

③ 子元素宽度不变

父元素设置flex布局,需要保证某个子元素宽度不变,可以为子元素设置属性如下:

css 复制代码
flex-shrink: 0

子元素不设置 flex-shrink: 0 时子元素会随父元素宽度自动等分总宽度,子元素设置的宽度会自动失效

④ 两端对齐且间距一样且子元素宽度一样

要让一个 div 的四个子元素两端对齐,左右不留间距,且中间元素的间距一样,可以使用 CSS 的 Flexbox 布局。Flexbox 提供了一种简单而强大的方法来实现这种布局需求。

示例代码

HTML
html 复制代码
<div class="container">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
</div>
CSS
css 复制代码
.container {
    display: flex; /* 使用Flexbox布局 */
    justify-content: space-between; /* 子元素两端对齐,中间间距相等 */
    width: 100%; /* 容器宽度,可以根据需要调整 */
}

.item {
    flex-basis: 24%; /* 每个子元素占容器宽度的24%,留出1%的空间作为间隔 */
    box-sizing: border-box; /* 确保内边距和边框不会影响宽度计算 */
}

解释

  1. display: flex; :将 .container 设置为 Flexbox 布局。
  2. justify-content: space-between;:使子元素在主轴上两端对齐,中间的间距相等。
  3. width: 100%; :设置 .container 的宽度为100%,确保它占据整个可用空间。
  4. flex-basis: 24%;:每个子元素的初始宽度设置为容器宽度的24%,这样可以确保四个子元素加上中间的间隔总和为100%。
  5. box-sizing: border-box;:确保内边距和边框不会影响子元素的宽度计算。

注意事项

  • flex-basis: 24%; 是一个经验值,确保四个子元素加上中间的间隔总和为100%。如果你需要更精确的控制,可以调整这个值。
  • 如果你希望子元素之间有固定的间距,可以使用 gap 属性,但这会使得子元素的宽度不再是固定比例。

使用 gap 属性(可选)

如果你希望子元素之间有固定的间距,可以使用 gap 属性,但需要注意调整子元素的宽度以适应总宽度。

CSS
css 复制代码
.container {
    display: flex;
    justify-content: space-between;
    width: 100%;
    gap: 10px; /* 子元素之间的固定间距 */
}

.item {
    flex: 1; /* 子元素等分剩余空间 */
    max-width: calc(25% - 10px); /* 调整子元素的最大宽度,确保总和为100% */
    box-sizing: border-box;
}

解释

  1. gap: 10px;:设置子元素之间的固定间距为10像素。
  2. flex: 1;:使每个子元素等分剩余空间。
  3. max-width: calc(25% - 10px);:调整子元素的最大宽度,确保四个子元素加上中间的间隔总和为100%。

通过这些方法,你可以轻松地实现一个 div 的四个子元素两端对齐,左右不留间距,且中间元素的间距一样的布局。

⑤ 在④前提下增大间距

要在上述前提下增大子元素之间的间距,可以调整 flex-basis 的值或者使用 gap 属性。以下是两种方法的详细说明:

方法一:调整 flex-basis 的值

通过调整 flex-basis 的值,可以间接增大子元素之间的间距。例如,将 flex-basis 设置为22%,这样每个子元素的宽度会稍小一些,从而增加中间的间距。

HTML
html 复制代码
<div class="container">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
</div>
CSS
css 复制代码
.container {
    display: flex;
    justify-content: space-between;
    width: 100%;
}

.item {
    flex-basis: 22%; /* 调整子元素的宽度,减小每个子元素的宽度以增加间距 */
    box-sizing: border-box;
}

方法二:使用 gap 属性

使用 gap 属性可以直接设置子元素之间的间距。这种方法更直观,更容易控制间距的大小。

HTML
html 复制代码
<div class="container">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
</div>
CSS
css 复制代码
.container {
    display: flex;
    justify-content: space-between;
    width: 100%;
    gap: 20px; /* 设置子元素之间的间距为20像素 */
}

.item {
    flex: 1; /* 子元素等分剩余空间 */
    max-width: calc(25% - 20px / 3); /* 调整子元素的最大宽度,确保总和为100% */
    box-sizing: border-box;
}

解释

  1. gap: 20px;:设置子元素之间的间距为20像素。
  2. flex: 1;:使每个子元素等分剩余空间。
  3. max-width: calc(25% - 20px / 3); :调整子元素的最大宽度,确保四个子元素加上中间的间隔总和为100%。这里 20px / 3 是因为有三个间隔,每个间隔为20像素。

注意事项

  • calc(25% - 20px / 3):这个计算确保了子元素的宽度加上间隔的总和为100%。具体来说,每个子元素占用25%的宽度,减去每个间隔的平均值。
  • box-sizing: border-box;:确保内边距和边框不会影响子元素的宽度计算。

通过这两种方法,你可以灵活地调整子元素之间的间距,以满足你的布局需求。

相关推荐
小高00711 分钟前
面试官:npm run build 到底干了什么?从 package.json 到 dist 的 7 步拆解
前端·javascript·vue.js
天选打工圣体12 分钟前
个人学习笔记总结(四)抽离elpis并发布npm包
前端
JayceM1 小时前
Vue中v-show与v-if的区别
前端·javascript·vue.js
HWL56791 小时前
“preinstall“: “npx only-allow pnpm“
运维·服务器·前端·javascript·vue.js
德育处主任2 小时前
p5.js 掌握圆锥体 cone
前端·数据可视化·canvas
mazhenxiao2 小时前
qiankunjs 微前端框架笔记
前端
无羡仙2 小时前
事件流与事件委托:用冒泡机制优化前端性能
前端·javascript
秃头小傻蛋2 小时前
Vue 项目中条件加载组件导致 CSS 样式丢失问题解决方案
前端·vue.js
CodeTransfer2 小时前
今天给大家搬运的是利用发布-订阅模式对代码进行解耦
前端·javascript
睡不着先生2 小时前
`text-wrap: balance` 实战指南:让多行标题自动排版更优美
css