如何使用Flexbox和CSS Grid,实现高效布局

CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想。幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来。

使用 Flexbox 可以使元素对齐变得容易,因此 Flexbox 已经被广泛使用了。

同时,CSS Grid 布局也为网页设计行业带来了很大的便利。虽然 CSS Grid 布局未被广泛采用,但是浏览器逐渐开始增加对 CSS Grid 布局的支持。

虽然 Flexbox 和 CSS Grid 可以完成类似的布局,但是本次,我们学习的是如何组合使用这两个工具,而不是只选择其中的一个。在不久的将来,当 CSS Grid 布局获得完整的浏览器支持时,设计人员就能够利用每个 CSS 组合的优势,来创建最有效和最有趣的布局设计。

测试 Flexbox 和 CSS Grid 的基本布局

我们从一个很简单且熟悉的布局类型开始,包括标题,侧边栏,主要内容和页脚等部分。通过这样一个简单的布局,来帮助我们快速找到各种元素的布局方法。

下面是需要创建的内容:

要完成这个基本布局, Flexbox 需要完成的主要任务包括以下方面:

  • 创建完整宽度的 header 和 footer
  • 将侧边栏放置在主内容区域左侧
  • 确保侧边栏和主内容区域的大小合适
  • 确保导航元素定位准确

基本 HTML 结构

<div class="container">
    <header>
        <nav>
          <ul>
            <li></li>
            <li></li>
            <li></li>
          </ul>
        </nav>
        <button></button>
    </header>
    <div class="wrapper">
        <aside class="sidebar">
            <h3></h3>
        </aside>
        <section class="main">
            <h2></h2>
            <p></p>
        </section>
    </div><!-- /wrapper -->
    <footer>
        <h3></h3>
        <p></p>
    </footer>
</div><! -- /container -->

使用 Flexbox 创建布局

  • Header 样式

我们从外到内,逐层开始设计,首先将 display: flex; 添加到 container,这也是所有 Flexbox 布局的第一步。接着,将 flex-direction 设置为 column,确保所有部分彼此相对。

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

通过 display: flex; 自动创建一个全宽的 header(header 默认情况下是块级元素)。通过这个声明,导航元素的放置会变得很容易。

导航栏的左侧有一个 logo 和两个菜单项,右侧有一个登录按钮。导航位于 header 中,通过 justify-content: space-between; 可以实现导航和按钮之间的自动间隔。

在导航中,使用 align-items: baseline; 能够实现所有导航项目与文本基线的对齐,这样也使得导航栏看起来更加统一。

代码如下:

header{
    padding: 15px;
    margin-bottom: 40px;
    display: flex;
    justify-content: space-between;
}

header nav ul {
    display: flex;
    align-items: baseline;
    list-style-type: none;
}
  • 页面内容样式

接下来,将侧边栏和主内容区域使用一个 wrapper 包含起来。具有 .wrapper 类的 div,也需要设置 display: flex; 但是 flex 方向与上述不同。这是因为侧边栏和主内容区域彼此相邻而不是堆叠。

.wrapper {
    display: flex;
    flex-direction: row;
}

主内容区域和侧边栏的大小设置非常重要,因为重要的信息都在这里展示。主内容区域应该是侧边栏大小的三倍,使用 Flexbox 很容易实现这点。

.main {
    flex: 3;
    margin-right: 60px;
}

.sidebar {
   flex: 1;
}

总的来说,Flexbox 在创建这个简单的布局时,十分高效。尤其在控制列表元素样式和设置导航与按钮之间的间距方面,特别有用。

使用 CSS Grid 创建布局

为了测试效率,接下来使用 CSS Grid 创建相同的基本布局。

  • Grid 模板区域

CSS Grid 的方便之处在于,可以指定模板区域,这也使得定义布局变得非常直观。采取这种方法,网格上的区域可以命名并引用位置项。对于这个基本布局,我们需要命名四个项目:

  • header
  • main content
  • sidebar
  • footer

基本 HTML 结构

<div class="container">
    <header>
        <nav>
          <ul>
            <li></li>
            <li></li>
            <li></li>
          </ul>
        </nav>
        <button></button>
    </header>
   
    <aside class="sidebar">
        <h3></h3>
        <ul>
            <li></li>
            <li></li>
         <li></li>
         <li></li>
         <li></li>
        </ul>
    </aside>
 
    <section class="main">
        <h2></h2>
        <p></p>
        <p> </p>
    </section>
 
    <footer>
        <h3></h3>
        <p></p>
    </footer>
</div>

我们按照顺序在 grid container 中定义这些区域,就像绘制它们一样。

grid-template-areas:

"header header"

"sidebar main"

"footer footer";

当前侧边栏位于左侧,主区域内容位于右侧,如果需要,也可以轻松更改顺序。

有一件事要注意:这些名字需要“连接”到样式上。所以需要在 header block 中,添加 grid-area: header;。

header{
    grid-area: header;
    padding: 20px 0;
    display: grid;
    grid-template-columns: 1fr 1fr;
}

HTML 结构与 Flexbox 示例中的相同,但 CSS 与创建网格布局完全不同。

.container{
    max-width: 900px;
    background-color: #fff;
    margin: 0 auto;
    padding: 0 60px;
    display: grid;
    grid-template-columns: 1fr 3fr;
    grid-template-areas:
        "header header"
        "sidebar main"
        "footer footer";
    grid-gap: 50px;
}

使用 CSS Grid 布局时,在 container 中设置 display: grid; 非常重要。此处声明 grid-template-columns,是为了确保页面的整体结构。这里 grid-template-column 已将侧边栏和主内容区域大小设置为 1fr 和 3fr。fr 是网格的分数单位。

接下来,需要调整 header 容器中的 fr 单元。将 grid-template-columns 设置为 1fr 和 1fr。这样 header 中就有两个相同大小的列,放置导航项和按钮会很合适。

header{
    grid-area: header;
    display: grid;
    grid-template-columns: 1fr 1fr;
}

要放置按钮,我们只需要将 justify-self 设置为 end。

header button {
    justify-self: end;
}

导航的位置按照以下方式设置:

header nav {
    justify-self: start;
}

使用 Flexbox 和 CSS Grid 创建布局

最后,我们通过组合 Flexbox 和 CSS Grid 来创建更复杂的布局。

基本的布局如下图所示:

这种布局需要在行和列两个方向上保持一致,所以使用 CSS Grid 实现整体布局十分有效。

规划对于布局的实现来说,十分重要。

接下来看看代码如何一步步实现。首先 display: grid; 是基本设置,其次内容块之间的间距,可以通过 grid-column-gap 和 grid-row-gap 实现。

.container {
  display: grid;
  grid-template-columns: 0.4fr 0.3fr 0.3fr;
  grid-column-gap: 10px;
  grid-row-gap: 15px;
}
  • 列和行布局

Header 部分横跨所有的列。

.header {
  grid-column-start: 1;
  grid-column-end: 4;
  grid-row-start: 1;
  grid-row-end: 2;
  background-color: #d5c9e2;
}

也可以使用简写,起始值和结束值位于同一行上,并用斜杠分隔。就像这样:

.header {
  grid-column: 1 / 4;
  grid-row: 1 / 2;
  background-color: #55d4eb;
}

完成网格布局的构建之后,微调内容就是下一步。

  • 导航

Flexbox 非常适合放置 header 元素。基本的 header 布局需要设置 justify-content: space-between。

上面的 CSS Grid 布局示例中,需要在导航栏设置 justify-self:start;,在按钮设置 justify-self: end;,但是如果使用 Flexbox,导航的间距会变得很容易设置。

.header {
  grid-column: 1 / 4;
  grid-row: 1 / 2;
  color: #9f9c9c;
  text-transform: uppercase;
  border-bottom: 2px solid #b0e0ea;
  padding: 20px 0;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
  • 列内容网格

将所需的元素排列在一个方向上,意味所有元素都处在同一横向维度,通常Flexbox是实现这种布局的更好选择。此外,Flexbox 可以动态调整元素。使用 Flexbox,可以将所有元素连成一条直线,这也确保了所有元素都具有相同的高度。

  • 带有文本和按钮的行内容

下图是包含了“额外”文本和按钮的三个区域。Flexbox 可以轻松设置三列的宽度。

.extra {
  grid-column: 2 / 4;
  grid-row: 4 / 5;
  padding: 1rem;
  display: flex;
  flex-wrap: wrap;
  border: 1px solid #ececec;
  justify-content: space-between;
}

设计方法总结

以上的布局设计中,使用了 CSS Grid 来进行整体布局(以及设计中的非线性部分)。对于网格内容区域的设计,使用 Flexbox 进行样式的排序和微调会更容易实现。

原文链接:https://getflywheel.com/layout/combine-flexbox-and-css-grids-for-layouts-how-to/

转载请注明出自:葡萄城控件

关于葡萄城

葡萄城是全球控件行业领导者,世界领先的企业应用定制工具、企业报表和商业智能解决方案提供商,为超过75%的全球财富500强企业提供服务。

时间: 2024-10-05 04:58:14

如何使用Flexbox和CSS Grid,实现高效布局的相关文章

你不需要基于 CSS Grid 的栅格布局系统

在过去的几个星期里,我开始看到基于 CSS Grid 的布局框架和栅格系统的出现.我们惊讶它为什么出现的这么晚.但除了使用 CSS Grid 栅格化布局,我至今还没有看到任何框架能提供其他有价值的东西.他们沉醉于模仿过去的做法,而不是着眼于未来.这使得发展受到限制.其中一个常见的问题就是,这些框架仍需要在标记语言中使用行包装器. 为什么 Grid 有些不同? Grid 是一个栅格系统.它允许你在 CSS 中定义列和行,而不需要在标记语言中定义它们.你不需要其他工具帮助你实现一个看起来像栅格的效果

css grid 随笔

原文出自Arien的博客https://www.w3cplus.com/css3/line-base-placement-layout.html 首先定义一个网格 1.可以给父容器的display属性设置为grid或者inline-grid来定义一个网格.这样你就可以使用grid-template-columns和grid-template-rows属性来创建一个网格. .wrapper { display: grid; grid-template-columns: 100px 10px 100

各个浏览器开启CSS Grid Layout的方式

2017年3月,Chrome.Firefox将开启默认支持. 当然对于很多人等不及浏览器默认支持,想提前体验一把,这里提供一些打开方式: 1.Chrome 在浏览器中输入:chrome://flags/#enable-experimental-web-platform-features 然后,对第一个实验性网络平台功能,点击启用. 然后重启浏览器,然后便能体验到了. 2.Opera 在浏览器中输入:opera://flags/#enable-experimental-web-platform-f

利用扩展双屏技术及Chrome浏览器,快速剖析优秀网页Div及CSS构成,并高效实现原型创作

Cocos2d-x移植到Android平台编译的两个文件Android.mk和Application.mk 2014年6月11日 本篇博客主要讲NDK编译Android项目的两个文件Android.mk和Application.mk,笔者在使用NDK编译Cocos2d-x生成的Android项目的时候遇到配置编译环境的问题,网上虽然有些配置教程,但并未把一些原理性的东西描述清楚,虽然有时候可以把编译环境配置成功了,但并不了解为什么要这么来配,有时候出现问题也无从下手去查.笔者是带着疑问去配置ND

Flexbox制作CSS布局实现水平垂直居中

Flexbox实现一个div元素在body页面中水平垂直居中: <!DOCTYPE html><html lang="en"><head>  <meta charset="utf-8"/>  <title>Flexbox制作CSS布局实现水平垂直居中</title>  <style type="text/css">    html {      height: 1

CSS Grid layout布局

CSS Grid布局 (又名"网格"),是一个基于二维网格布局的系统,主要目的是改变我们基于网格设计的用户接口方式.你只需要定义一个容器元素并设置display:grid,使用grid-template-columns 和 grid-template-rows属性设置网格的列与 行的大小,然后使用grid-column 和 grid-row属性将其子元素放入网格之中.目前还处于 W3C 的工作草案之中,并且默认情况下,还不被所有的浏览器所支持.出于示例演示,建议你使用启用了特殊标志的

css grid layout简介

为什么我们需要grid布局? 在web发展过程中,诞生了很多精妙的布局方式. 在web 1.0时代,网页只负责静态地展示文字和图片等简单信息,当时流行的是table布局,table布局能够轻而易举地对齐页面内容,而且能兼容各大浏览器.但其也有很大但缺点:1. table用作布局,而不是展示表格数据,使得html语义不明确:2. 要花较大的经历去修改页面内容,比如加一列,就需要修改table每一行html或css,增加维护成本:3. 很难做响应式. 后来css技术壮大,流行趋势转向div+css布

web前端入门到实战:CSS自定义属性+CSS Grid网格实现超级的布局能力

最近我还注意到的一件事就是CSS自定义属性.CSS自定义属性的工作方式有点像SASS和其他预处理器中的变量,主要的区别在于其它方法都是在浏览器中编译后生成,还是原本的CSS写法.CSS自定义属性是真正的动态变量,可以在样式表中或使用javascript即时更新,这使得它们具有更多的可能性.如果你熟悉JavaScript,我喜欢把预处理器变量和CSS自定义属性之间的区别想象成与const和let之间的区别相似--它们都有不同的用途. CSS自定义属性可以方便的实现很多功能(例如主题变化).最近我一

CSS Grid 网格布局教程

一.概述 网格布局(Grid)是最强大的 CSS 布局方案. 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局.以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了. 上图这样的布局,就是 Grid 布局的拿手好戏. Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个项目的位置.但是,它们也存在重大区别. Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局.Grid 布局则是将容器划分成"行"