CSS布局模式之Flex布局&Grid布局(一)

简介: CSS布局模式之Flex布局&Grid布局

1. 简介

1.1 什么是CSS布局?

CSS布局(Cascading Style Sheets layout)指的是通过使用CSS样式来控制网页中元素的布局方式

在网页设计中,布局是非常重要的一个方面,因为它决定了网页中内容的呈现方式,对网页的可读性、可用性和美观性都有着重要的影响。

在CSS的发展过程中,出现了许多不同的布局方案,其中Flex布局和Grid布局是最常用的两种布局方式

通过使用CSS布局,开发者可以通过少量的代码来快速而有效地实现自己所需要的布局效果。

1.2 为什么使用CSS布局?

使用CSS布局有许多好处,以下是其中的几个主要原因:

  1. 统一风格:使用CSS布局可以确保网页的各个部分在不同浏览器和设备上看起来一致,避免了由于不同设备或浏览器的不同特性导致的页面混乱的情况。
  2. 简化代码:使用CSS布局可以大大简化HTML代码,通过统一的布局方式可以减少重复代码,提高了开发效率,减轻了开发工作的负担。
  3. 增强可读性:使用CSS布局可以使网页代码更加清晰和易于理解,开发者可以通过对样式的修改来达到想要的效果,而无需直接修改HTML代码,使得代码的维护更加容易。
  4. 响应式设计:使用CSS布局可以实现响应式设计,即通过设置不同的样式规则来适应不同的设备和屏幕尺寸,使得网页可以在不同的设备和屏幕上都能够完美显示,提高了用户体验。

2. Flex布局

2.1 什么是Flex布局?

Flex布局是一种基于CSS3的新的布局方式,它可以方便地实现元素的弹性布局,即使在不同的屏幕尺寸和不同的设备上,元素也可以按照预期的方式自适应地伸缩和排列。

简单来说,Flex布局使得容器的尺寸可以自适应,元素可以像弹簧一样自动填充到容器中,并且可以很方便地控制元素的排列方式和对齐方式,实现各种复杂的布局效果。

Flex布局的核心是Flex容器和Flex项目。

  • Flex容器是指一个元素,它的所有子元素都会成为Flex项目。
  • Flex项目是指Flex容器中的子元素,可以按照一定的规则进行排序和排列

Flex容器有一系列的属性可以控制容器的排列方式,Flex项目也有一些属性可以控制项目的大小和位置

通过灵活的控制这些属性,可以实现各种复杂的布局效果,例如水平居中、垂直居中、等分布局、换行、流式布局等。

2.2 Flex容器和Flex项目

Flex容器和Flex项目是Flex布局的两个基本元素,它们有不同的属性和作用:

1. Flex容器

Flex容器是Flex布局中的父容器,用于包含Flex项目。通过定义Flex容器的属性,可以控制Flex项目在容器中的排列方式和对齐方式。

常见的Flex容器属性包括:

  • display:定义Flex容器的类型,默认为flex。
  • flex-direction:定义Flex项目在Flex容器中的排列方向,可以是row、row-reverse、column或column-reverse。
  • justify-content:定义Flex项目在Flex容器中的水平对齐方式,可以是flex-start、flex-end、center、space-between或space-around。
  • align-items:定义Flex项目在Flex容器中的垂直对齐方式,可以是flex-start、flex-end、center、baseline或stretch。
  • align-content:定义Flex项目在多行或多列的容器中的垂直对齐方式,仅在有多个Flex行或Flex列时生效,常用的取值包括flex-start、flex-end、center、space-between、space-around和stretch。

2. Flex项目

Flex项目是Flex容器中的子元素,不同的Flex项目可以按照一定的规则排序和排列。通过定义Flex项目的属性,可以控制项目在容器中的大小、位置和排序方式。

常见的Flex项目属性包括:

  • flex-grow:定义项目的放大比例,默认为0,不会被放大。
  • flex-shrink:定义项目的缩小比例,默认为1,即当空间不足时,Flex项目压缩大小,以适应容器。
  • flex-basis:定义项目在分配多余空间之前的基准大小,默认为auto,即根据项目内容自动计算大小。
  • flex:flex-grow、flex-shrink和flex-basis的缩写,可以同时设置这三个属性。
  • order:定义项目的排列顺序,数值越小越靠前,默认为0。

通过组合使用Flex容器和Flex项目的属性,我们可以轻松实现各种灵活的布局效果,使得网页可以适应不同的设备和屏幕大小,提高网页的可读性和用户体验。

2.3 Flex容器的属性

2.3.1 flex-direction

flex-direction是Flex布局中比较重要的一个属性,用于指定Flex容器中Flex项目的排列方向。

该属性接受四个值:rowrow-reversecolumncolumn-reverse,分别代表水平方向从左到右排列、水平方向从右到左排列、垂直方向从上到下排列和垂直方向从下到上排列。

默认情况下,flex-direction属性的值为row,即水平方向从左到右排列。

该属性可以与其他的Flex容器属性如justify-contentalign-items联合使用,来实现不同的Flex项目布局效果。例如,

  • flex-direction: row时,justify-content属性可以设置Flex项目在主轴上(水平方向)的对齐方式,align-items属性可以设置Flex项目在交叉轴上(垂直方向)的对齐方式;
  • 而当flex-direction: column时,则相反,justify-content属性可以设置Flex项目在交叉轴上(水平方向)的对齐方式,align-items属性可以设置Flex项目在主轴上(垂直方向)的对齐方式。

需要注意的是,使用flex-direction属性可以通过改变Flex容器中Flex项目的排列方式,来实现各种布局效果,但并不会影响Flex项目的大小和位置,需要使用其他的Flex项目属性来进一步控制。

2.3.2 justify-content

justify-content是Flex布局中比较常用的一个属性,用于控制Flex项目在Flex容器的主轴上的对齐方式。该属性接受5个值:

  • flex-start:左对齐(默认值)。
  • flex-end:右对齐。
  • center:居中对齐。
  • space-between:两端对齐,Flex项目之间的间隔相等。
  • space-around:均匀对齐,Flex项目之间的间隔相等。

需要注意的是,justify-content属性只对Flex容器中的Flex项目在主轴方向上的位置进行对齐,不影响在交叉轴方向上的位置。该属性通常与flex-direction联合使用,来控制Flex项目在不同方向上的对齐方式。

另外,如果Flex项目是可以换行的,即使用了flex-wrap: wrap等属性,justify-content属性也会影响换行后的Flex项目对齐方式。例如,如果在Flex容器中有多个Flex项目,当空间不足时,Flex项目会自动换行,此时可以使用align-content属性控制多行的Flex项目在交叉轴上的对齐方式。和justify-content类似,align-content同样接受5个值,分别对应不同的对齐方式。

2.3.3 align-items

align-items是Flex布局中用于控制Flex项目在Flex容器的交叉轴方向上的对齐方式的属性。该属性接受5个值:

  • flex-start:Flex项目在交叉轴的起始位置对齐(默认值)。
  • flex-end:Flex项目在交叉轴的结束位置对齐。
  • center:Flex项目在交叉轴的中间位置对齐。
  • baseline:Flex项目在基线(baseline)上对齐。
  • stretch:Flex项目在交叉轴上拉伸,占满容器的高度。

需要注意的是,align-items属性只影响Flex项目在交叉轴上的对齐方式,不影响在主轴方向上的位置。该属性通常与flex-direction联合使用,来控制Flex项目在不同方向上的对齐方式。

另外,如果Flex项目是可以换行的,即使用了flex-wrap: wrap等属性,align-items属性也会影响换行后的Flex项目对齐方式。如果Flex容器有多行Flex项目,可以使用align-content属性控制多行的Flex项目在交叉轴上的对齐方式。详见align-content的解释。

2.3.4 align-content

align-content属性用于控制Flex容器中多行大于一行的的Flex项目在交叉轴方向上的对齐方式。该属性只对多行的Flex项目有效,对于单行Flex项目无效。align-content属性接受5个值:

  • flex-start:多行Flex项目在交叉轴的起始位置对齐。
  • flex-end:多行Flex项目在交叉轴的结束位置对齐。
  • center:多行Flex项目在交叉轴的中间位置对齐。
  • space-between:多行Flex项目沿交叉轴均匀分布。
  • space-around:多行Flex项目沿交叉轴均匀分布,项目之间的距离也相等。
  • stretch:多行Flex项目在交叉轴上拉伸,填满整个Flex容器的高度(默认值)。

需要注意的是,align-content属性只对多行的Flex项目在交叉轴上的对齐方式进行控制,不会对单行的Flex项目进行影响。并且,该属性只有在flex-wrap属性设置为wrap(意味着Flex项目在Flex容器中可以换行)时才有效,否则无论多少行的Flex项目都只有一行。

此外,align-content属性可以和align-items属性配合使用来对多行的Flex项目在交叉轴方向上进行完整的控制,在一些特殊场景下可能会有更好的效果。

2.4 Flex项目的属性

2.4.1 flex-grow

flex-grow是Flex布局中一种用于控制Flex项目占据剩余空间的属性。该属性定义了当剩余空间不足时,Flex项目是否拉伸以填满剩余空间的比例。flex-grow属性的值必须是非负数,默认值为0,表示当空间不足时Flex项目不进行拉伸,并且剩余空间被Flex容器中的其他Flex项目所占据。

默认情况下,Flex项目根据其在Flex容器中的排序顺序来进行分配空间,因此,如果Flex项目未设置flex-grow属性,将按照默认值为0予以处理。而当Flex项目设置了flex-grow属性后,剩余的空间将按照Flex项目的flex-grow属性来分配。

flex-grow属性的计算方式如下:

  • 将所有不设置flex-grow属性的Flex项目的flex-grow属性值设为0。
  • 计算剩余空间:容器的可用空间减去所有Flex项目的基准空间(即Flex项目的占据的空间或者flex-basis属性值)。
  • 将所有Flex项目的flex-grow属性值相加, 计算出所有Flex项目在剩余空间中所占的比例。例如,如果所有Flex项目的flex-grow值之和是3,那么每个Flex项目在剩余空间中所占的比例就是"1/3"。
  • 将每个Flex 项目的flex-grow值乘以该Flex项目在剩余空间中占据的比例,从原有的基准空间中分配给该Flex项目。

需要注意的是, flex-grow属性仅在Flex项目有剩余空间时才有效。当Flex项目的基准空间已经完全覆盖了其分配的空间时,flex-grow属性将不起作用。

2.4.2 flex-shrink

flex-shrink是Flex布局中一种用于控制Flex项目收缩的属性。

该属性定义了当空间不足时,Flex项目是否缩小以适应剩余空间的比例。

flex-shrink属性的值必须是非负数,默认值为1,表示当空间不足时Flex项目进行收缩。

当Flex项目的总长度大于Flex容器的长度时,剩余宽度将按照Flex项目设置的flex-shrink属性值进行分配。理解flex-shrink属性的关键就是理解Flex项目的收缩比例。

每个Flex项目的收缩比例等于其flex-shrink属性值除以所有Flex项目的flex-shrink属性值之和。例如,假设Flex容器的宽度为100px,其中有三个Flex项目,设置了flex-shrink属性的值分别为1、2和3,则这三个Flex项目的收缩比例分别为1/6、2/6和3/6,容器中每个Flex项目的宽度将分别减少100px * (1/6)、100px * (2/6)和100px * (3/6)。

需要注意的是,flex-shrink属性仅在Flex项目的基准空间(即Flex项目的flex-basis属性值)大于其占据的空间时才有效。此外,flex-shrink属性的值的大小将影响Flex项目的收缩比例,并且如果所有Flex项目的flex-shrink属性值都设置为0,则表示Flex项目不能缩小,不会根据剩余空间的大小调整Flex项目的大小。

2.4.3 flex-basis

flex-basis是Flex布局中一种定义Flex项目基准空间的属性。它指定了Flex项目在Flex容器内占据的空间,以及在计算Flex项目的flex-growflex-shrink属性时所使用的基础空间。如果未指定flex-basis属性,则该属性默认为auto,其大小由Flex项目的内容决定。

flex-basis属性的值可以是一个长度值、一个百分比值、一个关键字auto或一个关键字content。长度值和百分比值指定了Flex项目在Flex容器内占据的精确空间大小,而auto值表示由Flex项目的实际大小决定,而content表示由Flex项目的内容决定。

flex-basis属性通常与flex-growflex-shrink属性一起使用,以定义Flex项目的收缩和拉伸比例。当需要对Flex容器中的Flex项目进行收缩或拉伸时,Flex容器计算出每个Flex项目的基准空间(即flex-basis属性的值),并将它们的大小相加得到Flex容器的总基础空间。Flex容器剩余的空间将根据每个Flex项目的flex-growflex-shrink属性值进行分配。

需要注意的是,当flex-basis属性设置为content时,Flex项目的大小取决于其内容的大小,并且flex-growflex-shrink属性不再起作用。因此,如果希望Flex项目能够根据其内容的大小自适应,可以为其设置flex-basis: content

2.4.4 order

order是Flex布局中用于指定Flex项目排列顺序的属性。它可以控制Flex项目的排列顺序,实现Flex项目在显示时的前后位置变化,适用于所有Flex项目。该属性的值越小,Flex项目的排列顺序就越靠前,默认值为0。

order值可以是任何整数,包括负整数。负数值最靠前,整数值最靠后。如果两个Flex项目具有相同的order值,则它们将按照在Flex容器中的正常位置顺序排列。

这个属性有些特点,可以通过改变order来调整Flex项目的显示顺序,而无需改变它们在HTML源代码中的位置。这可以让开发人员更容易地管理和维护Flex项目,并使Flex布局更具灵活性。

需要注意的是,order属性的值不影响Flex项目的实际大小或所占空间,仅影响其在Flex容器中的显示顺序。

3. Grid布局

3.1 什么是Grid布局?

Grid布局是一种用于网格化布局Web页面的CSS布局模块,它允许开发者将页面分割成行和列,并使页面中的元素具有更灵活和精确的定位。

使用Grid布局,开发者可以自由地将页面分成多个区域,然后在这些区域中放置内容模块。每个区域的尺寸可以由开发者自己决定,而且不同区域之间的尺寸也可以互不相同,在这一点上,Grid布局非常类似于传统的框格布局。

Grid布局中的重要概念包括网格(grid)、网格项(grid item)、行(row)、列(column)、行轨(row track)、列轨(column track)、单元格(cell)和间隙(gap)等等。通过使用这些概念,开发者可以精确控制网格中每个网格项的大小和位置,从而实现更具有创意和艺术性的页面设计。

Grid布局广泛用于复杂的Web页面布局,比如新闻门户,电商网站等等。由于它提供了灵活和精确的定位方式,使得它在业内越来越受到欢迎,并且在CSS布局的发展历程中扮演着非常关键的角色。

3.2 Grid容器和Grid项目

在Grid布局中,Grid容器和Grid项目是两个核心概念。

Grid容器是应用Grid布局的元素,它可以定义为一个具有display: griddisplay: inline-grid属性的元素。在Grid容器内部,可以通过定义网格(grid)来划分网格区域,从而实现网格化布局。

Grid项目是Grid容器中的元素,它们被放置于网格之中,在行和列之间进行布局。每个Grid项目可以被访问并控制,其位置和大小可以精确地指定。在Grid项目中,还可以通过grid-rowgrid-column属性来设置对应的行和列,也可以使用grid-area属性来同时设置行、列、起始以及结束位置。

在Grid容器中,可以使用grid-template-rowsgrid-template-columns属性来定义网格的行和列,从而确定网格的大小和列数。Grid容器中的网格可以具有不同的大小、位置和间隔,开发者可以通过指定网格的行和列来精确控制每个Grid项目在网格中的位置和大小。

通过使用Grid容器和Grid项目,开发者可以快速建立复杂且精细的网格布局,轻易地实现类似于表格布局的效果,而不必在HTML代码中嵌套大量的div元素,提高了页面布局的灵活性和可读性。


CSS布局模式之Flex布局&Grid布局(二)https://developer.aliyun.com/article/1426127

相关文章
|
1天前
|
前端开发 开发者 UED
【专栏:HTML与CSS前端技术趋势篇】网页设计中的CSS Grid与Flexbox之争
【4月更文挑战第30天】本文对比了CSS Grid和Flexbox两种布局工具。Flexbox擅长一维布局,简单易用,适合导航栏和列表;CSS Grid则适用于二维布局,能创建复杂结构,适用于整个页面布局。两者各有优势,在响应式设计中都占有一席之地。随着Web标准发展,它们的结合使用将成为趋势,开发者需掌握两者以应对多样化需求。
|
1天前
|
前端开发 UED
【专栏:HTML与CSS实战项目篇】创建一个具有复杂布局的电商详情页
【4月更文挑战第30天】构建复杂布局的电商详情页涉及页面结构规划、样式设计和交互效果实现。首先规划顶部导航栏、商品图片展示区、商品信息区、用户评价区和相关商品推荐区。在样式设计上,注重色彩搭配、字体选择、布局与间距及图片处理。交互效果包括图片放大、添加到购物车按钮、滚动监听和评论互动,以提升用户体验。实际开发中需考虑跨设备兼容性和用户体验优化。
|
1天前
|
编解码 缓存 前端开发
【专栏:HTML与CSS移动端开发篇】移动端网页布局与适配
【4月更文挑战第30天】本文探讨了如何使用HTML和CSS优化移动端网页布局与适配,强调响应式设计、灵活布局和媒体查询的重要性。针对移动设备的屏幕尺寸、操作方式、网络速度和性能差异,提出了断点选择、触摸优化、图像和性能优化等最佳实践。测试和调试、框架工具的应用也是关键步骤,以确保在多设备上提供优秀用户体验。开发者需持续学习新趋势和工具,以适应移动端发展。
|
1天前
|
前端开发 UED 容器
【专栏:CSS进阶篇】CSS Grid布局:构建复杂的二维布局
【4月更文挑战第30天】CSS Grid布局是二维布局系统,适用于复杂页面结构,如页眉、主体和侧边栏。通过定义网格线和单元格,能轻松创建行和列。基本语法包括设置容器为grid容器,定义`grid-template-rows`和`grid-template-columns`。高级特性包括命名网格线、网格区域、网格间隙、重复网格线和自动填充。在实际应用中,CSS Grid能有效提升开发效率和用户体验,尤其在响应式设计和复杂布局场景下。
|
1天前
|
前端开发 开发者 容器
【专栏:CSS进阶篇】CSS Flexbox布局:实现灵活的响应式设计
【4月更文挑战第30天】CSS Flexbox是现代网页设计中创建响应式布局的关键工具,它提供了一种一维布局模型,使元素能灵活适应各种屏幕尺寸。通过设置容器的`display`属性为`flex`,开发者可以利用主轴和交叉轴调整元素排列和对齐方式。核心概念包括弹性项、伸缩性、空间分配和对齐。通过实例,如导航栏、卡片布局、图片画廊和响应式表单,展示了Flexbox在实现响应式设计中的应用。尽管需要注意浏览器兼容性,但掌握Flexbox能帮助开发者构建出功能强大且适应性强的界面。
|
1天前
|
前端开发 开发者 容器
【专栏:CSS基础篇】CSS定位与布局:从静态到浮动、定位
【4月更文挑战第30天】本文介绍了CSS定位与布局的基础,包括静态、相对、绝对、固定定位以及浮动。静态定位遵循HTML顺序,相对定位可在正常位置基础上偏移,不占用额外空间。绝对定位基于最近已定位祖先元素定位,脱离文档流。固定定位相对于浏览器窗口定位,无视页面滚动。浮动用于文字环绕图片等,可能导致父元素高度塌陷。Flexbox布局提供更灵活的元素排列和对齐方式,适配各种复杂布局需求。理解并掌握这些布局技术能提升网页设计的灵活性和响应性。
|
1天前
|
缓存 移动开发 前端开发
【专栏:HTML与CSS前端技术趋势篇】HTML与CSS在PWA(Progressive Web Apps)中的应用
【4月更文挑战第30天】PWA(Progressive Web Apps)结合现代Web技术,提供接近原生应用的体验。HTML在PWA中构建页面结构和内容,响应式设计、语义化标签、Manifest文件和离线页面的创建都离不开HTML。CSS则用于定制主题样式、实现动画效果、响应式布局和管理字体图标。两者协同工作,保证PWA在不同设备和网络环境下的快速、可靠和一致性体验。随着前端技术进步,HTML与CSS在PWA中的应用将更广泛。
|
1天前
|
前端开发 JavaScript 开发者
【专栏:HTML与CSS前端技术趋势篇】前端框架(React/Vue/Angular)与HTML/CSS的结合使用
【4月更文挑战第30天】前端框架React、Vue和Angular助力UI开发,通过组件化、状态管理和虚拟DOM提升效率。这些框架与HTML/CSS结合,使用模板语法、样式管理及组件化思想。未来趋势包括框架简化、Web组件标准采用和CSS在框架中角色的演变。开发者需紧跟技术发展,掌握新工具,提升开发效能。
|
1天前
|
前端开发 JavaScript UED
【专栏:HTML 与 CSS 前端技术趋势篇】Web 性能优化:CSS 与 HTML 的未来趋势
【4月更文挑战第30天】本文探讨了CSS和HTML在Web性能优化中的关键作用,包括样式表压缩、选择器优化、DOM操作减少等策略。随着未来趋势发展,CSS模块系统、自定义属性和响应式设计将得到强化,HTML新特性也将支持复杂组件构建。同时,应对浏览器兼容性、代码复杂度和性能功能平衡的挑战是优化过程中的重要任务。通过案例分析和持续创新,我们可以提升Web应用性能,创造更好的用户体验。
|
1天前
|
移动开发 前端开发 UED
【专栏:HTML与CSS前端技术趋势篇】渐进式增强与优雅降级在前端开发中的实践
【4月更文挑战第30天】前端开发中的渐进式增强和优雅降级是确保跨浏览器、跨设备良好用户体验的关键策略。渐进式增强是从基础功能开始,逐步增加高级特性,保证所有用户能访问基本内容;而优雅降级则是从完整版本出发,向下兼容,确保低版本浏览器仍能使用基本功能。实践中,遵循HTML5/CSS3规范,使用流式布局和响应式设计,检测浏览器特性,并提供备选方案,都是实现这两种策略的有效方法。选择合适策略优化网站,提升用户体验。