布局基础学习
display
属性:
display
是CSS中最重要的用于控制布局的属性。每个元素都有一个默认的 display
值,这与元素的类型有关。对于大多数元素它们的默认值通常是 block
或 inline
。
block
div
是一个标准的块级元素。一个块级元素会新开始一行并且尽可能撑满容器。其他常用的块级元素包括 p
、 form
和HTML5中的新元素: header
、 footer
、 section
等等。
inline
span
是一个标准的行内元素。一个行内元素可以在段落中 <span> 像这样 </span>
包裹一些文字而不会打乱段落的布局。 a
元素是最常用的行内元素,它可以被用作链接。
none
另一个常用的 display
值是 none
。一些特殊元素的默认 display 值是它,例如 script
。 display:none
通常被 JavaScript 用来在不删除元素的情况下隐藏或显示元素。
注意
它和 visibility
属性不一样。把 display 设置成 none
元素不会占据它本来应该显示的空间,但是设置成 visibility: hidden
; 还会占据空间。
其他 display 值
还有很多的更有意思的 display
值,例如 list-item
和 table
。这里有一份详细的列表。之后会讨论到 inline-block
和 flex
。
其他
每个元素都有一个默认的 display
类型, 你可以随时随地的重写它!你可以把有特定语义的元素改成行内元素。常见的例子是:把 li
元素修改成 inline
,制作成水平菜单。
margin: auto
让元素居中显示:
使用 设置块级元素的 width
可以防止它从左到右撑满整个容器。然后你就可以设置左右外边距为 auto
来使其水平居中。元素会占据你所指定的宽度,然后剩余的宽度会一分为二成为左右外边距。代码如下:
#main {
width: 600px;
margin: 0 auto;
}
唯一的问题是,当浏览器窗口比元素的宽度还要窄时,浏览器会显示一个水平滚动条来容纳页面。让我们再来改进下这个方案:
#main {
max-width: 600px;
margin: 0 auto;
}
在这种情况下使用 max-width
替代 width
可以使浏览器更好地处理小窗口的情况, 这点在移动设备上显得尤为重要!
注意
所有的主流浏览器包括IE7+在内都支持 max-width
!
box-sizing
控制盒模型 width
属性
使用 当设置了元素的宽度,实际展现的元素却超出你的设置:是因为元素的边框和内边距会撑开元素。看下面的例子,两个相同宽度的元素显示的实际宽度却不一样。代码如下:
.simple {
width: 500px;
margin: 20px auto;
}
.fancy {
width: 500px;
margin: 20px auto;
padding: 50px;
border-width: 10px;
}
如下图所示:
当你设置一个元素为 box-sizing: border-box;
时,此元素的内边距和边框不再会增加它的宽度。这里有一个与前一页相同的例子,唯一的区别是两个元素都设置了 box-sizing: border-box;
代码如下:
.simple {
width: 500px;
margin: 20px auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.fancy {
width: 500px;
margin: 20px auto;
padding: 50px;
border: solid blue 10px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
效果如下图所示:
这样可以确保所有的元素都会用这种更直观的方式排版。
警告
box-sizing
是个很新的属性,目前还应该像上面例子中那样使用 -webkit- 和 -moz- 前缀。这可以启用特定浏览器实验中的特性。同时记住它是支持IE8+的。
position
属性控制元素位置
使用 为了制作更多复杂的布局,我们需要学习下 position
属性。这个属性定义建立元素布局所用的定位机制。任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身是什么类型。相对定位元素会相对于它在正常流中的默认位置偏移。
static
.static {
position: static;
}
static
是默认值。任意 position: static;
的元素不会被特殊的定位。一个 static
元素表示它不会被“positioned”(忽略 top, bottom, left, right 或者 z-index 声明),一个 position
属性被设置为其他值的元素表示它会被“positioned”。
relative
relative
表现的和 static
一样,除非你添加了一些额外的属性。如下面代码所示:
.relative1 {
position: relative;
}
.relative2 {
position: relative;
top: -20px;
left: 20px;
background-color: white;
width: 500px;
}
在一个相对定位(position属性的值为relative)的元素上设置 top
、 right
、 bottom
和 left
属性会使其偏离其正常位置。其他的元素的位置则不会受该元素的影响(发生位置改变来弥补它偏离后剩下的空隙)。
fixed
一个固定定位(position属性的值为fixed)元素会相对于视窗来定位,这意味着即便页面滚动,它还是会停留在相同的位置。和 relative
一样, top
、 right
、 bottom
和 left
属性都可用。代码如下:
.fixed {
position: fixed;
bottom: 0;
right: 0;
width: 200px;
background-color: white;
}
如下图所示:
一个固定定位元素不会保留它原本在页面应有的空隙(脱离文档流)。令人惊讶地是移动浏览器对 fixed
的支持很差。这里有相应的解决方案。
absolute
absolute
是最棘手的position值。 absolute
与 fixed
的表现类似,但是它不是相对于视窗而是相对于最近的“positioned”父级元素。如果绝对定位(position属性的值为absolute)的元素没有“positioned”父级元素,那么它是相对于文档的 body
元素,并且它会随着页面滚动而移动。
记住一个“positioned”元素是指 position
值不是 static
的元素。
代码如下:
.relative {
position: relative;
width: 600px;
height: 400px;
}
.absolute {
position: absolute;
top: 120px;
right: 0;
width: 300px;
height: 200px;
}
效果如下图所示
来看一个页面布局, 代码如下:
.container {
position: relative;
}
nav {
position: absolute;
left: 0px;
width: 200px;
}
section {
/* position is static by default */
margin-left: 200px;
}
footer {
position: fixed;
bottom: 0;
left: 0;
height: 70px;
background-color: white;
width: 100%;
}
body {
margin-bottom: 120px;
}
效果如下图所示:
这个例子在容器比nav元素高的时候可以正常工作。如果容器比nav元素低,那么nav会溢出到容器的外面。
float
属性进行布局
使用 float
属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。
如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可能地窄。
注意
假如在一行之上只有极少的空间可供浮动元素,那么这个元素会跳至下一行,这个过程会持续到某一行拥有足够的空间为止。
Float 可用于实现文字环绕图片,如:
img {
float: right;
margin: 0 0 1em 1em;
}
效果如下:
再来看一个例子, 代码:
.box {
float: left;
width: 200px;
height: 100px;
margin: 1em;
}
效果如下图:
不同于 position
属性, float
属性设置后, 空隙会被下面的元素 session
填充, 同时下面的 session
元素会围绕着包围整个 div
元素
clear
属性控制浮动
使用 clear 属性规定元素的哪一侧不允许其他浮动元素。
拿上面的例子进行扩展, 代码如下:
.box {
float: left;
width: 200px;
height: 100px;
margin: 1em;
}
.after-box {
clear: left;
}
效果如下图:
clearfix
清除浮动(clearfix hack)
使用 通常我们在写 html + css 的时候,如果一个父级元素内部的子元素是浮动的(float
),那么常会发生父元素不能被子元素正常撑开的情况,如下图所示:
加入一些新的CSS样式:
.clearfix {
overflow: auto;
}
新的效果如下图所示:
【举例】: 使用浮动布局
使用 float
属性实现和 position
属性一样效果, 如下图:
代码如下:
nav {
float: left;
width: 200px;
}
section {
margin-left: 200px;
}
百分比宽度
百分比是一种相对于包含块的计量单位。它对图片很有用:如下实现了图片宽度始终是容器宽度的50%。把页面缩小看下效果!
你可以用百分比做布局,但是这需要更多的工作。在下面的例子中,当窗口宽度很窄时 nav
的内容会以一种不太友好的方式被包裹起来。总而言之,选一种最合适你的内容的方式。
拿上面的例子举例, 修改代码:
nav {
float: left;
width: 25%;
}
section {
margin-left: 25%;
}
效果如下图所示:
使用响应式布局
“响应式设计(Responsive Design)” 是一种让网站针对不同的浏览器和设备“呈现”不同显示效果的策略,这样可以让网站在任何情况下显示的很棒!
媒体查询是做此事所需的最强大的工具。让我们使用百分比宽度来布局,然后在浏览器变窄到无法容纳侧边栏中的菜单时,把布局显示成一列:
@media screen and (min-width:600px) {
nav {
float: left;
width: 25%;
}
section {
margin-left: 25%;
}
}
@media screen and (max-width:599px) {
nav li {
display: inline;
}
}
当改变屏幕分辨率时, 效果如下:
这里有一些同样使用了媒体查询的著名站点。点击查看更多关于媒体查询的知识
使用 meta viewport 之后可以让你的布局在移动浏览器上显示的更好。
inline-block
进行布局
使用 来看下面两种方法的例子:
- 困难的方式(使用浮动):
.box {
float: left;
width: 200px;
height: 100px;
margin: 1em;
}
.after-box {
clear: left;
}
容易的方式(使用inline-block)
.box2 {
display: inline-block;
width: 200px;
height: 100px;
margin: 1em;
}
最终效果如下图:
使用 `inline-block` 来布局时有一些事情需要牢记:
vertical-align
属性会影响到inline-block
元素,你可能会把它的值设置为top
。你需要设置每一列的宽度
如果HTML源代码中元素之间有空格,那么列与列之间会产生空隙
column
属性
使用 CSS columns是很新的标准,所以需要使用前缀,并且它不被IE9及以下和Opera Mini支持。还有许多和 column 相关的属性,点击这里了解更多。
来看一段CSS:
.three-column {
padding: 1em;
-moz-column-count: 3;
-moz-column-gap: 1em;
-webkit-column-count: 3;
-webkit-column-gap: 1em;
column-count: 3;
column-gap: 1em;
}
最终效果如图:
flexbox
进行布局
使用 具体查看笔记二: flex布局笔记 (原文地址: 学习弹性盒子)
使用框架
因为 CSS 布局很难使用,所以催生了不少 CSS 框架来帮助开发者。如果你想看看那么这里有一些。只有在框架的功能满足你的需求时,使用框架才是个好主意。掌握 CSS 的工作方式是无可替代的。