Positioning能够元素脱离normal document layout flow.css
默认下,块级盒子的宽度是其父元素的100%,而且和它本身的内容同样高。行级盒子的宽度和高度都和它本身的内容同样大。html
The normal layout flow是元素放置在浏览器视口内的系统。默认下,block元素垂直列出,每一个出如今一个新行,而且在上一行的下面,它们由margin隔开。vim
inline元素不同,它和其余的inline元素或者text内容在同一行,只要父级block盒子有空间就这么作,若是没有空间,那么超出的内容或元素会移动到新的一行里。segmentfault
特性请看替换元素与非替换元素。浏览器
Static positioning is the default that every element gets -- it just means "put the element into it's normal position in the document layout flow --- nothing special to see here".markdown
相对定位和static定位很类似,除了一旦定位的元素在正常流中占据了位置,则能够修改其最终位置,包括使其与页面上的其余元素重叠。ide
简单归纳,设置了relative后,脱离了文档流,原来的位置依然占据。经过left,right设置的值会与其余元素重叠。布局
position: relative;
使用top、bottom、left和right能够指定元素往哪一个方向移动。举例来讲:测试
div { position: relative; top: 30px; /*表示举例原来的top30px*/ }
使用绝对定位,元素脱离文档流,原来的位置将再也不保留。当设置了绝对定位后,它的位置也会改变。而使用top、right、bottom、left也将不同了,它表示距离最近有定位属性的祖先的top或者right或者bottom或者left。flex
哪一个元素是绝对定位的"包含元素"? 默认状况下,它是html元素--- 定位元素嵌套在body里,但在最终的布局中,它离页面边缘的顶端和左边30px,这是html元素。这更准确地称为元素的positioning context.
咱们能够改变positioning content --- 绝对定位的元素相对于其定位的元素。这是经过在元素的其余祖先元素之一设置定位实现的。
div { position: relative; } div p { position: absolute; }
定位元素会在未定位元素上面,可是当有多个定位元素的时候,咱们如何考虑它们的层叠顺序呢?
若是有多个定位元素的话,后定位的元素会在以前定位的元素的上面,可是如何改变它们的顺序呢?
咱们可使用"z-index", 默认下,定位的元素z-index的值是auto,其实是0。咱们能够经过改变它的值来改变定位元素的层叠顺序。可是不能够改变未定位元素的层叠顺序。
Fixed position和绝对定位相似,可是fixed position 它相对的是浏览器的视口。无论浏览器是如何滚动的或者如何放大缩小的,它都相对的是浏览器的视口。
浮动事后的任何元素都成了block level element
/* html */ <p> This is my very impoort paragraph. I am a distinguished gentleman of such renown that my paragraph needs to be styled in a manner befitting my majesty. Bow before my splendour, dear students, and go forth and learn CSS! </p> /* CSS */ p { width: 400px; margin: 0 auto; } p::first-line { text-transform: uppercase; } p::first-letter { font-size: 3em; border: 1px solid black; background: red; float: left; padding: 2px; margin-right: 4px; }
全部内容在浮动,若是不处理,那么就会很可怕。幸运的是有一个属性叫作clear,当将它应用到一个元素时,它基本上说"中止浮动到这里"--- 这个元素和它以后的元素都不会浮动,除非你应用一个新的float到另外一个元素。
clear有三个值:
当对div用的百分比时,而后浮动刚恰好,可是若是要为div设置border、padding等等,那么可能就会超过100%或者父级盒子的大小,所以能够为div设置box-sizing: border-box。
另一个问题, 当你有一下布局时:
<div> <div class="fl">111</div> <div class="fl">222</div> </div> <footer>333</footer> .fl {float: left} footer {margin-top: 50px;clear: left;}
由于使用了clear: left后,因此footer不在围绕浮动元素。可是你会发现,margin-top: 50px并不起做用。为了解决这个问题, 在HTML中添加新的div元素,而且设置它的class为clearfix。此时,能够取消了footer的clear:both;以下:
<div> <div class="fl">111</div> <div class="fl">222</div> <div class="clearfix"></div> </div> <footer>333</footer> .fl {float: left} footer {margin-top: 50px;} clearfix {clear: both;}
可是这只是简单的解决了这个问题而已。
所以归纳一下清除浮动(我以为应该叫闭合浮动更好一点儿,清除浮动只是清除了浮动,可是不能解决高度塌陷的问题)的几种方法:
.clearfix:after { content: "."; display: block; clear: both; }
All about floats
那些年咱们清除过的浮动
BFC神奇背后的原理
BFC的中文意思是块级格式化上下文。它是一块独立的渲染区域,只有Block-level box参与,它规定了内部的Block-level Box如何布局,而且与这个区域外部绝不相关。
参考:
替换元素(replaced element):所谓替换元素就是浏览器根据元素的标签和属性,来决定元素具体显示什么内容。好比说:img标签的src属性的值用来读取图片信息而且显示出来。又好比说,input标签的type属性决定是显示输入框仍是单选按钮。html中的img、input、textarea、object、video、embed都是替换元素。
非替换元素(non-replaced element): 是指内容包含在文档里的元素。好比p、span等等。
在考虑inline的时候,咱们就须要考虑inline元素究竟是行内可替换元素仍是行内不可替换元素。
讨论margin-top和margin-bottom对行内非替换元素是否其做用:
讨论margin-top和margin-bottom对行内替换元素是否其做用:
讨论padding-top和padding-bottom对行内非替换元素是否其做用:
讨论padding-top和padding-bottom对行内替换元素是否其做用:
参考: