好用的Flex 与 Grid

本文深入讲解Flex布局,包括flex-direction、flex-wrap、justify-content等属性的使用,以及flex-grow、align-self等项目的特性,帮助读者掌握弹性盒模型的精髓。

Flex篇

FLex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。

任何一个容器都可指定为flex布局,无论是块级元素还是内联元素。

	.box{
		display :flex;	// 块级元素
		display :inline-flex;	// 行内元素
		display : -webkit-flex;		//webkit内核浏览器需要加上 -webkit前缀
	}

在设置完flex布局后,子元素的float、clear 和 vertical-align 均将无效

容器的属性

  • flex - direction
  • flex - wrap
  • flex - flow
  • justify - content
  • align - items
  • align - content

1.flex - direction属性
此属性决定主轴方向 (即 项目排列方向)

	.box {
	  flex-direction: row | row-reverse | column | column-reverse;
	  /* 自下而上、  自上而下 、 自左而右 、 自右而左 */
	}

2.flex-wrap
此属性决定:如果一条轴线排列不下,该如何换行?

	.box{
		flex-wrap: nowrap | wrap | wrap-reverse
		/* 不换行 、 换行(多余的项目在下方展示)、换行(多余的项目在上方展示) */
		/* 不换行的结果就是,每个item的宽度都会被压缩,使得他们能够在一行内摆下 */
	}

3.flex-flow
此属性是flex-direction属性和flex-wrap属性的简写模式。默认值是row nowrap

	.box {
	  flex-flow: <flex-direction> || <flex-wrap>;
	}

4.justify-content
此属性定义了项目在主轴上的对齐方式。

	.box {
	  justify-content: flex-start | flex-end | center | space-between | space-around;
	}

5.align-items
此属性定义项目在交叉轴上的对齐方式

	.box {
	  align-items: flex-start | flex-end | center | baseline | stretch;
	  /* 交叉轴方向 (竖直): 自上而下排列  、 自下而上排列 、 竖直居中 、  以项目的第一行文字的基线 为基准来 对齐 、如果项目未设置高度或设为auto,将占满整个容器的高度( 默认值 )*/
	}

align-content属性
此属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

flex-grow属性
此属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。

.item {
  flex-grow: <number>; /* default 0 */
}

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

align-self属性
此属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

	.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

下面是完全代码,喜欢的朋友可以直接cv预览:

<template>
  <div class="flexiblecontainer">
    <div class="item item1">item1</div>
    <div class="item item2">item2</div>
    <div class="item item3">item3</div>
  </div>
</template>
<script>
export default {
  name: "flexible",
  data () {
    return {};
  },
  methods: {
    setDate () {
      var x = 0;
      var y = 0;
      function add (n) {
        n = n + 1;
        return n;
      }
      y = add(x);
      console.log(y);
    }
  },
  mounted () {
    // this.setDate();
  }
};
</script>
<style lang="less" scoped>
* {
  margin: 0;
  padding: 0;
}
.flexiblecontainer {
  width: 500px;
  height: 640px;
  background: orange;

  display: flex;
  // 0.为弹性和父元素设置
  // display: flex 开启块级元素弹性盒布局
  // display: inline-flex 开启行内元素级元素弹性盒布局
  // baseline 按照水平基线排列

  flex-direction: row; //  改变 main axis 的走向为 横向排列 (自左向右) 默认值
  // 1. flex-direction 用于改变 main axis 的走向
  // flex-direction: row-reverse; 改变 main axis 的走向为 (自右向左)
  // flex-direction: column; 改变 main axis 的走向 为自上而下
  // flex-direction: column-reverse; 改变main axis的走向为自下而上

  justify-content: space-evenly;
  //  2.justify-content: 决定flex item 的主轴对齐方式
  // space-between: 首个item与末个item 紧贴父级元素展示,中间的空隙平均分布,且只有中间含有空隙
  // space-around: 首个item与末个item 会与父级元素产生空隙,但两边空隙的宽度 为 中间空隙宽度的1/2
  // space-evenly: 所有items 之间的空隙平均分配

  align-items: center;
  //  3.align-items: 决定align-items 的 交叉轴对齐方式
  //  align-items: flex-start
  //  align-items: flex-end

  flex-wrap: wrap; // 一行排列不下则换行
  // 4.flex-wrap 控制items 在main axis 上的排列 是否换行(默认情况下,全部在一行显示)
  // flex-wrap: nowrap; // 一行排列不下,挤压items的宽度让其在一行之内展示(默认情况)
  // flex-wrap: wrap-reverse; // 倒置交叉轴进行排列,用的非常非常少几乎不用,知道即可

  // 5.flex-flow: <flex-direction> | <flex-wrap> flex-flow 是 flex-direction 与 flex-wrap 的缩写
  flex-flow: row wrap; //将主轴设置为 反向横向排列 排列不下时则换行排列

  align-content: flex-start; //   交叉轴上 自上而下排列
  // 6.align-content 用于在多行的情况下 flex-items 在 交叉轴上(cross axis)的 排列方式,
  // 用法与justify-content 类似
  // align-content: space-evenly; //  交叉轴上 空隙 等分排列
  // align-content: space-around; //  交叉轴上 空隙 环绕排列
  // align-content: space-between; //  交叉轴上 空隙 在中间排列
  // align-content: flex-end; //     交叉轴上 自下而上排列

  .item {
    width: 100px;
    height: 100px;
    line-height: 100px;
    text-align: center;
    color: #fff;
    font-size: 14px;
    // 以下会列举一些 flex-items 上的属性
    // 1. order
    // 可以设置任意整数(正负数与0),值越小越靠前 默认为0
    // 2. align-self
    // 用于覆盖align-items 设置的交叉轴排列方式 可选值为:flex-start flex-end center stretch(拉伸) baseline(基线对齐)
    // 3.flex-grow
    // 控制 item 在 main axis 上的拉伸度, 可选值为 number值(支持小数), 当所有flex-item的值大于1的时候
    // 每个所分得的宽度就为  该item的flex-grow值  / 所有flex-grow的总和
    // 如果 该值 小于1,那么所有的空隙大小就是1,这就意味着,flex-items的项, 无法将空隙分完.
    // 所分得的的大小 是 flex-grow的值 乘以 剩余的空间大小
    // EG: flex-grow: 0.2  剩余大小为200px  那么分的的宽度则为 0.2*200 =>40px
  }
  .item1 {
    background: red;
    flex-grow: 1;
  }
  .item2 {
    background: blue;
    order: 1;
  }
  .item3 {
    background: green;
    order: 5;
  }
  .item4 {
    background: brown;
    order: 3;
  }
  .item5 {
    background: purple;
    order: 3;
  }
  .item6 {
    background: springgreen;
    order: 10;
  }
}
</style>

下面的部分是 转载 阮一峰老师的 教程。
很棒 推荐!
FLex 布局教程

### 三、Flex 布局 Grid 布局的核心区别 Flex 布局和 Grid 布局是现代 CSS 中两种主要的布局模式,它们在设计目标、使用方式以及适用场景上有显著的区别。 Flex 布局是一种一维布局模型,主要用于控制容器内项目的对齐、顺序和空间分配。它通过主轴(main axis)和交叉轴(cross axis)来管理元素的排列方向和对齐方式。Flex 布局特别适合于单行或单列的布局需求,例如导航栏、按钮组等。其核心特性包括自动调整项目大小、灵活的空间分配以及强大的对齐能力[^1]。 Grid 布局则是一种二维布局模型,允许开发者同时定义行和列的结构,从而创建复杂的网页布局。Grid 布局不仅可以控制行和列之间的间距,还可以精确地定位每个项目在网格中的位置。这种布局方式非常适合需要复杂行列交互的设计,如仪表盘、多列布局等。Grid 提供了更精细的控制,比如 `grid-template-columns` 和 `grid-template-rows` 属性可以定义列和行的数量及大小,而 `grid-column` 和 `grid-row` 则用于指定项目在网格中的具体位置[^4]。 ### 四、Flex 布局 Grid 布局的实际应用场景 尽管 Flex 布局和 Grid 布局都可以用来实现复杂的布局效果,但它们各自有最适合的应用场景。Flex 布局因其简单性和灵活性,在处理简单的线性布局时表现出色。它可以轻松实现项目在主轴和交叉轴上的对齐和分布,适用于导航条、表单控件组等场景[^3]。 相比之下,Grid 布局更适合处理复杂的二维布局。通过定义明确的行和列,Grid 能够更好地组织页面中的多个区域,并确保这些区域之间有良好的视觉层次和空间关系。例如,在构建响应式网站时,Grid 布局可以通过媒体查询动态调整行和列的大小,以适应不同的屏幕尺寸[^2]。 ### 五、Flex 布局 Grid 布局的协同使用 虽然 Flex 布局和 Grid 布局各有优势,但在实际开发中,它们并不是互斥的选择。相反,两者可以很好地协同工作。例如,可以在 Grid 容器内的某个单元格中使用 Flex 布局来进一步细化该区域的布局。这种方式结合了 Grid 的强大二维布局能力和 Flex 的灵活一维布局能力,能够满足更加复杂的布局需求[^3]。 此外,随着 CSS 规范的发展,FlexGrid 的兼容性也在不断提升,使得开发者可以在同一个项目中无缝切换这两种布局方式。这不仅提高了开发效率,也增强了布局的灵活性和可维护性。 ```css /* 示例:在 Grid 单元格中使用 Flex 布局 */ .container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; } .cell { display: flex; justify-content: center; align-items: center; } ``` ### 六、总结 Flex 布局和 Grid 布局各有千秋,Flex 布局以其简洁高效的特性适用于一维布局,而 Grid 布局则凭借其强大的二维布局能力胜任更为复杂的页面结构。了解两者的特性和适用场景,有助于开发者在实际项目中做出更合适的选择。同时,灵活运用两者的组合,可以创造出更加丰富和高效的用户界面。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值