如何用 Flexbox 构建一个新闻网站布局

本文讲的是如何用 Flexbox 构建一个新闻网站布局,


你将要创建的东西

在你刚接触 Flexbox 的时候没有必要理解关于 Flexbox 的 所有 方面。在这篇教程中,我们将介绍 Flexbox 的一些新特性。同时设计一种新的、像 The Guardian 一样的布局方式。

我们使用 Flexbox 是因为它提供了许多强大的特性:

  • 我们可以通过简单的方式来实现响应式的纵列
  • 我们可以使列等高
  • 我们可以把内容塞入容器的 底部

我们开始吧!

1. 用两个列开始

在 CSS 中创建列一直是一个挑战。在很长的一段时间里,唯一的选择是使用 float 或者 table,但是这两种方法都有各自的问题。

Flexbox 使流程更加简单,提供了如下:

  • 简洁的代码:我们仅仅只需要在容器了添加 display: flex
  • 不需要去 清除 float, Flexbox 避免出现无法预料的布局行为
  • 语义标记
  • 灵活性:我们可以用很少的 CSS 代码来调整列的尺寸、伸缩和对齐方式

让我们从创建两个列开始:一个占容器的 2/3 宽度,另一个占 1/3 。

<div class="columns">
  <div class="column main-column">
    2/3 column
  </div>
  <div class="column">
    1/3 column
  </div>
</div>

这里有两个元素:

  1. 一个 columns 容器
  2. 两个 column 子容器,其中一个添加名为 main-column 的 class 来使它更宽。

    .columns { display: flex; }

    .column { flex: 1; }

    .main-column { flex: 2; }

因为 main-column 的 flex 值设为了 2 ,它将会占用其他列的两倍的空间。

通过添加一些视觉效果,我们将得到:

<iframe src="https://codepen.io/tutsplus/embed/gMbpQM/?height=200&theme-id=12451&default-tab=result" width="850" height="200" frameborder="no" allowfullscreen="true" scrolling="no"></iframe>

2. 把每一列都变成 Flexbox 容器

这两列中的每一个都会垂直地堆积数篇文章,所以我们打算也把 column 元素移到 Flexbox 容器中。我们想要:

  • 文章被垂直堆积
  • 文章可 拉伸 并且可用

    .column { display: flex; flex-direction: column; /* 确保文章垂直堆积 */ }

    .article { flex: 1; /* 拉伸文章填充整个保留空间 */ }

容器 上的 flex-direction: column 规则合并了 子容器 上的 flex: 1 规则来确保文章可以充满整个垂直空间,也保证了两个第一列有相同的高度。

<iframe src="https://codepen.io/tutsplus/embed/PzwqXG/?height=400&theme-id=12451&default-tab=result" width="850" height="400" frameborder="no" allowfullscreen="true" scrolling="no"></iframe>

3. 把每一篇文章都变成 Flexbox 容器

现在,为了给我们额外的控制,我们要把每一篇文章移到 Flexbox 容器下。这些文章都包含:

  • 一个标题
  • 一段报道
  • 一个带有作者和评论数量的信息栏
  • 一张可选的响应图片

我们在这里使用 Flexbox 是为了把信息栏塞入底部。作为参照,这是我们的目标文章布局:

![](https://cms-assets.tutsplus.com/uploads/users/30/posts/26611/image/card.png)

这里是代码:

<a class="article first-article">
  <figure class="article-image">
    <img src="">
  </figure>
  <div class="article-body">
    <h2 class="article-title">
      <!-- 标题 -->
    </h2>
    <p class="article-content">
      <!-- 内容 -->
    </p>
    <footer class="article-info">
      <!-- 信息 -->
    </footer>
  </div>
</a>

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

.article-body {
  display: flex;
  flex: 1;
  flex-direction: column;
}

.article-content {
  flex: 1; /* 这将使文本填充保留空间,并且把信息栏塞入底部 */
}

多亏了 flex-direction: column; 规则,文章的元素都被垂直排列了。

我们给 article-content 元素使用 flex: 1 因此它可以填充整个空白空间,然后把 article-info 塞入底部,无论列的高度如何。

<iframe src="https://codepen.io/tutsplus/embed/RRNWNR/?height=500&theme-id=12451&default-tab=result" width="850" height="500" frameborder="no" allowfullscreen="true" scrolling="no"></iframe>

4. 添加一些嵌套列

在左边一列,我们真正想要的是 另一组 列。所以我们使用之前相同的 columns 容器来替换第二个文章。

<div class="columns">
  <div class="column nested-column">
    <a class="article">
      <!-- 文章内容 -->
    </a>
  </div>

  <div class="column">
    <a class="article">
      <!-- 文章内容 -->
    </a>
    <a class="article">
      <!-- 文章内容 -->
    </a>
    <a class="article">
      <!-- 文章内容 -->
    </a>
  </div>
</div>

因为我们想要第一个嵌套列更宽一些,所以我们在附加效果中加入了 nested-column class: .nested-column { flex: 2; }

这将使新创建列的宽度是其他列的两倍。

<iframe src="https://codepen.io/tutsplus/embed/wWBKaq/?height=500&theme-id=12451&default-tab=result" width="850" height="500" frameborder="no" allowfullscreen="true" scrolling="no"></iframe>

5. 给第一篇文章一个水平布局

第一篇文章太大了。为了优化使用空间,让我们把它的布局变成水平的。

.first-article {
  flex-direction: row;
}

.first-article .article-body {
  flex: 1;
}

.first-article .article-image {
  height: 300px;
  order: 2;
  padding-top: 0;
  width: 400px;
}

这里的 order 属性非常有用,因为它允许我们不用影响 HTML 标记就可以修改 HTML 元素的顺序。这里的 article-image 在标记中实际上在 article-body 之前,但是它表现得好像在之后一样。

<iframe src="https://codepen.io/tutsplus/embed/VjYvve/?height=500&theme-id=12451&default-tab=result" width="850" height="500" frameborder="no" allowfullscreen="true" scrolling="no"></iframe>

6. 使布局可响应

这就是我们想要的所有效果,虽然看起来有点破碎。让我们通过响应式来修复它。。

Flexbox 一个非常好的特性是:如果想让 Flexbox 完全失效,你仅仅只需要移除容器上的 display: flex 规则即可,其他的所有 Flexbox 属性(比如 align-items 或者 flex)完全可以保留。

这样一来,仅通过某一特定断点就能触发 “响应式” 布局。

我们将从 .columns 和 .column 上移除 display: flex ,而不是把它们放入 Media Query (响应式布局)中。

@media screen and (min-width: 800px) {
  .columns,
  .column {
    display: flex;
  }
}

这就是了!在更小的屏幕上,所有的文章都在另一篇文章的上面。超过 800px 时,它们将会排列成两列。

7. 添加一些结束的润色

为了让布局在更大屏设备适应,让我们对 CSS 做一些微调:

@media screen and (min-width: 1000px) {
  .first-article {
    flex-direction: row;
  }

  .first-article .article-body {
    flex: 1;
  }

  .first-article .article-image {
    height: 300px;
    order: 2;
    padding-top: 0;
    width: 400px;
  }

  .main-column {
    flex: 3;
  }

  .nested-column {
    flex: 2;
  }
}

第一篇文章的内容是横向布局的,其中文字在左边,图片在右边。同样,主列更宽( 75% ),嵌套列也是 ( 66% )。这就是最终效果了!

<iframe src="https://codepen.io/tutsplus/embed/Wxbvdp/?height=500&theme-id=12451&default-tab=result" width="850" height="500" frameborder="no" allowfullscreen="true" scrolling="no"></iframe>

结论

我希望我已经展示给你了:在你刚接触 Flexbox 的时候没有必要理解关于 Flexbox 的所有方面。这个可响应的新闻布局是一个非常有用的模版;拆解并且尝试一下,看看你掌握了多少!





原文发布时间为:2016年06月12日


本文来自合作伙伴掘金,了解相关信息可以关注掘金网站。

时间: 2024-08-04 11:35:35

如何用 Flexbox 构建一个新闻网站布局的相关文章

实践操作:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器

TensorFlow对象检测API是一个建立在TensorFlow之上的开源框架,可以轻松构建,训练和部署对象检测模型. 到目前为止,API的性能给我留下了深刻的印象.在这篇文章中,我将API的对象设定为一个可以运动的玩具.本文将用六个步骤突出API的性能并教你如何构建一个玩具探测器,你也可以根据这六个步骤扩展与实践你想要构建的任何单个或多个对象检测器. 玩具检测器 代码在我的GitHub repo上. 地址:https://github.com/priya-dwivedi/Deep-Learn

网站建设寻求突破 构建一个符合seo的站点

如何构建一个符合seo优化的站点,是seo人员梦寐以求的想法,但实现起来却没有那么简单,网站上线前感觉良好,网站上线后,这样或那样的问题不断在网站中出现,做好一个网站不仅仅需要有牛逼的建站技术,而且还需要有合理的seo优化思维,打造一个符合seo优化的站点从五点做起: 一.寻找同行业参考站点 没有一个网站作为参考标准,完全凭空想象估计会让人走火入魔,想象很美好,但真正要实施时,就会发现很多瓶颈阻碍我们,根据自己的亲身体验,在网站建设前期应该寻找同行业相关的站点,作为自己的网站参考网站,特别是那些

已知一个面的各个角坐标如何用VB判断一个点是否在面之内?

问题描述 已知一个面的各个角坐标如何用VB判断一个点是否在面之内? 已知一个面的各个角坐标如何用VB判断一个点是否在面之内? 已知一个面的各个角坐标如何用VB判断一个点是否在面之内? 解决方案 从图形外部构建一个直线方程,到这个点,看和你的曲线有几个交点,偶数个就在内部,奇数个就在外部. 解决方案二: 可以根据在直线的左边还是右边来判断,用向量的叉乘来做就行了. 解决方案三: caozhy给的方法很好啊.以前学过现在都不知道了,呵呵.这样就不用管面是几边形了.

《 产品设计思维:电商产品设计全攻略》一一3.4 如何构建一个具有品牌冲击力的优秀首页

3.4 如何构建一个具有品牌冲击力的优秀首页3.4.1 优秀首页的衡量标准要想构建一个优秀的电商首页,前面提到的对各方面的深入调研是关键,即使因为条件限制而没有充分的调研基础,也应该利用"经营假设"为设计提供结论参考,这项工作开展的好坏直接决定了首页是否符合商业价值的预期.我认为一个优秀的电商首页,首先要是产品服务上的成功,其次才是视觉.技术等产品质量上的成功,而这两者又是相辅相成的,但关注的焦点应重点放在服务设计上.产品服务上的成功,关键要识别清楚潜在目标用户的需求与企业自身经营的需

如何用C++编写一个服务器和用户之间的共享内存管理程序

问题描述 如何用C++编写一个服务器和用户之间的共享内存管理程序 主要的功能就是建立一个服务器,新建两个容器,一个用来存放用户的ID(对应内存),插入操作之后遍历,看是否插入成功:一个用于服务器存放这些ID:在用户插入成功后服务器将他拷贝到这里,然后遍历,看是否插入成功:然后出现查内存进行标记. 要用到stl,共享内存,多线程这块. 请各位大大给点意见啊,谢谢.:) 完美解决的小弟会意思意思的. 解决方案 这些信息都可以放到服务器,用STL的map等来维护 解决方案二: 首先你要定义一个服务器与

Python中的线性优化,第 2 部分 在云中构建一个可扩展的基础架构

简介 这个由三部分组成的系列文章的第 1 部分介绍了在 Python 中使用 Pyomo 库进行线性优化的 基础知识.现在我们将介绍如何扩展它.Python 缺乏真实的操作系统线程,该如何扩展它?本文将向您介绍 如何组合使用这些技术来创建一个实际的可扩展基础架构,该架构可用于构建一个 Pyomo Web 解决方案.我 们组合使用了一个单线程事件循环.一个 AMQP 服务器和工作线程流程来创建一个模式,利用该模式扩展一个 线性优化系统.该基础架构也适用于 Python 或 Ruby 中的许多通用计

先做点好事,转点东东来,用PHP和MySQL构建一个数据库驱动的网站(-)

mysql|数据|数据库 摘要 在这篇文章中,我们会着手解决在构建一个数据库驱动的网站的过程中将会遇到的问题.而我们只会使用两个新的工具,PHP和MySQL.如果你的Web主机支持PHP/MySQL,那么你会省掉不少麻烦.如果不是这样,你也不用提心,我们也会学习如何在Unix和Windows下安装相应程序. 这篇文章是提供给那些有可能学会服务器端程序开发的中高级的网页设计者的.我们会认为我们的读者熟悉HTML,所以我们在使用HTML时不会给出什么解释.另外,在有些地方我们可能还会用到少量的Jav

用PHP和MySQL构建一个数据库驱动的网站(十)

mysql|数据|数据库 在我们目前的情况下,我们所需要的列是Jokes表中的JokeText列以及Authors表中的Name列和Email列.Jokes表和Authors表的关联条件是Jokes表中的AID列的值等于Authors表中的ID列的值.下面是一个连接的例子(前两个查询只是用来显示我们的两个表中所包含的内容): mysql> SELECT LEFT(JokeText,20), AID FROM Jokes;+----------------------+------+| LEFT(

腾讯QQ设计师谈如何构建一个更轻巧的开发流程

网页制作Webjx文章简介:腾讯设计师谈敏捷开发. 腾讯一直推广敏捷开发,也在强调敏捷开发,但你会发现,即便如此,还是会陷入以下情景 又丑又长的讨论会 好像人手永远不够 不切实际的想法 悬而不决的功能点 无穷尽的偏好设置 越来越多纠缠不清的细节 项目依然延期 我们如何构建一个更轻巧的开发流程,让我们更快更好的交付结果?作为一个设计师,如何成为敏捷的一分子?以下是一些心得方法,希望和大家分享 1 界面先行 作为设计师,最简单能让大家明白你的想法就是先把它画出来,不要用晦涩的语言和结构图,毕竟不是所