veda原创【抄录】讲得很好存本身这里看css
CSS文档流与块级元素(block)、内联元素(inline),以前翻阅很多书籍,看过很多文章, 看到所多的是零碎的CSS布局基本知识,比较表面。看过O'Reilly的《CSS权威指南》,发现里面提到的文档流概念让我很敏感。 可恶的是书中并无解释文档流是什么东西,或许做者以为这个太简单了以致于不值一提。但我以为,这个概念实在过重要了。理解了它,一堆CSS布局的理论都变得易于理解,而且体会到CSS这套设计的合理性所在。html
将窗体自上而下分红一行行, 并在每行中按从左至右的顺序排放元素,即为文档流。java
每一个非浮动块级元素都独占一行, 浮动元素则按规定浮在行的一端。 若当前行容不下, 则另起新行再浮动。web
内联元素也不会独占一行。 几乎全部元素(包括块级,内联和列表元素)都可生成子行, 用于摆放子元素。浏览器
有三种状况将使得元素脱离文档流而存在,分别是浮动,绝对定位, 固定定位。 可是在IE中浮动元素也存在于文档流中(还让我以为这样很合理><)。app
浮动元素不占任何正常文档流空间,而浮动元素的定位仍是基于正常的文档流,而后从文档流中抽出并尽量远的移动至左侧或者右侧。文字内容会围绕在浮动元素周围。当一个元素从正常文档流中抽出后,仍然在文档流中的其余元素将忽略该元素并填补他原先的空间。ide
浮动概念让人迷惑根源在于浏览器对理论的解读形成的。只能说不少人以IE作标准,其实它不是。布局
基于文档流, 咱们能够很容易理解如下的定位模式:性能
相对定位, 即相对于元素在文档流中位置进行偏移。 但保留原占位。字体
绝对定位, 即彻底脱离文档流, 相对于position属性非static值的最近父级元素进行偏移。
固定定位, 即彻底脱离文档流, 相对于视区进行偏移。
《CSS权威指南》中文字显示:任何不是块级元素的可见元素都是内联元素。其表现的特性是“行布局”形式,这里的“行布局”的意思就是说其表现形式始终以行进行显示。好比,咱们设定一个内联元素border-bottom:1px solid #000;时其表现是以每行进行重复,每一行下方都会有一条黑色的细线。若是是块级元素那么所显示的的黑线只会在块的下方出现。
p、h一、或div等元素经常称为块级元素,这些元素显示为一块内容;Strong。span等元素称为行内元素,它们的内容显示在行中,即“行内框”。(可使用display=block将行内元素转换成块元素,display=none表示生成的元素根本没有框,也既不显示元素,不占用文档中的空间)
对于学过CSS的人来讲一听就能明白。可对于新手来讲不易理解,我主要对新手说通熟点吧!
用容器这一词会更容易形象理解它们的存在与用途,行内元素至关一个小容器,而<div>至关于一个大容器,大容器固然能够放一个小容器了。<span>就是小容器,这样一说你也许会在脑海中有一个初步的印象了吧,若是咱们想在大容器中装一些清水。但我也想在里装一些墨水怎么 办?很简单,咱们把小容器拿出来装上墨水而后放入大容器里的清水中不就成了吗。这段不敢苟同
块元素(block element)通常是其余元素的容器元素
块元素通常都重新行开始,它能够容纳内联元素和其余块元素。常见块元素是段落标签'P"。“form"这个块元素比较特殊,它只能用来容纳其余块元素。
若是没有css的做用,块元素会顺序以每次另起一行的方式一直往下排。而有了css之后,咱们能够改变这种html的默认布局模式,把块元素摆放到你想要 的位置上去。而不是每次都愚蠢的另起一行。须要指出的是,table标签也是块元素的一种,table based layout和css based layout从通常使用者(不包括视力障碍者、盲人等)的角度来看这两种布局,除了页面载入速度的差异外,没有其余的差异。可是若是普通使用者不经意点了 查看页面源代码按钮后,二者所表现出来的差别就很是大了。基于良好重构理念设计的css布局页面源码,至少也能让没有web开发经验的普通使用者把内容快速的读懂。从这个角度来讲,css layout code应该有更好的美学体验吧。
你可以把块容器元素div想象成一个个box,或者若是你玩过剪贴文载的话,那就更加容易理解了。咱们先把须要的文章从各类报纸、杂志总剪 下来。每块剪下来的内容就是一个block。而后咱们把这些纸块按照本身的排版意图,用胶水从新贴到一张空白的新纸上。这样就造成了你本身独特的文摘快报了。做为一种技术的延伸,网页布局设计也遵循了一样的模式。
内联元素(inline element)通常都是基于语义级(semantic)的基本元素。内联元素只能容纳文本或者其余内联元素,常见内联元素 “a”。
块元素(block element)和内联元素(inline element)都是html规范中的概念。块元素和内联元素的基本差别是块元素通常都重新行开始。而当加入了css控制之后,块元素和内联元素的这种属 性差别就不成为差别了。好比,咱们彻底能够把内联元素cite加上display:block这样的属性,让他也有每次都重新行开始的属性。
可变元素的基本概念就是他须要根据上下文关系肯定该元素是块元素或者内联元素。可变元素仍是属于上述两种元素类别,一旦上下文关系肯定了他的类别,他就要遵循块元素或者内联元素的规则限制。大体的元素分类见全文。
关于inline element的中文叫法,有多种内联元素、内嵌元素、行内元素、直进式元素。基本上没有统一的翻译,爱怎么叫怎么叫吧。另外提到内联元素,咱们会想到有个display的属性是display:inline;这个属性可以修复著名的IE双倍浮动边界问题。
可变元素为根据上下文语境决定该元素为块元素或者内联元素。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
block元素的特色:
1. 老是另起一行开始;
2. 高度,行高以及顶、底边距均可控制;
3. 宽度缺省是它所在容器的100%,除非设定一个宽度。
inline元素的特色:
1. 和其它元素都在一行上;
2. 高度,行高以及顶、底边距不可改变;(left/right的margin/padding能够设定;内部放入块元素能够撑起行内元素的高度)
3. 宽度就是它所容纳的文字或图片的宽度,不可改变。
说白了就是块元素是以行为单位,紧接它的下一个元素会另起一行,而在内联元素后面的元素则不会另起一行。
而后就是关于嵌套问题,块元素里能够嵌套内联元素,而内联元素却并不能随意嵌套块元素。例如<p>天空晴朗<div>不温不火</div>不睡懒觉<p>页面会用三行来显示,但这样写是错误的,W3C校验也没法经过。哪些内联元素不能嵌套块元素?
有一个区别标准挺好用,先把全部的块元素再次划分红几个级别的,<html>在最外层,<html>下一级里面有<head>、<body>、<frameset>、<noframes>,可视的元素只会出如今<body>里,因此咱们把<body>划在第一个级里面,接着,把不能够自由嵌套的元素划在第三个级,其余的就归进第二个级。所谓的不可自由嵌套的元素就是里面只能放内联元素的,它们包括有:标题标记的<h1>、<h2>、<h3>、<h4>、<h5>、<h6>、<caption>;段落标记的<p>;分隔线<hr>和<dt>,只存在于<dl>的子一级。
块元素/行内元素间的互相嵌套(4种)都不定能使用,有部分不行,看经验了。