阅读MDN文档之布局(四)
Introducing positioning
Positioning可以元素脱离normal document layout flow.
默认下,块级盒子的宽度是其父元素的100%,并且和它自己的内容一样高。行级盒子的宽度和高度都和它自己的内容一样大。
The normal layout flow是元素放置在浏览器视口内的系统。默认下,block元素垂直列出,每个出现在一个新行,并且在上一行的下面,它们由margin隔开。
inline元素不一样,它和其他的inline元素或者text内容在同一行,只要父级block盒子有空间就这么做,如果没有空间,那么超出的内容或元素会移动到新的一行里。
特性请看替换元素与非替换元素。
Static positioning
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".
Relative positioning
相对定位和static定位很相似,除了一旦定位的元素在正常流中占据了位置,则可以修改其最终位置,包括使其与页面上的其他元素重叠。
简单概括,设置了relative后,脱离了文档流,原来的位置依然占据。通过left,right设置的值会与其他元素重叠。
position: relative;
Introducing top, bottom, left and right
使用top、bottom、left和right可以指定元素往哪个方向移动。举例来说:
div {
	position: relative;
	top: 30px;
	/*表示举例原来的top30px*/
}
Absolute positioning
使用绝对定位,元素脱离文档流,原来的位置将不再保留。当设置了绝对定位后,它的位置也会改变。而使用top、right、bottom、left也将不一样了,它表示距离最近有定位属性的祖先的top或者right或者bottom或者left。
Positioning contexts
哪个元素是绝对定位的"包含元素"? 默认情况下,它是html元素--- 定位元素嵌套在body里,但在最终的布局中,它离页面边缘的顶端和左边30px,这是html元素。这更准确地称为元素的positioning context.
我们可以改变positioning content --- 绝对定位的元素相对于其定位的元素。这是通过在元素的其他祖先元素之一设置定位实现的。
div {
	position: relative;
}
div p {
	position: absolute;
}
Introducing z-index
定位元素会在未定位元素上面,但是当有多个定位元素的时候,我们如何考虑它们的层叠顺序呢?
如果有多个定位元素的话,后定位的元素会在之前定位的元素的上面,但是如何改变它们的顺序呢?
我们可以使用"z-index", 默认下,定位的元素z-index的值是auto,实际上是0。我们可以通过改变它的值来改变定位元素的层叠顺序。但是不可以改变未定位元素的层叠顺序。
Fixed positioning
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有三个值:
- left: 停止左侧浮动
 - right: 停止右侧浮动
 - both: 停止左右浮动
 
浮动的特点
- 浮动元素会脱离正常的文档流,按照其margin指定的位置相对于它的上一个块级元素(或父元素)显示。
 - 浮动元素后面的块级元素的内容会围绕此浮动元素, 但是边框和背景却忽略浮动元素而向上一个任意非浮动元素靠其。
 - 浮动元素后面的内联元素会向此浮动元素的外边距靠齐。
 
浮动造成的影响
- 对父元素的影响: 对于其父元素来说,元素浮动之后,它将脱离正常的文档流,所以它也无法撑开其父元素, 造成其父元素的塌陷。
 - 对其兄弟元素(非浮动)的影响:
- 如果兄弟元素是块级元素: 该元素会忽略浮动元素的位置而占据它的位置,并且元素会处在浮动元素的下层,但它的内部文字和其他行内元素都会围绕浮动元素。
 - 如果兄弟元素是内联元素:则元素会环绕浮动元素排列。
 
 - 对其兄弟元素(浮动)的影响:
- 同一个方向的浮动元素:当一个浮动元素在浮动过程中碰到同一个方向的浮动元素时,它会紧跟在它们后面。
 - 相反方向的浮动元素:互不影响,在同一条水平线上,当空间不够时会被挤下去。
 
 
浮动问题
当对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;}
但是这只是简单的解决了这个问题而已。
因此概括一下清除浮动(我觉得应该叫闭合浮动更好一点儿,清除浮动只是清除了浮动,但是不能解决高度塌陷的问题)的几种方法:
- 第一个,像上面那样,但是没有语意化,并且增加了许多毫无意义的标签。
 - 第二种,The Overflow Method, 设置overflow: auto或者hidden,就可以了,但是它不是专门用来闭合浮动的,而且要小心overflow后可能会隐藏或者出现滚动条。
 - 第三种,推荐使用。
 
.clearfix:after {
	content: ".";
	display: block;
	clear: both;
}
参考
All about floats
那些年我们清除过的浮动
BFC神奇背后的原理
BFC
BFC的中文意思是块级格式化上下文。它是一块独立的渲染区域,只有Block-level box参与,它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相关。
哪些元素会生成BFC?
- 根元素
 - float属性不为none
 - position为absolute或fixed
 - display为inline-block, table-cell, table-caption, flex, inline-flex(关于这一点我是真的没有测试出来)
 - overflow不为visible
 
BFC的布局规则
- 内部的box会在垂直方向,一个接一个地放置。
 - Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
 - 每个元素的margin box的左边,与包含块的border box的左边相接触,即使存在浮动也是如此。
 - BFC的区域不会和float box重叠。
 - BFC就是页面上的一个隔离的独立容器,容器里的子元素不会影响到外面的元素。反之也如此。
 - 计算BFC的高度时,浮动元素也参与运算。
 
BFC的作用与原理
- 自适应两栏布局
 - 清除内部浮动
 - 防止margin重叠
 
参考:
替换元素与非替换元素
替换元素(replaced element):所谓替换元素就是浏览器根据元素的标签和属性,来决定元素具体显示什么内容。比如说:img标签的src属性的值用来读取图片信息并且显示出来。又比如说,input标签的type属性决定是显示输入框还是单选按钮。html中的img、input、textarea、object、video、embed都是替换元素。
非替换元素(non-replaced element): 是指内容包含在文档里的元素。比如p、span等等。
margin-top/margin-bottom与padding-top/padding-bottom
在考虑inline的时候,我们就需要考虑inline元素到底是行内可替换元素还是行内不可替换元素。
讨论margin-top和margin-bottom对行内非替换元素是否其作用:
- 规范允许margin可以设置到行内元素。
 - 由于向一个行内非替换元素应用margin,对行高没有影响。
 - 并且margin是透明的,所以声明margin-bottom, margin-top没有任何视觉效果。
 - 而对于行内非替换元素应用左右的margin,是有影响的。
 
讨论margin-top和margin-bottom对行内替换元素是否其作用:
- 为行内替换元素设置margin会影响行高。
 - 所以margin-top和margin-bottom是有视觉效果的。
 - 对行内替换元素应用左右的margin,也是有影响的。
 
讨论padding-top和padding-bottom对行内非替换元素是否其作用:
- 明确是有作用的,可以设置背景颜色看出来。
 - 不会影响block布局。
 
讨论padding-top和padding-bottom对行内替换元素是否其作用:
- 明确是有作用的,可以设置背景颜色看出来。
 - 也会影响block布局的。
 
参考:
是不是inline元素就不能设置宽高margin,padding?
CSS中的一些概念
阅读MDN文档之布局(四)的更多相关文章
- 阅读MDN文档之布局(四)
		
Introducing positioning Static positioning Relative positioning Introducing top, bottom, left and ri ...
 - 阅读MDN文档之CSS选择器介绍(一)
		
本文为阅读MDN文档笔记 目录 Different types of Selectors Attribute Selectors Presence and value attribute select ...
 - 阅读MDN文档之StylingBoxes(五)
		
目录 BoxModelRecap Box properties Overflow Background clip Background origin Outline Advanced box prop ...
 - 阅读MDN文档之基本盒模型(三)
		
Box properties Margin collapsing Adjacent siblings(相邻兄弟) Parent and first/last child Empty blocks Ac ...
 - 阅读MDN文档之层叠与继承(二)
		
目录 The cascade Importance Specificity Source order A note on rule mixing Inheritance Controlling inh ...
 - Emacs阅读chm文档
		
.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium ...
 - 前端开发必备之MDN文档
		
想下载MDN文档的看前面的内容就可以了. HTML 源码下载 MDN官方下载地址:https://developer.mozilla.org/media/developer.mozilla.org.t ...
 - MDN 文档高级操作进阶教程
		
MDN 文档高级操作进阶教程 MDN 文档, 如何优雅的使用 MDN 文档上的富文本编辑器 pre & 语法高亮器 code & note box source code 上传附件 i ...
 - 关于MDN,HTML入门来自MDN文档
		
由开发者和作者组成的开源社区:推动web发展, MDN(Mozilla Developer Network) 维基,共同维护做贡献: 需要使用到github账号进行验证,以此再创建MDN账号: HTM ...
 
随机推荐
- 从零自学Hadoop(23):Impala介绍及安装
			
阅读目录 序 介绍 安装 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一篇, ...
 - iphone手机中对于html和css的一些特殊处理
			
1.iphone safari iso系统不兼容:hover的解决办法: 方法一: a:hover设置的样式在IOS系统的浏览器内显示不出来,看来是IOS系统的移动设备中,需要在按钮元素或者是body ...
 - Javaweb---服务器Tomcat配置
			
1.文件下载 Tomcat官方地址:http://tomcat.apache.org/ 2.文件解压 将下载好文件解压在你想放置的位置即可 解压后的文件: 3.进行配置 一般都要配置这两个参数: 1) ...
 - MYSQL和JAVA(课堂笔记)
			
MYSQL 数据库管理工具 JAVA 编程语言 数据库驱动(JAVA和MYSQL对接方式) 到官网上下载驱动 加载驱动 import java.sql.Connection;import java. ...
 - Go从入门到精通(一)go语言初始
			
一.第一个go程序 package main import ( "fmt" ) func main(){ fmt.Println("hello world") ...
 - android 模拟器对应键盘快捷键
			
一位同事的总结资料: Android SDK2.0.1自带的虚拟机尺寸都比较小(不针对机型,只为了在PC上看的舒服一点,当然越大越好了,我最大设置成1050*450,但是自带的屏保会不够宽,900*4 ...
 - web 直播&即时聊天------阿里云、融云(三)
			
经过前面的知识,基本已经把聊天室的功能搞定了,剩下的就是直播的问题了... 一如既往,阿里云的web demo也是少的可怜,只有一个web播放器(Prismplayer),所以这里主要就此播放器踩的坑 ...
 - STL的空间配置器std_alloc 笔记
			
STL的空间配置器std_alloc 笔记 C++的内存分配基本操作是 ::operator new(),内存释放是 ::operator delete(),这里个全局函数相当于C的malloc和fr ...
 - ReactiveSwift源码解析(一) Event与Observer代码实现
			
ReactiveCocoa这个框架是做什么用的本篇博客就不做过多赘述了,什么是"响应式编程"也不多聊了,自行Google吧.本篇博客的主题是解析ReactiveCocoa框架中的核 ...
 - HTML5 jQuery+FormData 异步上传文件,带进度条
			
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href ...