布局

Posted by Yucan on August 1, 2016

布局 - 将元素以正确的大小摆放在正确的位置上(元素的摆放模式)

上面的图例中,垂直方向上,分成了 3 部分(head,body,foot),是为三行自适应布局;内容区相对于 body 部分为水平居中布局;内容区可分为主内容区和边栏,是为两列布局。

display

设置元素的显示方式(大小,位置)
display: block | inline | inline-block | none

display: block

  • 默认宽度为父元素宽度(大小)
  • 可设置宽高(大小)
  • 换行显示(位置)
  • e.g: div, p, h1-h6, ul, form, …

display: inline

  • 默认宽度为内容宽度(大小)
  • 不可设置宽高(大小)
  • 同行显示(位置)
  • e.g: span, a, label, cite, em, …

display: inline-block

  • 默认宽度为内容宽度(大小)
  • 可设置宽高(大小)
  • 同行显示(位置)
  • 整块换行(inline 元素可以在元素内换行)
  • e.g: input, textarea, select, button, …

display: none

  • 设置元素不显示(区别于 visibility: hidden)

应用

  • 块级元素水平居中——图例 body 部分
<div>
  <div class="content">content area</div>
</div>
.content {
  margin: auto;
  width: 520px; /*定宽*/
}
  • 居中导航——图例红色导航栏
<ul>
  <li><a href="#">推荐</a></li>
  <li><a href="#">歌单</a></li>
  <li><a href="#">大牌DJ</a></li>
  <li><a href="#">歌手</a></li>
  <li><a href="#">新碟上架</a></li>
</ul>
ul {
  text-align: center;
  height: 30px;
  line-height: 30px;
}
li, a {
  display: inline-block;
  width: 80px;
  height: 100%;
}
li {
  margin: 0 5px;
}

定位

position - 设置定位方式(参照物)
top, right, bottom, left, z-index - 设置位置(必须配合 position 属性使用)

top/right/bottom/left

  • 设置元素边缘距参照物边缘的距离
  • 一个定位元素,如果没有设置宽高,又同时设置了 top/right/bottom/left 值,元素会被「撑开」

z-index

  • 设置元素在 z 轴上的排序
  • 默认值为 0

position

position: static | relative | absolute | fixed

  • position: relative
    • 仍在文档流中
    • 参照物为元素本身
    • 使用场景:绝对定位元素的「参照物」(因为设置了相对定位的元素不脱离文档流,如果只设置元素相对定位,而不改变其相对位置,它对其他元素的布局不会有任何影响)
  • position: absolute
    • 默认宽度为内容宽度
    • 脱离文档流
    • 参照物为第一个定位 祖先/根 元素
  • position: fixed
    • 默认宽度为内容宽度
    • 脱离文档流
    • 参照物为视窗

应用

  • 轮播头图

<div class="is">
  <img src="http://o7v1v0rr4.bkt.clouddn.com/%E8%BD%AE%E6%92%AD%E5%A4%B4%E5%9B%BE.jpg">
  <p class="title"><a href="#">老徐视线:北京潮女出门不穿内衣</a></p>
  <div class="controls">
	<span></span><span class="cur"></span><span></span><span></span><span></span>
  </div>
</div>
.is {
  position: relative;
  width: 480px;
}
.is .title {
  position: absolute;
  bottom: 0;
  width: 100%;
}
.is .controls {
  position: absolute;
  bottom: 18px;
  right: 10px;
}
.is .controls span {
  display: inline-block;
  width: 10px;
  height: 10px;
}     
  • 固定顶栏——图例 head 部分
<body>
  <div class="top">top bar</div>
  <div class="main">main content area</div>
</body>
body {
  padding-top: 50px;
}
.top {
  position: fixed;
  top: 0;
  width: 100%;
  height: 50px;
}
  • 遮罩
<div class="mask"></div>
.mask {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 999;
  width: 100%;
  height: 100%;
}
  • 三行自适应布局——图例 head & foot 固定,内容区自适应
<div class="head">head</div>
<div class="body">body</div>
<div class="foot">foot</div>
.head {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100px;
}
/* 一个定位元素,如果没有设置宽高,又同时设置了 top/right/bottom/left 值,元素会被「撑开」*/
.body {
  position: absolute;
  top: 100px;
  left: 0;
  bottom: 100px;
  right: 0;
  overflow: auto;
}
.foot {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 100px;
}

float

图例中,内容区可分为主内容区和边栏,是为两列布局。那可以用position: absolute 来实现这种布局吗?由于设置了绝对定位的元素会脱离文档流,foot 部分会浮上来,与内容区重叠。为了实现两列布局,我们需要满足两点:1. 块级元素同行显示;2. 在文档流中。这时就用到了float属性。

float: left | right | none | inherit

float

  • 默认宽度为内容宽度
  • 半脱离文档流(对元素,脱离文档流;对内容,在文档流中)
  • 向指定方向一直移动
  • float 元素在同一文档流中

清除浮动

  • clear
    • clear: both | left | right | | none | inherit
    • 应用于后续元素
    • 应用于块级元素
.clearfix:after {
  content: ".";
  display: block;
  clear: both;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}
.clearfix {
  zoom: 1;
}

应用

  • 两列布局——图例内容区
<div class="body clearfix">
  <div class="side">side</div>
  <div class="main">main</div>
</div>
.side {
  float: right;
  width: 200px;
}
.main {
  float: left;
  width: 500px;
}
.clearfix:after {
  content: ".";
  display: block;
  clear: both;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}

Flex

Flex 布局教程:语法篇 实例篇

创建 flex container

  • display: flex

flex item

  • 文档流 中的 元素

flex 属性

  • 方向
    • flex-direction
      • flex-direction: row | row-reverse | column | column-reverse
    • flex-wrap
      • flex-wrap: nowrap | wrap | wrap-reverse
    • flex-flow
      • flex-flow: <’flex-direction’> || <’flex-wrap’>
    • order
      • order: <interger>
      • initial: 0
  • 弹性
    • flex-basis
      • flex-basis: main-size | <width>
      • 设置 flex item 的初始宽/高
    • flex-grow
      • flex-grow: <number>
      • initial: 0
    • flex-shrink
      • flex-shrink: <number>
      • initial: 1
    • flex
      • flex: <’flex-grow’> || <’flex-shrink’> || <’flex-basis’>
      • initial: 0 1 main-size
  • 对齐
    • justify-content (like text-align)
      • justify-content: flex-start | flex-end | center | space-between | space-around
      • 设置 main-axis 方向上对齐方式
    • align-items (like vertical-align)
      • align-items: flex-start | flex-end | center | baseline | stretch
      • 设置 cross-axis 方向上对齐方式
    • align-self
      • align-self: auto | flex-start | flex-end | center | baseline | stretch
      • 设置单个 flex item 在 cross-axis 方向上对齐方式
    • align-content
      • align-content: flex-start | flex-end | center | space-between | space-around | stretch
      • 设置 cross-axis 方向上行对齐方式

应用

  • 三行自适应+两行自适应——图例
<div class="head">head</div>
<div class="body">
  <div class="side">side</div>
  <div class="main">main</div>
</div>
<div class="foot">foot</div>
body {
  display: flex;
  flex-flow: column;
}
.head, .foot {
  height: 100px;
}
.body {
  flex: 1;
  display: flex;
}
.side {
  width: 200px;
}
.main {
  flex: 1
}