一文搞懂Grid布局和Flex布局及其区别
一文搞懂Grid布局和Flex布局及其区别
Flexbox和Grid是CSS3中两种重要的布局方式,它们各有特点和适用场景。本文将详细介绍这两种布局方式的基本概念、属性和用法,并对比它们之间的异同,帮助读者更好地理解它们在实际开发中的应用。
Flexbox布局
简述
Flexbox是一种一维的布局方式,一次只能处理一个维度上的元素布局,即一行或一列。它特别适合用于局部布局,如导航栏等。
特点
Flexbox布局(Flexible Box)模块旨在提供一个容器里的项目布局(基于一维),即使它们的大小是未知的或动态的。
缺点
浏览器兼容性较差,只能兼容到IE9以上。
概念
Flexbox的两根轴线:主轴和交叉轴。主轴由flex-direction
定义,另一根轴垂直于它。所有Flexbox的属性都与这两根轴线有关。
属性
按作用目标划分,Flexbox的属性可以分为容器属性和子元素属性。
容器属性
设置Flex容器
display: flex | inline-flex;
flex-direction
flex-direction: row | row-reverse | column | column-reverse;
flex-wrap
flex-wrap: nowrap | wrap | wrap-reverse;
flex-flow
flex-flow: row wrap;
align-items
align-items: stretch | center | flex-start | flex-end;
align-content
align-content: stretch | center | flex-start | flex-end;
justify-content
justify-content: stretch | flex-start | flex-end | center | space-around | space-between;
子元素属性
flex-grow
flex-grow: number | 0;
flex-shrink
flex-shrink: 1 | 0;
flex-basis
flex-basis: number | auto;
flex
flex: 1;
align-self
align-self: stretch | center | flex-start | flex-end;
order
order: 5 | -1;
Grid布局
简述
网格布局(Grid)是最强大的CSS布局方案。它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。
特点
- 固定和灵活的轨道尺寸;
- 可以使用行号、名称或通过定位网格区域将项目放置在网格上的精确位置;
- 可以将多个项目放入网格单元格或区域中,它们可以彼此部分重叠。
缺点
兼容性较差。
概念
采用网格布局的区域称为"容器"(container)。容器内部采用网格定位的子元素称为"项目"(item)。
容器属性
display: grid
display: grid;
grid-template-columns
grid-template-columns: 100px 100px 100px;
grid-template-rows
grid-template-rows: 100px 100px 100px;
repeat() & auto-fill 关键字 & fr 关键字 & minmax() & auto 关键字 & 网格线的名称
grid-template-columns: repeat(3, 100px);
grid-row-gap
grid-row-gap: 20px;
grid-column-gap
grid-column-gap: 20px;
grid-gap
grid-gap: 20px 20px;
grid-template-areas
grid-template-areas: 'a b c' 'd e f' 'g h i';
grid-auto-flow
grid-auto-flow: column;
justify-items
justify-items: start | end | center | stretch;
align-items
align-items: start | end | center | stretch;
place-items
place-items: <align-items> <justify-items>;
justify-content
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
align-content
align-content: start | end | center | stretch | space-around | space-between | space-evenly;
place-content
place-content: <align-content> <justify-content>;
grid-auto-columns & grid-auto-rows
grid-auto-columns: 50px; grid-auto-rows: 50px;
grid-template
grid-template: <grid-template-columns> <grid-template-rows> <grid-template-areas>;
grid
grid: <grid-template-rows> <grid-template-columns> <grid-template-areas> <grid-auto-rows> <grid-auto-columns> <grid-auto-flow>;
项目属性
grid-column-start
grid-column-start: 1;
grid-column-end
grid-column-end: 2;
grid-row-start
grid-row-start: 1;
grid-row-end
grid-row-end: 2;
grid-column
grid-column: 1 / 3;
grid-area
grid-area: e;
justify-self & align-self & place-self
justify-self: start | end | center | stretch; align-self: start | end | center | stretch; place-self: <align-self> <justify-self>;
总结
- Grid布局与Flexbox布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。
- Grid可以做Flexbox做不了的事,Flexbox比Grid兼容性更好,它们可以共同工作。Grid item可以成为Flexbox容器,Flex item可以成为Grid容器。综上所述,可以根据业务场景需要选择相应布局。