基本概念

### 布局模型
1. 流动模型(Flow)
2. 浮动模型(Float)
3. 层模型(Layer)


### 流动模型
默认的网页布局模式,流动布局模型有两个比较典型的特征:
第一,块级元素都会在所处的包含元素内自上而下按顺序垂直延伸分布,且默认状态下,会计元素的宽度都为包含元素宽度的**100%**,即块级元素都会以**行的形式占据位置**。
第二,内联元素都会在所处的包含元素内**从左到右水平分布**,自然宽度取决于内容宽度(不考虑换行的情况下)。


### 浮动模型
任何元素在默认状态下都是不能浮动的,可以通过css定义其float属性让元素浮动。

css:
div{
width:200px;
height:200px;
border:2px red solid;
float:left;(左对齐,相对的也有右对齐[right]
}
html:
<div id="div1"></div>
<div id="div2"></div>

浏览器效果:

### 层模型
层布局模型就像是图像软件PhotoShop中非常流行的图层编辑功能一样,让每个图层能够精确定位操作。
层模型有三种主要形式:
1. 绝对定位(position:absolute)
2. 相对定位(position:relative)
3. 固定定位(position:fixed)

4. 默认定位(position:static)

绝对定位

如果想为元素设置层模型中的绝对定位,需要设置position:absolute(表示绝对定位),这条语句的作用将元素从文档流中拖出来,然后使用left、right、top、bottom属性相对于其最接近的一个具有定位属性的父包含块进行绝对定位。如果不存在这样的包含块,则相对于body元素,即相对于浏览器窗口

如下面代码可以实现div元素相对于浏览器窗口向右移动100px,向下移动50px。

css:
div{
width:200px;
height:200px;
border:2px red solid;
position:absolute;
left:100px;
top:50px;
}
html:
<div id="div1"></div>

效果图:

相对定位

相对定位完成的过程是首先按static(float)方式生成一个元素(并且元素像层一样浮动了起来),然后相对于以前的位置移动,移动的方向和幅度由left、right、top、bottom属性确定,偏移前的位置保留不动。值得一提的是:实际上,元素还是占着原本的位置,只是看起来发生了偏移。例如下面的例子:

css:
#div1{
width:200px;
height:200px;
border:2px red solid;
position:relative;
left:100px;
top:50px;
}
html:
<div id="div1"></div>
<div id="div1"></div><span>偏移前的位置还保留不动,覆盖不了前面的div没有偏移前的位置</span>

从效果图中可以明显的看出,虽然div元素相对于以前的位置产生了偏移,但是div元素以前的位置还是保留着,所以后面的span元素是显示在了div元素以前位置的后面。

固定定位

fixed:表示固定定位,与absolute定位类型类似,但它的相对移动的坐标是视图(屏幕内的网页窗口)本身。由于视图本身是固定的,它不会随浏览器窗口的滚动条滚动而变化,除非你在屏幕中移动浏览器窗口的屏幕位置,或改变浏览器窗口的显示大小,因此固定定位的元素会始终位于浏览器窗口内视图的某个位置,不会受文档流动影响。最常见的就是网页中的那些广告。

Relative和Absolute的组合使用

由于绝对定位可以相对于已经定位了的父辈元素进行定位,所以就让块中的块居中或者任意定位成为可能:

css:
.superBox{
width:200px;
height:200px;
position:relative;
border:1px solid red;
}
.box{
width:100px;
height:100px;
position:absolute;
border:1px solid green;
bottom:100px;
right:100px;
}
html:
<div class="superBox">
<div class="box"></div>
</div>

效果:

### 流的概念
流是页面的默认布局模式,可以把页面中所有的元素想象成水流,浏览器为一个容器(有时候也不一定是body),块元素独立成行,从上而下的流动,而内联元素则在块状元素中从左到右,自上而下的流动。
而浮动呢,就像是水流中的石头,如果在一个页面中设置了某个元素为浮动,那么他就相当于在水流中突出了一块石头 ,这块石头是不会随着水流流动,相反的,水流(流动元素)会尽量地绕开他流动,块状元素中的内联元素(包括文本)会绕过浮动元素进行排版,值得一提的是,浮动元素只能左右对齐,因为浏览器无法处理放置在中间的石头的水流走向。可以设置流动元素的clear值(也是只有左和右)来阻止流动元素绕过浮动元素,常见应用于页脚,以确保页脚能始终“高冷”地在页面的最下面。
而层呢,他更像是一个悬浮在水面上的叶子,水流在他底下无所顾忌的遵从流动法则流动,也可以有其他的树叶叠在他上面,对了,可以通过设置z-index大小来决定那些层在上面,z-index就像是一个Z轴,垂直于你的显示器屏幕,越大就说明离你越近。与浮动不同的是,层模型可以随意在页面的任何位置,通过设置其top、bottom、left、right值,使他能始终在浏览器窗口的相对位置。因为层元素遗立在页面之上,所以这时候clear值就没有用了,忘了你高冷的页脚吧,试试使她拥有跟主内容相同的背景色?




## html+div+css的布局模式


### 利用浮动构建两栏分布页面
首先用两个div构建逻辑分区,一个作为主内容区,一个作为边栏。一般来说,内容区在左,分栏在右。(博客园的是三栏,左右功能分栏,中间是主内容)
两栏分布实现的原理:
第一种选择,浮动边栏
先将边栏定义宽度,再将边栏div放置在内容区盒子前面,利用float,将边栏设置右浮动,这样内容区的内容就会在边栏周围流动,然后通过给内容区设置一定的右外边距,视情况给页尾设置clear值就大功告成了
如下栗子:
```html
css:
#dev{
width:360px;
height:auto;
border:1px solid red;
background-color:green;
float:right;
}
#main{
width:auto; /*宽度可以随着浏览器宽度改变*/
height:auto;
border:1px solid blue;
margin-right:202px;
}
html:

我是主内容

```
效果:
![](https://images2018.cnblogs.com/blog/1322238/201803/1322238-20180327202052864-530696789.png)

主内容的宽度可以随着浏览器大小进行调整,本来做了gif动图看着很直观的,不过博客园的文章里好像显示不了动图……

这种布局由于边栏先于内容区,所以有些浏览器(特别是屏幕阅读器,手机浏览器)会先显示出边栏的内容,也就是说,你要活生生地等着屏幕阅读器将边栏内容念完你才能进入主内容……

知道了上面的两栏分布页面的布局原理后,你肯定能猜出三栏是怎么弄的,没错,三栏其实就是将左右边栏各自浮动,然后主内容设置恰当的左右margin就行了。

第二种,浮动内容区

这种跟上面浮动边栏类似,不同的是,将内容区的div放置在边栏前面,设置左浮动并定宽,然后给边栏一个恰当的左边距就ok了,这种布局虽然解决了主内容和边栏的先后问题,但是也衍生出了另一个小问题,就是当浏览器改变大小的时候,由于边栏没有定宽,你会看到一个超宽的边栏……



或许你会说,我把边栏设置一定的宽度不就可以了。没错,这的确可以防止超宽的边栏,但是这样就会让整个页面的右边留太多空白,还有可能导致页面只能蜷缩在超宽的显示器里的一角。

那么有没有一种可以在浏览器改变任意大小的时候,主内容和边栏比例不会变的奇怪,并且还能居中在页面的布局呢?

### 利用“凝胶”构建两栏页面(常见的果冻模型)
这个原理其实很简单,首先在最外部加一个div,定宽,这里就相当于把用户的浏览器视窗宽度固定死,然后左右margin设为自动,让这个div带着所有元素居中。将所有浮动的,流动的,都打包装进这个容器里面,凝固起来,这就是果冻这个称号的由来。
![](https://images2018.cnblogs.com/blog/1322238/201803/1322238-20180327210015457-1936457283.png)


### 利用绝对定位构建两栏页面(实用)
这个办法其实是将边栏设定宽度之后,放置在页面的指定位置,然后主题内容设置一定的外边距,营造一种分栏的“假象”,博客园首页的三栏分布就是采用这种方式:将左右边栏绝对定位,然后主内容设置相应的左右边距。
![](https://images2018.cnblogs.com/blog/1322238/201803/1322238-20180327211227758-2117159676.png)


### 利用css表格显示布局
这种方法就是专治各种不服的存在了,利用div中的display属性,构建css表格,可以实现各种多栏布局。
话不多说,利用这个方法,首先你要有一个大的div,用display设置为table,装载所有行div和单元格div,然后每一个行指定另一个div(table-row),有多少个列就有多少个元素(单元格table-cell)。比如下面这个css表格:

CSS:
#table{
display:table;
border-spacing:10px; /*为表格中的单元格增加10像素的边框边距,值得注意的是,这里的10像素不会跟页面中上下的其他块元素叠加,也就是说,表格跟上下其他块元素的外边距不是取最大,而是两者相加(边框间距+其他块元素的相应外边距*/
}
.table-row{
display:table-row;
margin:10px; /*边框间距可以看成是常规元素的外边距,所以可以不再需要<div>上的外边距*/
}
#A,#B{
display:table-cell;
vertical-align:top; /*表格中的内容垂直上对齐*/
}
HTML:
<div id="table">
<div class="table-row">
<div id="A">…………</div>
<div id="B">…………</div>
</div>
</div>



利用这种布局方法可以很轻便地做出多行多列的布局,只要将相应的html结构添加进去就搞定了。

html+css布局整理笔记的更多相关文章

  1. CSS 布局整理

    1.css垂直水平居中 效果: HTML代码: <div id="container"> <div id="center-div">&l ...

  2. CSS 布局整理(************************************************)

    1.css垂直水平居中 效果: HTML代码: <div id="container"> <div id="center-div">&l ...

  3. CSS布局学习笔记之position

    CSS知识点 之 position布局 前段时间被同学怂恿,参加了百度前端技术学院的一个小培训,第一个阶段下来学到不少东西.课程的第一个阶段主要是HTML5 和 CSS 基础知识的一个小培训,给出的一 ...

  4. CSS布局整理

    目录 常用居中方法 水平居中 垂直居中 单列布局 二列&三列布局 float+margin position+margin 圣杯布局(float+负margin) 双飞翼布局(float+负m ...

  5. css布局学习笔记之position属性

    position属性用于定位元素,它的几个值分别如下: 1,static static 是默认值.任意 position: static; 的元素不会被特殊的定位.一个 static 元素表示它不会被 ...

  6. css布局学习笔记之box-sizing

    当你设置了元素的宽度,实际展现的元素却能够超出你的设置:因为元素的边框和内边距会撑开元素. .div{ width: 500px; margin: 20px auto; padding: 50px; ...

  7. css布局学习笔记之max-width

    设置块级元素的 width 可以阻止它从左到右撑满容器.然后你就可以设置左右外边距为 auto 来使其水平居中.元素会占据你所指定的宽度,然后剩余的宽度会一分为二成为左右外边距. div{ width ...

  8. css布局知识点汇总

    昨天早上看到了一篇很棒的文章,这篇文章将布局的一些知识点整理的很不错.我也想整理一下,这样在以后的项目中可以活学活用,避免只用一种方式. 参考文章:https://segmentfault.com/a ...

  9. 《深入理解bootstrap》读书笔记:第三章 CSS布局

    一. 概述一下理念 bootstrap基于H5开发.提倡移动先行(媒询声明是必须的),对浏览器支持面不是很广. 响应式图片:max-width:100% height:auto; 可以加上:.img- ...

随机推荐

  1. mvc自定义控件

    //自定义一个DatePicker.cshtml文件@helper Init() { <link href="~/Content/mobiscroll.custom-2.5.0.min ...

  2. 【转】虚拟化(二):虚拟化及vmware workstation产品使用

    vmware workstation的最新版本是10.0.2.相信大家也都使用过,其中的简单的虚拟机的创建,删除等,都很简单,这里就不再详细说明了,下面我将简单介绍下vmware workstatio ...

  3. C++ (带有默认参数的函数参数)缺省函数参数

    缺省参数?在C++中,允许实参的个数与形参的个数不同.在声明函数原型时,为一个或者多个形参指定默认值,以后调用这个函数时,若省略某一个实参,c++则自动的以默认值作为相应参数的值. 实列说明:#inc ...

  4. 配置Jupyter

    前几天见同学有用Jupyter notebook的,有点喜欢,于是今天自己配了一下. Jupyter是一个非常好用编辑器,因为Jupyter notebook 不仅可以编写代码运行,并且可以直接在代码 ...

  5. BZOJ 2006 [NOI2010]超级钢琴 (堆+主席树)

    题面:BZOJ传送门 洛谷传送门 让你求前$K$大的子序列和,$n\leq 5*10^{5}$ 只想到了个$nlog^{2}n$的做法,似乎要被卡常就看题解了.. 好神奇的操作啊,我傻了 我们把序列和 ...

  6. 3分钟实现小程序唤起微信支付 Laravel教程

    微信支付的接入,如果不使用成熟的开发包,将是巨大的工作量. 依赖 EasyWechat 先在 laravel 项目中依赖 easywechat 这个包 composer require "o ...

  7. PAT 1088. Rational Arithmetic

    For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ...

  8. mac Gitblit安装

    jdk下载传送门 gitBlit是java编写的的 第一步 需要安装java jdk 传送门 JDK6的下载地址: http://www.oracle.com/technetwork/java/jav ...

  9. JAVA的输入输出基本操作样例

    这些类的继承关系有些类似,弄一个作为样例,理解一下其中的机制. package cc.openhome; import java.io.*; public class Member { private ...

  10. 孟晓阳:IT运行监控系统设计与使用心得

    http://www.cn-healthcare.com/article/20160325/content-482138.html