如何使用 flexbox 将网页分成四个部分?

Posted

技术标签:

【中文标题】如何使用 flexbox 将网页分成四个部分?【英文标题】:How to divide a webpage into four parts using flexbox? 【发布时间】:2018-01-28 07:54:27 【问题描述】:

如何使用 flex box 将网页分成四等份?像这个网站-www.rileyjshaw.com

这些列应该能够在较小的视口上相互堆叠。

编辑/更新:

到目前为止,我已经尝试过这个- 我应该改变行高吗?如何实现不同的块?

/* Grid */

.column 
  flex-basis: 100%;
  width: 50%;
  height: 50%;
  line-height: 200px;


@media screen and (min-width: 800px) 
  .row 
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
  
  .column 
    flex: 1;
  
  ._25 
    flex: 2.5;
  
  ._5 
    flex: 5;
  



/* Style */

body 
  font-family: 'Lato', sans-serif;
  font-size: 1.3em;
  color: #ccc;
  background: #000;
  /*margin-bottom: 70px;*/


.column 
  /* padding: 15px;
  border: 1px solid #666;
  margin: 5px 0;*/
  background: #343436;


main 
  max-width: 1200px;
  margin: 0 auto;


h1,
h2 
  text-align: center;
<div class="row">
  <div class="column">
    50%
  </div>
  <div class="column">
    50%
  </div>
</div>
<div class="row">
  <div class="column">
    50%
  </div>
  <div class="column">
    50%
  </div>
</div>

【问题讨论】:

您自己尝试过吗? @Dekel 更新了问题。 【参考方案1】:

您可以简化代码并获得所需的输出。在这里,我删除了 row's 并使用了一个容器。这种结构的主要好处是,如果您认为有必要,您可以更改的顺序。

我还选择使用 flex-basis 而不是 flex-grow 以使它们保持 50% 的宽度,无论其内容大小如何。

在更宽的屏幕上,使用媒体查询,将列的设置为 50% 宽,并将 container 设置为 display: flex; flex-wrap: wrap;

在较窄的屏幕上,作为块元素,它们默认堆叠在一起

html, body 
  height: 100%;
  margin: 0;

.container 
  height: 100%;

.column 
  height: 25%;


@media screen and (min-width: 600px) 
  .container 
    display: flex;
    flex-wrap: wrap;
  
  .column 
    flex-basis: 50%;
    height: 50%;
  



/* general styles */
body 
  font-family: 'Lato', sans-serif;
  font-size: 1.3em;
  color: #ccc;
  background: #000;
  /*margin-bottom: 70px;*/


.column 
  padding: 15px;
  /*border: 1px solid #666;*/
  box-sizing: border-box;


.column:nth-child(1) 
  background: #5c9;

.column:nth-child(2) 
  background: #fb0;

.column:nth-child(3) 
  background: #39f;

.column:nth-child(4) 
  background: #f33;


main 
  max-width: 1200px;
  margin: 0 auto;


h1,
h2 
  text-align: center;
<div class="container">
  <div class="column">
    50%
  </div>
  <div class="column">
    50%
  </div>
  <div class="column">
    50%
  </div>
  <div class="column">
    50%
  </div>
</div>

如果您仍然需要原始标记结构,这里也有一个示例

html, body 
  height: 100%;
  margin: 0;

.row 
  height: 50%;

.column 
  height: 50%;


@media screen and (min-width: 600px) 
  .row 
    display: flex;
  
  .column 
    flex-basis: 50%;
    height: 100%;
  



/* general styles */
body 
  font-family: 'Lato', sans-serif;
  font-size: 1.3em;
  color: #ccc;
  background: #000;
  /*margin-bottom: 70px;*/


.column 
  padding: 15px;
  /*border: 1px solid #666;*/
  box-sizing: border-box;


.row:nth-child(1) .column:nth-child(1) 
  background: #5c9;

.row:nth-child(1) .column:nth-child(2) 
  background: #fb0;

.row:nth-child(2) .column:nth-child(1) 
  background: #39f;

.row:nth-child(2) .column:nth-child(2) 
  background: #f33;


main 
  max-width: 1200px;
  margin: 0 auto;


h1,
h2 
  text-align: center;
<div class="row">
  <div class="column">
    50%
  </div>
  <div class="column">
    50%
  </div>
</div>
<div class="row">
  <div class="column">
    50%
  </div>
  <div class="column">
    50%
  </div>
</div>

根据评论更新

居中列的内容可以通过i.e.来完成:

弹性盒 - https://jsfiddle.net/0ns6ofcp/

.column 
  height: 25%;  
  display: flex;                         /*  added  */
  justify-content: center;               /*  hor. center  */
  align-items: center;                   /*  ver. center  */

变换 - https://jsfiddle.net/0ns6ofcp/1/

<div class="column">
  <div>50%</div>
</div>

.column 
  position: relative;                 /*  added property  */
  height: 25%;  

.column > div                        /*  added rule  */
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%,-50%);

【讨论】:

@Dekel 谢谢 :) @LGSon 我无法在列内居中文本(水平和垂直)。我试过这个位置:绝对;最高:50%;左:50%;右边距:-50%;变换:翻译(-50%,-50%) @uitwaa 既然您已经使用了 Flexbox,请将其也添加到 ,如下所示:jsfiddle.net/0ns6ofcp ...如果要使用 transform,请这样做: jsfiddle.net/0ns6ofcp/1 非常感谢!【参考方案2】:

你可以从这里开始:

/* Grid */

.column 
  flex-basis: 100%;
  height: 50vh;

.row 
  display: flex;

.row:first-child .column:first-child 
  background: red;

.row:first-child .column:last-child 
  background: blue;

.row:last-child .column:first-child 
  background: green;

.row:last-child .column:last-child 
  background: black;

/* Style */
body 
  font-family: 'Lato', sans-serif;
  font-size: 1.3em;
  color: #ccc;
  background: #000;


.column 
  background: #343436;
<div>
  <div class="row">
    <div class="column">
      50%
    </div>
    <div class="column">
      50%
    </div>
  </div>
  <div class="row">
    <div class="column">
      50%
    </div>
    <div class="column">
      50%
    </div>
  </div>
</div>

【讨论】:

我猜这些不是不同的列。添加 ".column+.column background: blue;" 并将颜色应用于 2 cols 而不是 1 我不确定您所说的“不同的列”是什么意思。你能解释一下吗? 4 个具有不同颜色/内容的不同列 谢谢!随着视口大小的减小,如何将列相互堆叠?

以上是关于如何使用 flexbox 将网页分成四个部分?的主要内容,如果未能解决你的问题,请参考以下文章

什么是分位数,如何计算分位数?

Xcode11中用Objective-C将UITableView分成几个部分

将一个复杂的字符串分成 3 个部分

什么是盒模型?

如何将范围分成N部分

CSS flexbox:使用深度嵌套的图像来摊销不断变化的布局尺寸