澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:落实高效布局,通过更

通过生成内容和CSS网格布局为空单元格添加样式

2018/06/13 · CSS · 网格布局

原文出处: [Rachel

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

2017/09/21 · CSS · Flexbox

原文出处: 葡萄城控件   

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

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

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

 

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

 

一行 CSS 代码实现响应式布局 – 使用 Grid 实现的响应式布局

CSS 巧用 :before和:after

2016/02/14 · CSS澳门新浦京娱乐场网站:落实高效布局,通过更动内容和CSS网格布局为空单元格增加样式。 · 1 评论 · after, before

原文出处: 野兽'   

前几天的晚上较全面的去看了下css的一些文档和资料,大部分的样式运用都没什么大问题了,只是有些许较陌生,但是也知道他们的存在和实现的是什么样式。今天主要想在这篇学习笔记中写的也不多,主要是针对:before和:after写一些内容,还有几个小样式略微带过的介绍下。
什么是:before和:after? 该如何使用他们?
:before是css中的一种伪元素,可用于在某个元素之前插入某些内容。
:after是css中的一种伪元素,可用于在某个元素之后插入某些内容。
下面我们先跑个简单的代码测试下效果:

XHTML

<style> p:before{ content: "H" /*:before和:after必带技能,重要性为满5颗星*/ } p:after{ content: "d" /*:before和:after必带技能,重要性为满5颗星*/ } </style> <p>ello Worl</p>

1
2
3
4
5
6
7
8
9
<style>
    p:before{
        content: "H"  /*:before和:after必带技能,重要性为满5颗星*/
    }
    p:after{
        content: "d"  /*:before和:after必带技能,重要性为满5颗星*/
    }
  </style>
  <p>ello Worl</p>

以上的代码将会在页面中展现的是”Hello World”。我们通过浏览器的”审查元素”看到的内容是:

XHTML

<p> ::before "ello Worl" ::after </p>

1
2
3
4
5
<p>
  ::before
  "ello Worl"
  ::after
</p>

p标签内部的内容的前面会被插入一个:before伪元素,该伪元素内包含的内容是”H”;而在p标签内的内容后面会被插入一个:after伪元素,该元素包含的内容是”d”。作为一只合格的程序猴子,捍卫”Hello World”的完整存在是必要的。
既然笔记主要针对是:before和:after,那么肯定不会只是仅仅有以上的简单介绍就完事。下面我们看看平常该怎么使用他们。
1.结合border写个对话框的样式。
本兽将上面这句话拆成2部分:结合border,写个对话框的样式。
既然是结合border,那么我们先转个小话题,简单由浅入深的介绍下怎么用border画三角形样式(这个三角形在写对话框样式的时候需要):

XHTML

<style> .triangle{ width: 0; height: 0; border-left:50px solid red; border-bottom:50px solid blue; border-top:50px solid black; border-right:50px solid purple } </style> <div class="triangle"></div>

1
2
3
4
5
6
7
8
9
10
11
<style>
    .triangle{
        width: 0;
        height: 0;
        border-left:50px solid red;
        border-bottom:50px solid blue;
        border-top:50px solid black;
        border-right:50px solid purple
    }
  </style>
  <div class="triangle"></div>

以上代码将会在页面上展示一个正方形,左边是个红色的三角形,右边是紫色的三角形,上面是黑色的三角形,下面是蓝色的三角形。那么有人就会问,我们要的不是三角形么?野兽你画个正方形逗我呢?
我们对上面的样式做些修改:

CSS

.triangle{ width: 0; height: 0; border:50px transparent solid; /*这里我们将元素的边框宽度设置为50px,transparent表示边框颜色是透明的,solid表示边框是实线的*/ border-top-color: black; /*这里我们仅将上边框的颜色设置为黑色,众所周知,css后面的样式代码会覆盖之前的相同的样式代码,至于其他三边的还是透明色*/ /*border-bottom-color: black; /*这里设置底部边框色为黑色*/ border-left-color: black; /*这里设置左边边框色为黑色*/ border-right-color:black*/ /*这里设置右边边框色为黑色*/ }

1
2
3
4
5
6
7
8
9
.triangle{
      width: 0;
      height: 0;
      border:50px transparent solid; /*这里我们将元素的边框宽度设置为50px,transparent表示边框颜色是透明的,solid表示边框是实线的*/
      border-top-color: black;  /*这里我们仅将上边框的颜色设置为黑色,众所周知,css后面的样式代码会覆盖之前的相同的样式代码,至于其他三边的还是透明色*/
      /*border-bottom-color: black; /*这里设置底部边框色为黑色*/
      border-left-color: black;  /*这里设置左边边框色为黑色*/
      border-right-color:black*/ /*这里设置右边边框色为黑色*/
  }

然后这时我们就会看到一个在顶部的方向向下的三角形。解释已详细的写在css样式的注释里。
接下来我们加上:before:

CSS

<style> .test-div{ position: relative; /*日常相对定位*/ width:150px; height:36px; border-radius:5px; border:black 1px solid; background: rgba(245,245,245,1) } .test-div:before{ content: ""; /*:before和:after必带技能,重要性为满5颗星*/ display: block; position: absolute; /*日常绝对定位*/ top:8px; width: 0; height: 0; border:6px transparent solid; left:-12px; border-right-color: rgba(245,245,245,1); } </style> <div class="test-div"></div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<style>
    .test-div{
        position: relative;  /*日常相对定位*/
        width:150px;
        height:36px;
        border-radius:5px;
        border:black 1px solid;
        background: rgba(245,245,245,1)
    }
    .test-div:before{
        content: "";  /*:before和:after必带技能,重要性为满5颗星*/
        display: block;
        position: absolute;  /*日常绝对定位*/
        top:8px;
        width: 0;
        height: 0;
        border:6px transparent solid;
        left:-12px;
        border-right-color: rgba(245,245,245,1);
    }
  </style>
  <div class="test-div"></div>

通过以上代码,我们将会看见一个类似微信/QQ的对话框样式,但是美中不足的是,在对话框的四周的边框不是完整的,而是在对话框的突出三角形上是木有边框的T_T瞬间冷场有木有,该怎么办呢?让召唤:after穿着棉大衣来救场吧~
完整代码:

CSS

<style> .test-div{ position: relative; /*日常相对定位*/ width:150px; height: 36px; border:black 1px solid; border-radius:5px; background: rgba(245,245,245,1) } .test-div:before,.test-div:after{ content: ""; /*:before和:after必带技能,重要性为满5颗星*/ display: block; position: absolute; /*日常绝对定位*/ top:8px; width: 0; height: 0; border:6px transparent solid; } .test-div:before{ left:-11px; border-right-color: rgba(245,245,245,1); z-index:1 } .test-div:after{ left:-12px; border-right-color: rgba(0,0,0,1); z-index: 0 } </style> <div class="test-div"></div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<style>
    .test-div{
        position: relative;  /*日常相对定位*/
        width:150px;
        height: 36px;
        border:black 1px solid;
        border-radius:5px;
        background: rgba(245,245,245,1)
    }
    .test-div:before,.test-div:after{
        content: "";  /*:before和:after必带技能,重要性为满5颗星*/
        display: block;
        position: absolute;  /*日常绝对定位*/
        top:8px;
        width: 0;
        height: 0;
        border:6px transparent solid;
    }
    .test-div:before{
        left:-11px;
        border-right-color: rgba(245,245,245,1);
        z-index:1
    }
    .test-div:after{
        left:-12px;
        border-right-color: rgba(0,0,0,1);
        z-index: 0
    }
  </style>
  <div class="test-div"></div>

好了,完整的一个对话框样式呈现在眼前了,至于对话框的小三角形的方向,相信大家看了上上段对于border介绍的代码也都知道该怎么做了吧,没错,就是改下position的位置,改下border显示颜色的方位~ (本兽不喜欢贴图片,体谅下额,需要的可以拷贝代码直接运行看效果,造轮子不仅仅是造轮子,也能让人加深印象,更好的理解)
2.作为内容的半透明背景层。
比如我们的需求是做一个半透明的登录框吧(这里也是在代码中通过注释来解释):

CSS

<style> body{ background: url(img/1.jpg) no-repeat left top /*这里本兽加了个图片背景,用以区分背景的半透明及内容的完全不透明*/ } .test-div{ position: relative; /*日常相对定位(重要,下面内容也会介绍)*/ width:300px; height: 120px; padding: 20px 10px; font-weight: bold; } .test-div:before{ position: absolute; /*日常绝对定位(重要,下面内容也会略带介绍)*/ content: ""; /*:before和:after必带技能,重要性为满5颗星*/ top:0; left: 0; width: 100%; /*和内容一样的宽度*/ height: 100%; /*和内容一样的高度*/ background: rgba(255,255,255,.5); /*给定背景白色,透明度50%*/ z-index:-1 /*日常元素堆叠顺序(重要,下面内容也会略带介绍)*/ } </style> <!--这里容兽偷个懒,布局简单写写--> <div class="test-div"> <table> <tr> <td>Name</td> <td><input placeholder="your name" /></td> </tr> <tr> <td>Password</td> <td><input placeholder="your password" /></td> </tr> <tr> <td></td> <td><input type="button" value="login" /></td> </tr> </table> </div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<style>
      body{
          background: url(img/1.jpg) no-repeat left top /*这里本兽加了个图片背景,用以区分背景的半透明及内容的完全不透明*/
      }
      .test-div{
          position: relative;  /*日常相对定位(重要,下面内容也会介绍)*/
          width:300px;
          height: 120px;
          padding: 20px 10px;
          font-weight: bold;
      }
      .test-div:before{
          position: absolute;  /*日常绝对定位(重要,下面内容也会略带介绍)*/
          content: "";  /*:before和:after必带技能,重要性为满5颗星*/
          top:0;
          left: 0;
          width: 100%;  /*和内容一样的宽度*/
          height: 100%;  /*和内容一样的高度*/
          background: rgba(255,255,255,.5); /*给定背景白色,透明度50%*/
          z-index:-1 /*日常元素堆叠顺序(重要,下面内容也会略带介绍)*/
      }
  </style>
  <!--这里容兽偷个懒,布局简单写写-->
  <div class="test-div">
      <table>
          <tr>
              <td>Name</td>
              <td><input placeholder="your name" /></td>
          </tr>
          <tr>
              <td>Password</td>
              <td><input placeholder="your password" /></td>
          </tr>
          <tr>
              <td></td>
              <td><input type="button" value="login" /></td>
          </tr>
      </table>
  </div>

上面的代码拷贝过去,加上张图片可测试效果。
当然,:bofore和:after也还有其他更多的巧妙用法,这里也不一一列出来了,这里放上一个用这两个伪元素加上css3动画实现一些比较好看及实用的动态效果的链接:HoverEffectIdeas
说完了:before和:after,我们稍微扯扯一些其他的css样式及布局注意点(可能大家不怎么注意,从而导致一些布局和样式出问题)。
position 定位的问题
position属性规定了元素的定位类型,默认为static。
该属性还可以有下值:
absolute:生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。
fixed:生成绝对定位的元素,相对于浏览器窗口进行定位。
relative:生成相对定位的元素,相对于其正常位置进行定位。
inherit:规定应该从父元素继承 position 属性的值。
代码:

CSS

<!--position:absolute--> <style> body{ height: 2000px /*这里将body的高度设置为2000px是为了区分absolute和fixed的差别*/ } .test-div{ position:absolute; left:50px; top:50px } </style> <div class="test-div">Hello World</div> <!--position:fixed--> <style> body{ height: 2000px /*这里将body的高度设置为2000px是为了区分absolute和fixed的差别*/ } .test-div{ position:fixed; left:50px; top:50px } </style> <div class="test-div">Hello World</div> <!--position:relative position:absolute--> <style> .out-div{ width: 300px; height: 300px; background: purple; /*这里定义个背景,让我们知道这个div在哪*/ margin:50px 0px 0px 50px; position: relative } .in-div{ position:absolute; left:50px; top:50px } </style> <div class="out-div"> <div class="in-div">Hello World</div> </div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!--position:absolute-->
  <style>
      body{
          height: 2000px  /*这里将body的高度设置为2000px是为了区分absolute和fixed的差别*/
      }
      .test-div{
          position:absolute;
          left:50px;
          top:50px
      }
  </style>
  <div class="test-div">Hello World</div>
<!--position:fixed-->
  <style>
      body{
          height: 2000px  /*这里将body的高度设置为2000px是为了区分absolute和fixed的差别*/
      }
      .test-div{
          position:fixed;
          left:50px;
          top:50px
      }
  </style>
  <div class="test-div">Hello World</div>
<!--position:relative position:absolute-->
  <style>
      .out-div{
          width: 300px;
          height: 300px;
          background: purple;  /*这里定义个背景,让我们知道这个div在哪*/
          margin:50px 0px 0px 50px;
          position: relative
      }
      .in-div{
          position:absolute;
          left:50px;
          top:50px
      }
  </style>
  <div class="out-div">
      <div class="in-div">Hello World</div>
  </div>

z-index 元素堆叠排序
z-index用于设置或检索对象的堆叠顺序,对应的脚本特性为zIndex。
z-index的数值越大,该元素的堆叠层级越高。
代码:

CSS

<style> .first-div{ width: 300px; height: 300px; background: purple; /*这里定义个背景,让我们知道这个div在哪*/ position: absolute; left:50px; top:50px; z-index: 1 } .second-div{ position:absolute; left:80px; top:80px; width:50px; height: 50px; background: white; z-index: 2 } </style> <div class="first-div"></div> <div class="second-div"></div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<style>
      .first-div{
          width: 300px;
          height: 300px;
          background: purple;  /*这里定义个背景,让我们知道这个div在哪*/
          position: absolute;
          left:50px;
          top:50px;
          z-index: 1
      }
      .second-div{
          position:absolute;
          left:80px;
          top:80px;
          width:50px;
          height: 50px;
          background: white;
          z-index: 2
      }
  </style>
  <div class="first-div"></div>
  <div class="second-div"></div>

这里我们将第一个div和第二个div位置放到一起,方便看z-index的效果。以上代码的样式是紫色的正方形里面有个白色的小正方形。因为小正方形的z-index大于大正方形的z-index,所以能显示出,当我们把.first-div的z-index设置为3,这时候就看不到白色的小正方形了,它被紫色的大正方形无情的挡掉了…
zoom 元素缩放比例
zoom适用于所有元素,用于设置或检索对象的缩放比例,对应的脚本特性为zoom,原比例的值是1。
澳门新浦京娱乐场网站:落实高效布局,通过更动内容和CSS网格布局为空单元格增加样式。代码:

CSS

<style> div{ width: 100px; height: 100px; float: left } .first-div{ background: purple; zoom:1.5 } .second-div{ background: black; zoom:1 } .third-div{ background: red; zoom:.5 } </style> <div class="first-div"></div> <div class="second-div"></div> <div class="third-div"></div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<style>
      div{
          width: 100px;
          height: 100px;
          float: left
      }
      .first-div{
          background: purple;
          zoom:1.5
      }
      .second-div{
          background: black;
          zoom:1
      }
      .third-div{
          background: red;
          zoom:.5
      }
  </style>
  <div class="first-div"></div>
  <div class="second-div"></div>
  <div class="third-div"></div>

以上代码将会展示的依次是紫色-黑色-红色的div,大小分别是100px的1.5倍,1倍,0.5倍。
em 和 rem 是什么
1em等于当前的字体尺寸,数值的改变意味着字体大小的调整。em 有继承这个特性,也就是说,外部父元素定义了字体的em大小,内部子元素会继承这一属性的样式。
rem = root em 。顾名思义,root即根部的,顶部的。也就是根部的em,这个根部指的是HTML根元素。所以rem的大小是针对HTML根元素的大小做字体的相对大小的调整。
代码:

CSS

<style> body{ font-size: 12px; } /*html{ font-size: 12px; }*/ div{ width: 200px; height: 100px; float:left } .first-div{ font-size: 1em } .second-div{ font-size: 2em } .third-div{ font-size: 1rem } .fourth-div{ font-size: 2rem } </style> <div class="first-div">Hello World</div> <div class="second-div">Hello World</div> <div class="third-div">Hello World</div> <div class="fourth-div">Hello World</div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<style>
      body{
        font-size: 12px;  
      }
      /*html{
          font-size: 12px;
      }*/
      div{
          width: 200px;
          height: 100px;
          float:left
      }
      .first-div{
          font-size: 1em
      }
      .second-div{
          font-size: 2em
      }
      .third-div{
          font-size: 1rem
      }
      .fourth-div{
          font-size: 2rem
      }
  </style>
  <div class="first-div">Hello World</div>
  <div class="second-div">Hello World</div>
  <div class="third-div">Hello World</div>
  <div class="fourth-div">Hello World</div>

以上代码分别展示了不同大小的字体,em和rem的区别可以通过仅仅注释body字体样式和html字体样式来看看他们之间的差别。

1 赞 8 收藏 1 评论

澳门新浦京娱乐场网站 1

float(浮动)

Andrew]()   译文出处:[众成翻译

KING]()   

新手在使用网格布局时常见的一个问题是:如何对一个不包含任何内容的单元格添加样式。在当前的Level 1规范中还无法做到,因为无法选定空单元格或网格区域并对其添加样式。也就是说,想要设置样式必须插入一个元素。

本文我将会介绍如何使用CSS生成内容为空单元格添加样式,而不添加多余的空元素,同时会给出一些示例。

测试 Flexbox 和 CSS Grid 的基本布局

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

下面是需要创建的内容:

澳门新浦京娱乐场网站 2

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

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

 

澳门新浦京娱乐场网站 3

定义

float属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在css中,任何元素都能浮动。浮动元素会生成一个块级框,而不论它本身世任何元素

为什么不能对空区域设置样式?

网格规范的开头有提到:

“本 CSS 模块定义了一个用于优化UI设计的基于网格的二维布局系统。在网格布局模型中,网格容器的子节点可以定位到预定义的弹性或固定大小的网格中的任意位置。“

注意关键词”网格容器的子节点“。该规范定义了在父元素上创建网格的哪些子节点能够被定位。其没有定义任何关于网格的样式,也没有像多列布局的 column-rule 那样的属性。我们是对子项目添加样式,而不是网格本身,即需要有某个元素来应用样式。

基本 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 -->

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<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 -->

在这篇文章中,我将教你如何使用 CSS Grid(网格) 布局来创建一个超酷的图像网格,它会根据屏幕的宽度改变列的数量,以实现响应式布局。

可能的值

left:元素向左移动
right:元素向右浮动
none:默认值。元素不浮动,并会显示在其文本中出现的位置
inherit:规定应该从父元素继承float属性的值

使用多余元素作为样式钩子

添加样式的方法之一是在文档中添加多余的元素,如 span 或 div。一般来说程序员都不喜欢这个方法,虽然多年来一直是通过多余的“行包裹元素”,然后通过浮动实现网格布局。而明显的空元素比某些隐式的多余包裹元素更让人觉得不爽。

如下例所示,将空元素变成网格项,并对其添加背景和边框,就像包含内容的元素一样。

查看 Rachel Andrew (@rachelandrew) 的 Empty elements become Grid Items 。

Eric Meyer 在他的个人网站 A List Apart 的文章 Faux Grid Tracks 中提倡使用 b 元素作为冗余元素,因为它没有任何语义,在所有的标签中作为一个钩子很短而且很明显。

插入额外的 div澳门新浦京娱乐场网站, 或 b 元素不算是什么大问题,所以若有需要,我不会觉得有什么不好的。而在 Web 开发中,通常一开始使用无优化的方法完成任务,直到有更好的解决方案。我一般尽可能的将样式放在统一的地方,这样的样式更易于重用,且不需要担心额外的标签。正是出于这个原因,我倾向用生成内容的方法,在我的 formatting books with CSS 一文中,生成内容的使用频率非常高。

使用 Flexbox 创建布局

而这篇文章中最漂亮的部分是:添加一行 CSS 代码即可实现响应式布局。

position属性

使用生成内容作为样式钩子

CSS生成内容使用 ::before::after CSS 伪类以及 content 属性在文档中插入内容。插入内容可能会用于插入文本,虽然这是可能的,但此处我们的目标是插入空元素作为网格容器的直接子元素。插入一个可以添加样式的元素。

在下面的例子中,有一个包裹元素作为网格容器,在其中嵌套了另一个元素。这个单独子元素作为网格项。我在容器上定义了三列三行的网格,然后使用网格线对其定位,将其它定位于中间的网格单元格中。

<div> <div></div> </div>

1
2
3
<div>
    <div></div>
</div>

JavaScript

.grid { display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 100px; grid-gap: 10px; } .grid > * { border: 2px solid rgb(137,153,175); } .item { grid-column: 2; grid-row: 2; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.grid {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-gap: 10px;
}
 
.grid > * {
    border: 2px solid rgb(137,153,175);
}
 
.item {
    grid-column: 2;
    grid-row: 2;
}

使用 Firefox Grid Inspector 查看这个示例,其上覆盖着网格线,虽然这样能看到其他空单元格的位置,但若想要对其添加背景或边框,则需要添加的子元素,通过生成内容可以实现。

澳门新浦京娱乐场网站 4

单个网格项,通过 Firefox Grid Inspector 突出显示

在CSS中,在网格容器的伪元素 ::before::after 中添加一个空字符串。他们将作为网格项并填充在容器中。然后对其设置样式,添加背景色,如同普通的网格项一样对其定位。

JavaScript

.grid::before { content: ""; background-color: rgb(214,232,182); grid-column: 3; grid-row: 1; } .grid::after { content: ""; background-color: rgb(214,232,182); grid-column: 1; grid-row: 3; }

1
2
3
4
5
6
7
8
9
10
11
12
13
.grid::before {
    content: "";
    background-color: rgb(214,232,182);
    grid-column: 3;
    grid-row: 1;
}
 
.grid::after {
    content: "";
    background-color: rgb(214,232,182);
    grid-column: 1;
    grid-row: 3;
}

澳门新浦京娱乐场网站 5

单个网格项,两个生成内容作为网格项

在文档中,我们只有一个直接子元素,多余的其他样式元素则在CSS中,这看起来挺合理的,因为这些元素的目的就是用于添加样式。

- Header 样式

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

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

1
2
3
4
.container {
    display: flex;
    flex-direction: column;
}

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

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

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

澳门新浦京娱乐场网站 6

代码如下:

header{ padding: 15px; margin-bottom: 40px; display: flex; justify-content: space-between; } header nav ul { display: flex; align-items: baseline; list-style-type: none; }

1
2
3
4
5
6
7
8
9
10
11
12
header{
    padding: 15px;
    margin-bottom: 40px;
    display: flex;
    justify-content: space-between;
}
 
header nav ul {
    display: flex;
    align-items: baseline;
    list-style-type: none;
}

这意味着我们不必通过丑陋的类名(即 col-sm-4,col-md-8)来混淆 HTML ,或者为每一个屏幕尺寸创建媒体查询。

定义和用法

position属性规定元素的定位类型

生成内容方法的局限

若你想要对右上或左下的网格项设置样式那么就有一个问题了,因为生成内容是有限的,多次重复设置 ::before::after 伪元素是无效的。例如,无法通过伪元素来生成 CSS 网格棋盘。若你确实需要对很多空单元格添加样式,那么在将来,你也许能通过”Filler B”的方式实现。

生成内容方法也可能会让项目以后的开发人员感到困惑。由于选择器目标是容器,如果在其他地方重复使用该类,将会出现生成内容,如果这正是想要的效果,自然是好的。在下面的例子中,在标题的任一侧添加一个装饰横线,每个 h1 都有这些横线是合理的。但是,如果不知道有这个伪类,则装饰横线会令人感到困惑!在CSS中添加注释将对此有所帮助。我一般会将他们作为一个组件库使用,在统一的地方定义组件,清晰的说明当类被应用到元素时会发生什么。

- 页面内容样式

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

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

1
2
3
4
.wrapper {
    display: flex;
    flex-direction: row;
}

澳门新浦京娱乐场网站 7

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

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

1
2
3
4
5
6
7
8
.main {
    flex: 3;
    margin-right: 60px;
}
 
.sidebar {
   flex: 1;
}

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

 

现在就让让我们开始吧!

说明

这个属性定义建立元素布局所用的定位机制。任何元素都可易定位。不过绝对或者固定元素会生成一个块级框,而不论该元素本身是什么类型,相对定位元素会相对于它在正常流中的默认位置偏移

花式标题

我最喜欢的运用生成内容的技巧之一是对标题设置样式。过去,对标题设置样式需要通过额外的包裹元素和绝对定位来实现。但当页面内容来自CMS时,通常是无法添加额外的包裹元素的。

而使用网格和生成内容,我们可以在标题的任意一侧添加横线,而无需任何附加标签。该线将根据可用空间增长和缩小,并且当网格在浏览器中不可用时,将优雅地回退到普通的居中效果。

澳门新浦京娱乐场网站 8

我们需要实现的标题样式

标签为一个简单的 h1

JavaScript

<h1>My heading</h1>

1
<h1>My heading</h1>

h1 的样式中,我创建了一个三列网格。grid-template-columns 的值表示一列为 1fr,一列为 auto,最后一列为 1fr。两个 1fr 的列的宽度将会自适应,在标题占据 auto 大小的空间之后,平分剩余可用空间。

设置 text-align 属性为 center 以便标题在不支持网格的浏览器中水平居中。

CSS

h1 { text-align: center; display: grid; grid-template-columns: 1fr auto 1fr; grid-gap: 20px; }

1
2
3
4
5
6
h1 {
    text-align: center;
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    grid-gap: 20px;
}

现在添加生成内容,在标题文本前后各添加一行。同时将其对应样式规则包含在特性查询(Feature Query)中,因此不会在不支持网格布局的浏览器中出错。

横线其实是生产内容的边框。

CSS

@supports (display: grid) { h1:before, h1:after { content: ""; align-self: center; border-top: 1px solid #999; } }

1
2
3
4
5
6
7
8
@supports (display: grid) {
    h1:before,
    h1:after {
        content: "";
        align-self: center;
        border-top: 1px solid #999;
    }
}

也就是说,你能使用类似的方式添加任何样式,甚至在元素周围添加图标。需要注意,将生产内容放入一个单独的列中时则无法做到生成内容与标题的重叠。即使是绝对定位也无法解决该问题。所以,你需要确实你想要实现的效果是否可通过此方法实现。

参考 Rachel Andrew (@rachelandrew) 的 Generated Content heading example 。

这是通过网格布局实现渐进增强的一个很好的例子,即使你不准备将网格作为主要布局方式,也可以使用。回退时的标题简单明了,而支持的浏览器也可以有更好效果,无论如何都可以正常查看内容。Eric Meyer 也采用了类似的方法,使用生成的内容为 blockquote 元素添加方便定位的引号。

我常常不会在一开始就确定要使用网格布局。一般是在具体实现时才开始选方案。基于此,推荐大家不要将网格布局仅看作页面组件布局的方法,因为有可能会在实现细节时忘记它。

使用 CSS Grid 创建布局

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

澳门新浦京娱乐场网站 9

设置

可能的值

absolute:生成绝对定位的元素,相对于static定位意外的第一个父元素进行定位。元素的位置通过“left”,“top”,“right”,“bottom”属性进行规定
fixed:生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置通过“left”,“top”,“right”,“bottom”属性进行规定
relative:生成相对定位的元素,相对于其正常位置进行定位

添加背景和边框

我们也可以使用生成内容来堆叠网格项; 其实,一个网格项可以占据不止一个单元格。包括通过生成内容插入的项目。

在下一个例子中,我设计了两段内容区域和一个全宽网格项。内容区域有一个背景,在全宽网格项也有相同的背景。

澳门新浦京娱乐场网站 10

我们的目标布局

代码中有一个包裹元素,内容区域和全宽网格项为其子元素,通过基于行的定位来设置网格项的位置。

XHTML

<article> <section> <p>…</p> </section> <div> <img src alt="“Placeholder”"> </div> <section> <p>…</p> </section> </article>

1
2
3
4
5
6
7
8
9
10
11
<article>
    <section>
        <p>…</p>
    </section>
    <div>
        <img src alt="“Placeholder”">
    </div>
    <section>
        <p>…</p>
    </section>
</article>

CSS

.grid { display: grid; grid-template-columns: 1fr 20px 4fr 20px 1fr; grid-template-rows: auto 300px auto; grid-row-gap: 1em; } .section1 { grid-column: 3; grid-row: 1; } .section2 { grid-column: 3; grid-row: 3; } .full-width { grid-column: 1 / -1; grid-row: 2; background-color: rgba(214,232,182,.5); padding: 20px 0; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.grid {
    display: grid;
    grid-template-columns: 1fr 20px 4fr 20px 1fr;
    grid-template-rows: auto 300px auto;
    grid-row-gap: 1em;
}
 
.section1 {
    grid-column: 3;
    grid-row: 1;
}
 
.section2 {
    grid-column: 3;
    grid-row: 3;
}
 
.full-width {
    grid-column: 1 / -1;
    grid-row: 2;
    background-color: rgba(214,232,182,.5);
    padding: 20px 0;
}

这样就能将布局设置为目标那样了,但对网格项设置背景时发现背景不会出现在 section 和全宽图片之间的 row-gap 区域。

CSS

.section { background-color: rgba(214,232,182,.3); border: 5px solid rgb(214,232,182); }

1
2
3
4
.section {
    background-color: rgba(214,232,182,.3);
    border: 5px solid rgb(214,232,182);
}

澳门新浦京娱乐场网站 11

背景仅出现在内容区之下

若将 grid-row-gap 属性移除,而用 padding 模拟也无法实现将背景置于全宽项之下。

此时就是使用生成内容的最佳场景了,通过 ::before 在网格包裹元素之前添加一个生成内容,同时对其设置一个背景色,若什么都不做,那么此生产内容默认放置在网格的第一个单元格中。

CSS

.grid::before { content: ""; background-color: rgba(214,232,182,.3); border: 5px solid rgb(214,232,182); }

1
2
3
4
5
.grid::before {
    content: "";
    background-color: rgba(214,232,182,.3);
    border: 5px solid rgb(214,232,182);
}

澳门新浦京娱乐场网站 12

生成内容占了网格的第一个空单元格

然后,使用基于行的定位来定位生成内容,将其扩展到所有应显示背景色的区域。

CSS

.grid::before { content: ""; background-color: rgba(214,232,182,.3); border: 5px solid rgb(214,232,182); grid-column: 2 / 5; grid-row: 1 / 4; }

1
2
3
4
5
6
7
.grid::before {
    content: "";
    background-color: rgba(214,232,182,.3);
    border: 5px solid rgb(214,232,182);
    grid-column: 2 / 5;
    grid-row: 1 / 4;
}

完整演示在CodePen上。

参考 Rachel Andrew (@rachelandrew) 的 Generated Content background example 。

- 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>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<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; }

1
2
3
4
5
6
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; }

1
2
3
4
5
6
7
8
9
10
11
12
13
.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 是网格的分数单位。

澳门新浦京娱乐场网站 13

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

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

1
2
3
4
5
header{
    grid-area: header;
    display: grid;
    grid-template-columns: 1fr 1fr;
}

澳门新浦京娱乐场网站 14

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

header button { justify-self: end; }

1
2
3
header button {
    justify-self: end;
}

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

header nav { justify-self: start; }

1
2
3
header nav {
    justify-self: start;
}

对于本文,我们将继续使用 5分钟学会 CSS Grid 布局 文章中使用的网格。然后我们将在文章的最后添加图片。以下是我们的初始网格的外观:

overflow属性

通过 z-index 控制层叠

在上面的例子中,生成内容是通过插入 ::before 实现的。这意味着其他元素在它之后,它位于层叠的底部,因此将显示在想要的其余内容的后面。可以通过 z-index 来控制层叠。也可以将 ::before 选择器更改为 ::after。生成内容背景则位于所有内容的顶部,如同从边框在图像上那样。这是因为它现在已经成为网格容器中的最后一项,它是最后被绘制的,因此出现在“顶部”。

要改变这一点,需要给这个元素一个比所有元素更低的 z-index 值。若没有设置过 z-index 值,则最简单的做法是给生成内容 z-index 设为 -1。这会导致它成为层叠中的第一项,因为它的 z-index 最低。

CSS

.grid::after { z-index: -1; content: ""; background-color: rgba(214,232,182,.3); border: 5px solid rgb(214,232,182); grid-column: 2 / 5; grid-row: 1 / 4; }

1
2
3
4
5
6
7
8
.grid::after {
    z-index: -1;
    content: "";
    background-color: rgba(214,232,182,.3);
    border: 5px solid rgb(214,232,182);
    grid-column: 2 / 5;
    grid-row: 1 / 4;
}

以这种方式添加的背景不仅仅能将背景放在所有内容的下方。若只在部分元素后突出背景则可以产生一些有趣的效果。

使用 Flexbox 和 CSS Grid 创建布局

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

澳门新浦京娱乐场网站 15

基本的布局如下图所示:

澳门新浦京娱乐场网站 16

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

澳门新浦京娱乐场网站 17

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

接下来看看代码如何一步步实现。首先 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; }

1
2
3
4
5
6
.container {
  display: grid;
  grid-template-columns: 0.4fr 0.3fr 0.3fr;
  grid-column-gap: 10px;
  grid-row-gap: 15px;
}

澳门新浦京娱乐场网站 18

定义和用法

overflow属性规定当内容溢出元素框时发生的事情

规范未来会解决这个问题么?

CSS 网格规范确实没有说明如何为单元格添加背景和边框。工作组与社区的讨论可参考:GitHub上讨论分支

如果你的用例场景不好用生成内容解决,那么可以将你的想法添加到该分支。你的意见和用例有助于呈现开发者对该特性的关注点,同时请确定你的意见和用例的准确度。

- 列和行布局

Header 部分横跨所有的列。

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

1
2
3
4
5
6
7
.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; }

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

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

这是HTML:

说明

这个属性定义溢出元素内容区的内容会如何处理。

请帮忙添加更多示例!

如果本文让你尝试使用了生成内容,或者如果你已有示例,请将其添加到评论中。在生产环境中用到的网格布局的都是全新的示例,所以,当我们将网格与其他布局方法结合在一起使用时,会有很多“意外之喜”。

1 赞 收藏 评论

澳门新浦京娱乐场网站 19

- 导航

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; }

1
2
3
4
5
6
7
8
9
10
11
.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;
}

澳门新浦京娱乐场网站 20

HTML 代码:

可能的值

visible:默认值,内容不会被修剪,会呈现在元素框之外
hidden:内容会被修剪,并且其余的内容是不可见的
scroll:内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容
auto:如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容
inherit:规定应该从父元素继承overflow属性的值

- 列内容网格

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

 <div class="container>

CSS中,设置背景颜色透明,而字体颜色不变:

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

下图是包含了“额外”文本和按钮的三个区域。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; }

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

澳门新浦京娱乐场网站 21

<div>1</div>

background-color: rgba(0,0,0,.4);前面三个表示颜色的rgb,而最后一个数字表示透明度(0-1之间)

设计方法总结

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

1 赞 5 收藏 评论

澳门新浦京娱乐场网站 22

<div>2</div>

background-repeat用法

background-repeat:no-repeat :背景图片不重复
background-repeat:repeat:重复背景图片x方向和y方向同时重复
background-repeat:repeat-x:x方向即水平方向重复
background-repeat:repeat-y:y方向即垂直方向重复

<div>3</div>

background-position

background-position:背景位移
其后面有两个属性,第一个是水平方向的位置,第二个是垂直方向的位置,这里应该注意两个元素属性的顺序
比如说:background-position:left-29px;(当中的left指从图片的最左端读起,-29px就是将图片向上移动29px,然后开始读)
再比如:background-position:15px 20px;(指的是将图片向右移15px,向下移20px),简单的说,就是以图片的左上角顶点为原点,往下和右都为正值,反之为负值

<div>4</div>

栅格系统(网格系统)

Bootstrap框架的网格系统工作原理如下:
(1)数据行(.row)必须包含在容器(.container)中,以便为其赋予合适的对齐方式和边距(padding)
(2)在行(.row)中可以添加列(column),但是列数之和不能超过平分的总列数
(3)具体内容应当放置在列容器(column)之内,而且只有列(column)才可以作为行容器(.row)的直接子元素
(4)通过设置内距(padding)从而创建列与列之间的间距。然后通过为第一列和最后一列设置负值的外距(margin)来抵消内距(padding)的影响。

<div>5</div>

块级元素和行内元素

我们在做页面布局的时候,一般会将html元素分为两种,即块级元素和行内元素

<div>6</div>

块级元素:

块级元素排斥其他元素与其位于同一行,可以设定元素的宽(width)和高(height),块级元素一般是其他元素的容器,可容纳块级元素和行内元素。常用的块级元素有div,h1-h6等

</div>

行内元素:

行内元素不可易设置宽(width)和高(height),但是可以与其他行内元素位于同一行,行内元素内一般不可以包含块级元素。行内元素的高度一般是由元素内部的字体大小决定,宽度由内容的长度控制。常用的行内元素有a,em,strong等。

还有相应的 CSS :

行内元素和块级元素之间的转换

我们可以通过样式display属性来改变元素的显示方式。当display的值设为block时,元素将以块级方式呈现;当display值设为inline时,元素将以行内形式呈现
另外,如果我们即想让一个元素可以设置高度和宽度,又项让它以行内形式显现,这时我们可以设置display的值为inline-block。

CSS 代码:

css中子元素浮动,无法自动撑开父元素的解决方法

<div>
<div style="float:left;">left</div>
<div style="float:right;">right</div>
</div>

如图所示,父div的高度不会随着两个子div的增高而增高。#####解决方法:给父div加一个overflow:hidden属性即可,如下

<div style="overflow:hidden;">
<div style="float:left;">left</div>
<div style="float:right;">right</div>
</div>

.container {

CSS中实现元素的绝对居中

    display: grid;

元素的绝对居中方法如下:

.node{
width: 300px;
height:400px;
position:absolute;
left:50%;
right:50%;
margin-left:-150px;/一半的高度/
margin-top:-150px;/一半的宽度/
}

    grid-template-columns: 100px 100px 100px;

还有一种CSS3的方法:

.node{
width:600px;
height:400px;
position:absolute;
left:50%;
right:50%;
transform:translate(-50%,-50%);
/50%为自身尺寸的一半/
}

    grid-template-rows: 50px 50px;

第三种方式是margin:auto;

.node{
width:600px;
height:400px;
position:absolute;
left:0;
right:0;

    top:0;
    bottom:0;
    margin:auto;   /*有了这段代码就自动居中了*/

}

}

注意:这个例子也有一些基本的样式,比如容器宽度,网格间隔,背景颜色什么的,我不会在这里介绍,因为它与 CSS Grid 没有任何关系。

如果这段代码让你感到困惑,我建议你阅读 5分钟学会 CSS Grid 布局 这篇文章,在那里我解释了 Grid 布局模块的基础知识。

让我们开始将 列 实现响应式布局。

使用等分(fr)单位实现基本的响应式

CSS Grid 带来了一个全新的值,称为等分单位,即 fr 。它允许你将容器可用空间分成你想要的多个等分空间。

让我们将每个列更改为一个等分单位宽度。

CSS 代码:

.container {

    display: grid;

    grid-template-columns: 1fr 1fr 1fr;

    grid-template-rows: 50px 50px;

}

这里发生的事情是,将整个网格的宽度分成三等分,每一列都占据一个 fr 单位。结果是:

澳门新浦京娱乐场网站 23

如果我们将 grid-template-columns 的值更改为 1fr 2fr 1fr,那么第 2 列现在将是另外 2 列的 2 倍。总宽度现在是 4 等分,第 2 列占据了 2 等分,而其他 2 列则各占 1 等分。看起来类似这样:

澳门新浦京娱乐场网站 24

换句话说,等分单位值使你可以非常容易地改变列的宽度。

更加高级的响应式

但是,上面的例子并没有给我们想要的响应式,因为这个网格总是包含 3 列。我们希望我们的网格根据容器的宽度来改变列的数量。要做到这一点,你必须学习三个新的概念。

repeat()

我们将从 repeat() 函数开始。 这是指定列和行更强大的方法。 让我们把原来的网格改成使用 repeat() :

CSS 代码:

.container {

    display: grid;

    grid-template-columns: repeat(3, 100px);

    grid-template-rows: repeat(2, 50px);

}

换句话说,repeat(3, 100px) 与 100px 100px 100px 相同。 第一个参数指定了你想要的列数或行数,第二个参数指定了它们的宽度,所以上面的代码将为我们创建和第一个一样的布局。

澳门新浦京娱乐场网站 25

auto-fit (自适应)

然后是自适应。让我们跳过固定数量的列,而是用 auto-fit 取代 3 。

CSS 代码:

.container {

    display: grid;

    grid-gap: 5px;

    grid-template-columns: repeat(auto-fit, 100px);

    grid-template-rows: repeat(2, 100px);

}

这会达到以下效果:

澳门新浦京娱乐场网站 26

你会看到,现在这个网格已经可以通过容器的宽度来改变列的数量。

它只是试图尽可能多地将 100px 宽的列排列在容器中。

但是,如果我们将所有列硬编码为 100px ,我们永远得不到我们想要的灵活性,因为它们很少会加起来正好等于容器的宽度。正如你在上面的 gif 图中所看到的,网格通常会在右侧留下空白区域。

minmax()

为了解决这个问题,我们需要的最后一方法是 minmax()。我们只需用 minmax(100px, 1fr) 替换 100px 即可。这是最终的CSS。

CSS 代码:

.container {

    display: grid;

    grid-gap: 5px;

    grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));

    grid-template-rows: repeat(2, 100px);

}

注意,所有的响应都发生在一行 CSS 中。

这会达到以下效果:

澳门新浦京娱乐场网站 27

正如你们所见,这样很完美。minmax() 函数定义大于或等于 min 且小于或等于 max 的大小范围。

所以现在列的宽度至少 100px 。但是,如果有更多的可用空间,网格将简单地分配给每个列,因为列的值变成了一个等分单位 1fr ,而不是 100px 。

添加图片

现在最后一步是添加图片。 这与 CSS Grid 没有任何关系,但是我们还是要来看看代码。

我们将在每个网格项内添加一个 img 标签。

HTML 代码:

<div><img src="img/foret.jpg"/></div>

为了使图像适合该网格项,我们将它设置为与网格项一样宽和高,然后使用 object-fit: cover;。这将使图片覆盖整个容器,如果需要的话,浏览器会裁剪该图片。

CSS 代码:

.container > div > img {

    width: 100%;

    height: 100%;

    object-fit: cover;

}

效果如下:

就是这么简单!你已经了解了 CSS Grid 中最复杂的概念之一,所以后面请自己动手吧。

浏览器支持

在我们结束之前,我还需要提及浏览器的支持。在写这篇文章的时候,占全球 77% 的网站流量的浏览器支持CSS Grid,而且正在攀升。

我相信 2018 年将是 CSS Grid 大量应用的一年。很快会得到突破,并将成为前端开发人员的必备技能。就像过去几年在 CSS Flexbox 所发生的一样。

本文由澳门新浦京娱乐场网站发布于新浦京娱乐场官网,转载请注明出处:澳门新浦京娱乐场网站:落实高效布局,通过更