CSS 文档流技巧,让布局更简单

看文章之前,先来看两个例子。这是我们在项目中最常见的项目布局方式。

案例一:多个容器按照相同间距水平排列。

案例二:常见的菜单导航

看到这两个案例时,你可以先短暂的想想平时都是如何实现的,很多同学的答案应该是这样的。

// 案例一
<div class="demo">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>

.demo {
  padding: 1em 0;
  width: 470px;
  background-color: #e5e5e5;
  overflow: hidden;
}
.item {
  float: left;
  margin-left: 10px;
  width: 150px;
  height: 100px;
  background-color: #fff;
  border: 1px solid #999999;
  box-sizing: border-box;
}
.item:first-child {
  margin-left: 0;
}

//案例二
<div class="demo2">
    <a href="" class="nav">导航1</a>
    <a href="" class="nav">导航2</a>
    <a href="" class="nav">导航3</a>
</div>

.demo2 {
  width: 200px;
  background-color: cadetblue;
}
.nav {
  display: block;
  width: 100%;
  border-bottom: 1px solid #000;
  color: #fff;
}

效果我们是做到了,但是这里所有像素都是你自己固定计算的。

比如第一个例子中,父容器的宽度为 470 = 3*150 + 20。如果在不使用 flex 布局的情况下,你想让三个元素自适应屏幕宽度有什么好办法?

或者你想把三个元素扩展成四个,这个时候你就需要手动计算每个元素的宽度。这样好像很是麻烦。

那今天就来说说,如何利用「流」的特性,解决平时在项目中遇到的一些布局问题。

在刚开始学习 CSS 时我们都会经常听到这么一个概念叫「文档流」,很多人并没有深究文档流是为何物。

那什么是「文档流」呢?

文档流

文档流:是引导网页中的元素排列和布局的,它默认的方向是从左向右,从上而下。

而「流」具有最大的一个特点就是自适应性。你可以把它想象成像水流一样,当水流倒入一个容器时,它会自动充满整个容器。而 CSS 中的文档流,其表现是一致的,有异曲同工之妙。

不仅如此,你也经常会听到「脱离文档流」,比如浮动,绝对定位等都可以脱离文档流,而脱离文档流不是本文要说的重点,所以就不展开多说,今天主要是聊一聊「流的自适应性」。

文档流中有两个比较重要的概念:块级元素(block)、内联元素(inline),对应到最具代表性的元素就是&lt;div&gt;&lt;span&gt;

块级元素默认会充满整个屏幕,具有自适应性,而内联元素默认则是水平排列。

你可以想象为块级元素就想是水流一样充满容器,而内联元素就是漂浮在水里按照从左到右排列的物体。

在项目中会经常碰到 display:block 这个属性。但注意,它与块级元素不是同一个东西。display:table,也属于块级元素。

对web前端这门技术感兴趣的小伙伴可以加入到我们的学习圈来,正因为我不是211,985,只是个普通的本科生,英语不是特别好,数学不是特别好。所以我选择了前端。工作第六个年头了,我庆幸自己选择了这条路。767-273-102 秋裙。在鹅厂做过,跟着创业头子混过。想把自己的技术分享给大家,如果你还在迷茫,也希望能进我一些绵薄之力,帮助到你。都是一群有梦想的人,我们可能在不同的城市,但我们会一起结伴同行前端前端前端

失去流动性

到这里你应该明确了流的特性,其实很多人都知道「文档流」这个概念,但却没有好好的去利用,从而给自己增加了一些不必要的麻烦。

比如以前我会写出这样的 CSS:

span {
    display: block;
    width: 100%;
}

如果明白流的特性的话,其实 width: 100%; 这个属性是多余的,因为块级元素在流布局中默认是自动充满容器的。

你是否也中枪写过这种 CSS ?欢迎在评论区说出你的问题。

但如果仅仅只是多了一条属性,其实也就是增加了一行代码显得不那么简洁而已,可事情总是没有那么简单。

一旦你给元素添加了宽度(width)属性,它就会失去流动性,即便是它的值为 100%,也是会失去。

对,你没有看错,只要有了宽度属性,它就会失去了它最牛逼的流动性。这样就变的毫无价值。

比如开头中导航案例,如果给导航加入一些边距。就会出现不好的效果。

.nav {
  display: block;
  padding: 10px; //添加的边距
  width: 100%;
  border-bottom: 1px solid #000;
  color: #fff;
}

而如果我们把宽度属性去掉,就会得到完美的展示效果。

.nav {
  display: block;
  padding: 10px;
  border-bottom: 1px solid #000;
  color: #fff;
}

可能你之前并没有意识到,加入宽度属性带来的危害。

但当你看到这篇文章之后,你应该警惕宽度给流动性带来的危害,尽量少用宽度,甚至是「无宽度」。

在此之前我相信很多伙伴在项目汇总遇到过超出宽度的情况,但很少有人去探究,所以很多人都会发挥他特有的计算能力,然后写出如下代码。

.nav {
  display: block;
  padding: 10px;
  width: 180px; // 200px - 10px*2
  border-bottom: 1px solid #000;
  color: #fff;
}

貌似也实现了该有的功能,不过这种缺点我们显而易见,就是太过固定,任何一点的改动都需要你重新计算。

可能有人会说,兄die,我的计算能力很惊人,你管的着吗,好吧这,波算我输。

那为什么加了宽度属性会超出,而不加宽度属性就可以了呢?

原来是因为,当元素不设置宽度属性时或者是 width:auto ,元素的margin、border、padding 可以自动分配空间。

一旦,我们设置了固定的宽度属性,就算是100%,它就会根据 CSS 的盒模型进行计算。从而失去了自动分配空间的流动性。

至于如何计算的细节,因为盒模型的不同,所以宽度的作用就不同,它包含的东西也就不一样。具体不在多说。

兄die,这时候知道「无宽度」有多牛逼了吧。

因为这里我提到了盒模型,你会想到把上面的案例,改变下盒模型不就行了吗?比如我们这么做:

.nav {
  display: block;
  padding: 10px;
  width: 100%;
  border-bottom: 1px solid #000;
  box-sizing: border-box; //改变盒模型
  color: #fff;
}

确实在这个案例中是可以这么用的,但是如果想实现案例一的水平有间距排列问题,就有点力不从心了。

由于 CSS 盒模型,是不计算 margin 的,水平排列可以很容易实现,但是想要有相同间距,就比较难以实现。

这个时候你就可以尝试利用流的特性,来很好的实现这个方案。

宽度分离

这时候我们可以利用流的特性,进行宽度分离。

<div class="demo">
    <div class="item">
        <div class="child">内容</div>
    </div>
    <div class="item">
        <div class="child">内容</div>
    </div>
    <div class="item">
        <div class="child">内容</div>
    </div>
    <div class="item">
        <div class="child">内容</div>
    </div>
</div>
.demo {
  padding: 1em;
  background-color: #e9e9e9;
  overflow: hidden;
}
.item {
  float: left;
  width: 25%;
}
.child {
  margin: 0 10px;
  padding: 10px;
  border: 1px solid #ccc;
}

你会发现,无论你如何改变它的 margin、padding、border 它都会自动填充分配空间,再也不会出现布局错乱,超出等等一系列的情况。

以上就是利用流的特性,让布局变得简单、灵活。当然,流的特性不仅仅限于这两种布局。

还比如表单的布局,通常表单的布局都是比较难处理的一点,这时候你不妨试试利用「无宽度」、「宽度分离」原则尝试一下,也许会有新的发现。小伙伴们赶紧放飞下自己的想象力吧。

原文地址:https://blog.51cto.com/14458119/2429509

时间: 2024-08-04 18:30:10

CSS 文档流技巧,让布局更简单的相关文章

CSS文档流、块级元素、内联元素

CSS文档流与块级元素(block).内联元素(inline),之前翻阅不少书籍,看过不少文章, 看到所多的是零碎的CSS布局基本知识,比较表面.看过O'Reilly的<CSS权威指南>,发现里面提到的文档流概念让我很敏感. 可恶的是书中并没有解释文档流是什么东西,或许作者觉得这个太简单了以至于不值一提.但我觉得,这个概念实在太重要了.理解了它,一堆CSS布局的理论都变得易于理解,并且体会到CSS这套设计的合理性所在. 于是我根据猜测,再加实验,得出一下说法.如有错误,纯属正常. 文档流 将窗

前端(七)—— 高级布局:文档流、浮动布局、流式布局、定位布局、flex布局、响应布局

高级布局:文档流.浮动布局.流式布局.定位布局.flex布局.响应布局 一.文档流 1.什么是文档流 将窗体自上而下分成一行一行,块级元素从上至下.行内元素在每行中从左至右的顺序依次排放元素 2.本质 文档流本质是 nomal flow (普通流.常规流) 3.BFC(Block Formatting Contxt) 块级格式化上下文,它是一个独立的渲染区域,只有Block-level box参与,它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干 4.BFC的规则

CSS文档流

文档流 将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流. 每个非浮动块级元素都独占一行, 浮动元素则按规定浮在行的一端. 若当前行容不下, 则另起新行再浮动. 内联元素也不会独占一行. 几乎所有元素(包括块级,内联和列表元素)均可生成子行, 用于摆放子元素. 有三种情况将使得元素脱离文档流而存在,分别是浮动,绝对定位, 固定定位. 浮动元素不占任何正常文档流空间,而浮动元素的定位还是基于正常的文档流,然后从文档流中抽出并尽可能远的移动至左侧或者右侧.文字内容会围绕在浮

css 文档流中块级非替换元素水平区域的计算规则(1)

最近在读<Basic Visual Formatting in CSS>,结合以前看的<css权威指南>和css标准.今天就做个笔记. 以前在遇到一些宽度不明确指明的一些布局的时候,虽然凭感觉能猜出个大概,但是总是有点不是很靠谱.直到最近看到这一本书,觉得总觉得挺好的. 首先要知道,元素除了通过display来指定block.inline.inline-block这一些属性之外,还有一种能在的特性--替换还是非替换. 替换元素:像img.video.canvas等稳定种指定的内容只

前端学习 -- Css -- 文档流

文档流 文档流处在网页的最底层,它表示的是一个页面中的位置, 我们所创建的元素默认都处在文档流中 元素在文档流中的特点 块元素 块元素在文档流中会独占一行,块元素会自上向下排列. 块元素在文档流中默认宽度是父元素的100%. 块元素在文档流中的高度默认被内容撑开. 内联元素 1.内联元素在文档流中只占自身的大小,会默认从左向右排列,如果一行中不足以容纳所有的内联元素,则换到下一行,继续自左向右. 2.在文档流中,内联元素的宽度和高度默认都被内容撑开. 当元素的宽度的值为auto时,此时指定内边距

认识CSS中布局之文档流、浮动、定位以及叠放次序

前端之HTML,CSS(七) CSS CSS布局的核心就是盒子的摆放,即CSS定位.而CSS中定位机制分为:普通流(nomal flow).浮动(float).定位(position). 普通流 普通流又被称为文档流或者标准流,普通流是指网页内标签元素正常情况下会按照自上而下,自左向右按顺序排列.即块级元素独占一行,多个块级元素存在会自上而下顺序排列,多个行内元素会共占一行,自左向右排列. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 &l

文档流 css中间float clear和布局

文档流 先说说什么是公文流转  什么流 它是一系列连续的东西 <div style="background-color:pink;width:40px;height:80px;">第一个框 </div> <div style="background-color:red;width:40px;height:80px;">第二个框 </div> <div style="background-color:ye

文档流 css中的float clear与布局

文档流 先说说什么是文档流  流是什么 就是一串连续的东西 <div style="background-color:pink;width:40px;height:80px;">第一个框 </div> <div style="background-color:red;width:40px;height:80px;">第二个框 </div> <div style="background-color:yel

(转)CSS 浮动 -css中,文档流是什么?

原文链接:http://www.cnblogs.com/jiqing9006/archive/2012/07/30/2615231.html 普通流就是正常的文档流,在HTML里面的写法就是从上到下,从左到右的排版布局. 例: <div id=”01”></div><div id=”02”></div><div></div> 很显然这是最普通的文档流,从左到右,一个挨一个按照顺序01先,02其次,03最后排列. 一旦给其中的某个DIV