首页 > 其他分享 >Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?

时间:2022-11-21 16:07:00浏览次数:48  
标签:flex Flexbox column grid Grid row CSS 属性

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_二维

英文 | https://betterprogramming.pub/flexbox-vs-css-grid-3e9011ee2951

翻译 | 杨小爱


刚开始编程时,我只知道如何使用 flexbox。所以很自然地,我只使用了 flexbox。我从不认为 flexbox 比 CSS grid 更好或更差,我只是从未学会如何正确使用它。

当我开始在工作中承担更多责任后,我意识到 flexbox 可能并不总是每个项目的首选答案。它妨碍了我正在构建的不同布局,并且造成的麻烦超出了它的价值。

因此,在这里,我想于您分享我对它们的一些理解,希望对您有帮助。

现在,我们开始吧。

Flexbox

Flexbox 是一维的,这意味着你真的只能在一个方向或另一个方向设计你的页面。它并非旨在同时支持行和列。

我通常与 Flexbox 一起使用的主要属性是 display、flex-direction、align-items 和 justify-content。我建议查看 MDN Web Docs 以获取有关 Flexbox 支持的所有其他属性的更多信息。

显示和 Flex 方向属性

首先,您需要创建一个包含要设置样式的项目的容器。

下面是一个 HTML 示例:


<div class="container">
<p>One</p>
<p>Two</p>
<p>Three</p>
</div>

flexbox display 属性可以设置为 flex 或 inline-flex。在大多数情况下,我使用 flex。inline-flex 只是使容器内联,而不是容器内的项目。

flex-direction 属性有四个不同的值,您可以将其设置为 row、row-reverse、column 和 column-reverse。

行和列的值是不言自明的,它们将项目放在一行或一列中。row-reverse 和 column-reverse 值设置行或列中的项目,但反转它们的显示方式。例如,当设置列反转值时,项目“一”、“二”和“三”将显示为“三”、“二”、“一”。

以下是如何使用 flexbox 属性 display 和 flex-direction :


.container {
display: flex;
flex-direction: column;
}

这是显示结果:

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_二维_02

如果您将 flex-direction 设置为 row-reverse,这将是您的结果:

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_二维_03

Align-Items 属性

align-items 属性有助于将项目定位在垂直于项目主轴的横轴上。它可以设置为四个不同的值:stretch、flex-start、flex-end 和 center。

默认情况下,已设置stretch,这就是为什么容器中的项目会自动拉伸到与容器相同的高度。

flex-start 值在容器的开头对齐容器中的项目。

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_二维_04

flex-end 值将容器中的项目与其末尾对齐。

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_css_05

 center值将容器中的项目居中对齐。

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_css_06

Justify-Content 属性

justify-content 属性在主轴上对齐项目,这与容器中的项目相同。它可以设置为六个不同的值:flex-start、flex-end、center、space-around、space-between 和 space-evenly。

flex-start、flex-end 和 center 值的作用与它们应用于 align-items 属性时的作用相同,只是在主轴上而不是垂直于主轴。

space-around 值导致每个项目之间的空间相等,并导致两端产生“一半大小”空间。

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_html_07

space-between 值占用所有可用空间,并在容器中的项目之间均匀共享。

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_二维_08

space-evenly 值类似于 space-around。它导致每个项目之间的空间相等。然而,不是在两端保持“半尺寸”空间,空间均匀属性会在每一端产生“全尺寸”空间。

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_二维_09

CSS Grid

CSS Grid 是二维的,这意味着它非常适合将您的网页深入到几个不同的区域。只要您知道自己在做什么和想要什么,您就可以完全控制如何设置您的网页。

例如,下图显示了如何将网站划分为六个网格区域。每个部分的宽度、高度、位置都可能不同,甚至可以重叠。

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_css_10

我在 CSS 网格中使用的一些基本属性是:display、grid-template-columns、grid-template-rows、grid-column、grid-row 和 gap。

显示和网格模板属性

回到我们的 HTML 示例,为每个项目添加一些类:


<div class="container">
<p class="one">One</p>
<p class="two">Two</p>
<p class="three">Three</p>
</div>

为了实现与上面的 flexbox 示例类似的布局,我们的 CSS 将如下设置:


.container {
display: grid;
grid-template-columns: 1fr;
gap: 10px;
}
.one {
grid-column: 1;
grid-row: 1;
}
.two {
grid-column: 1;
grid-row: 2;
}
.three {
grid-column: 1;
grid-row: 3;
}

我们的显示结果如下:

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_css_11

CSS Grid显示属性可以设置为 grid 或 inline-grid。同样,在大多数情况下,我使用grid。

Grid-template-columns 定义了分配给容器中每个项目的 grid-column 属性的行名称和大小。Grid-template-rows 做同样的事情,除了它影响容器中每个项目的 grid-row 属性。

grid-template-columns 和 grid-template-rows 都有许多不同的值可以分配给它们。与往常一样,我建议查看这些文档。

举几个例子,您可以将这些属性的值设置为像素 (px)、分数 (fr)、字符宽度 (ch)、自动或无。您可以混合和匹配这些值。您还可以为该值传入一个函数,例如 repeat() 或 fit-content()。

这是一个使用 repeat() 函数的示例,其中 grid-template-columns 和 grid-template-rows 有两个混合值:


.container {
display: grid;
grid-template-columns: repeat(2, 50ch);
grid-template-rows: repeat(1, 200px);
gap: 10px;
}

结果看起来有点像这样:

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_css_12

它不是很漂亮,但它显示了在使用 CSS grid时您对容器或包装器中的项目有多少控制。

网格行和网格列属性

grid-column 和 grid-row 属性都定义了项目在网格容器中的大小和位置。两者都可以设置为数字、名称或全局 CSS 值,例如,继承或未设置。

例如,使用我刚刚列出的一些值,我们可以将原始 CSS 示例更改为:


.one {
grid-column: 3;
grid-row: 1 / span 2;
}
.two {
grid-column: 12;
grid-row: 2 / -1;
}
.three {
grid-column: 6;
grid-row: main-end;
}

这将是结果:

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_二维_13

就像我之前说的,它并不完全漂亮,但它显示了在使用 CSS grid时您对容器或包装器中的项目有多少控制。

差距属性

CSS grid gap 属性设置容器内列和行之间的空间。它的值可以是像素 (px)、字体大小 (em)、百分比,您可以使用 calc() 函数等等。您还可以指定它是仅用于行:row-gap 还是仅用于列:column-gap。

下面是之前的示例,间隙设置为 40px 而不是原来的 10px:

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_html_14

Flexbox 与 CSS Grid:应该使用哪一个?

我的答案是两者都有!

每个 CSS 布局都有自己独特的属性和用途。Flexbox 是一维的,只应在您尝试在 x(水平)或 y(垂直)轴上创建内容时使用。CSS Grid 是二维的,应该用于更复杂的布局。

与往常一样,我建议查看文档。MDN Web Docs 不仅是 CSS 的绝佳资源,也是 HTML、JavaScript、API 等的绝佳资源。W3Schools 也是所有与 Web 开发相关的重要资源。最重要的是,我建议使用两种不同的 CSS 布局。创建类似于我上面给出的示例的简单内容,更改属性,看看会发生什么。

最后,感谢您的阅读,如果您觉得我分享的内容对您有帮助,请分享给您的朋友,也许能够帮助到他们。如果您也喜欢我的内容,请点赞我,关注我,非常感谢。


学习更多技能请点击下方公众号

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_css_15

Flexbox 与 CSS Grid 两者之间有什么区别,我们应该如何使用它们?_css_16


标签:flex,Flexbox,column,grid,Grid,row,CSS,属性
From: https://blog.51cto.com/u_15809510/5874049

相关文章

  • wpf dataGrid 获取单元格,并对单元格中的对象操作
    先上图:  要求:对第一行的“选项内容举例。。。”的控件进行隐藏,如下:  前端代码:<Windowx:Class="DataGridPractice.MainWindow"xmlns="http://schema......
  • 直播电商平台开发,CSS 3之模糊与透明色背景
    直播电商平台开发,CSS3之模糊与透明色背景1.模糊blue滤镜能实现页面模糊效果,即在一个方向上的运动模糊;语法格式如下所示: blue(radius) radius参数表示接单单个......
  • 直播带货源码,CSS 3之图文混排效果
    直播带货源码,CSS3之图文混排效果1.设置图片与文字间距用padding属性能设计图片和文字之间的距离,即文字与图片之间在一定间距;padding属性主要用来在一个声明中设置......
  • css预处理和样式重置
    scss的安装和使用:1.安装:cnpmisass-loader@7node-sass@4-S2.使用:less的安装和使用:1.安装:cnpmiless@3less-loader@7-S2.使用:运行:npmrunserve/devyarn......
  • css实现多余字体用省略号表示
    第一种情况:单行文字超出固定宽度后,用省略号表示<pclass="single">单行文字超出规定宽度后,以省略号形式展示。单行文字超出规定宽度后,以省略号形式展示。</p>.single{......
  • 两行CSS让页面提升了近7倍渲染性能!
    前言对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态。如果页面加载过慢,你的用户很可能会因此离你......
  • 微信小程序使用Animate.css来实现动画效果
    1、安装官网:https://animate.style/视图--终端,打开终端(新建)npminstallanimate.css--save2、安装完了以后,会多一个文件夹:  打开文件,找到animate.css 3、......
  • css 布局整理2022-4
    理解CSS3里的Flex布局用法(转自网上,博客园修改一些方便更易看懂)简单有法:几个横排元素在竖直方向上居中display:flex;flex-direction:row;//横向排列align-items:ce......
  • variables.scss
    //颜色$colors:("primary":#db9e3f,"info-1":#4394e4,"info":#4b67af,"white":#ffffff,"light":#f9f9f9,"grey-1":#999999,"grey":#666666......
  • style.scss
    @import"./variables";//全局样式*{margin:0;padding:0;list-style-type:none;box-sizing:border-box;outline:none;}html{......