写在前面:

页面布局整体上可以分为两类:固定宽度(一般固定960px);流式布局;将流式布局转换为固定布局很容易,只需要外围再包括一个div,为其设置宽度即可。

html默认的布局方式是将每个块状标签,一个一个地往上叠加,为static类型的布局。

关于BFC的参考链接:

http://www.iyunlu.com/view/css-xhtml/55.html

http://www.cnblogs.com/pigtail/archive/2013/01/23/2871627.html

布局的一些技巧:

1)pading和margin只是一些空格而已,利用这两个属性就可以将元素移动到网页的任何位置。margin的负值能够实现很多意想不到的效果,可以详见这篇博客:http://www.cnblogs.com/2050/archive/2012/08/13/2636467.html#2457812

3)对于position:absolute元素,完全脱离原来层,其在原来层实际占据高度和宽度都是0;对于position:relative元素,依旧占据原来的高度和宽度,如果设置top,left不为0就会形成窟窿。

4)对float元素设置负边距,可能导致元素上移,这是圣杯布局和双飞翼布局的根据。

4)对于浮动元素。浮动的框可以左右移动,直至它的外边缘遇到包含框或者另一个浮动框的边缘。当一个元素浮动之后,不会影响到块级框的布局而只会影响内联框(通常是文本)的排列,文档中的普通流就会表现得和浮动框不存在一样,当浮动框高度超出包含框的时候,也就会出现包含框不会自动伸高来闭合浮动元素(“高度塌陷”现象)。 解决方法时为包含框创建BFC环节。

其实,很多问题的本质都是对BFC(块级上下文)的理解问题

通俗地来说:创建了 BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,反之亦然,同时BFC任然属于文档中的普通流。

4)BFC(块级上下文)环境特性

  • 解决上下元素margin重叠的问题,块级上下文会阻止上下外边距重叠,总边距就是上下边距之和
  • 不和浮动元素重叠,创建了 Block Formatting Context 的元素不能与浮动元素重叠
  • 闭合浮动,并且防止高度塌陷;块级上下文会width和height会包含其中的所有元素,包括浮动元素,这是利用BFC解决高度塌陷的原因

5)让浮动元素的父元素拥有BFC执行换件:

  • float的值不为none。
  • overflow的值不为visible,可以是hidden或者auto
  • display的值为table-cell, table-caption, inline-block中的任何一个。
  • position的值不为relative和static。

浮动布局策略

1)除非像图片这样本身已经设置了宽度的元素,否则需要给任何浮动元素设置width(px,em或者百分比),只有这样,才能让浏览器给其他内容腾出环绕的空间。

2)要创建多列并排的效果(如两列并排),通常需要给正文添加一个大于或者等于侧边栏宽度的margin,这是因为:

a.因为两个列在同一个BFC中,因此都是从包围元素的左侧开始布局,所以要求margin大于等于侧边栏的宽度;

b.注意步骤a中设置的是margin不是padding,否则如果主列设置有背景色,依旧达不到想要的效果

c.如果想要实现多列等高,通常需要为其中各列设置较大的padding-bottom值,再设置与padding-bottom一直的负margin-bottom值来达到这一效果;这是因为文档流放置的元素是考虑margin在哪里而非实际内容。同时还需要为外围元素添加overflow: hidden

下面是几个实际的案例

A.创建两列布局(要求,侧边栏左浮动,主列宽度自适应,要求不管内容高度是多少,都能实现两列等高)

分析:因为要求主列自适应,主列就不能也浮动,因为元素一旦浮动都要求为其设置width(百分比或者精确值)

    <div class="task1">
        <div class="sidebar"></div>
        <div class="main"></div>
    </div>

对应的布局代码如下:

.task1{
    overflow: hidden;
}
.task1 .sidebar{
    width:200px;
    height:300px;
    float:left;
    background: red;
    padding-bottom:400px;
    margin-bottom:-400px;
}
.task1  .main{
    height:500px;
    background:pink;
  /*  padding-left:210px;*/
    margin-left:210px;
    padding-bottom:400px;
    margin-bottom:-400px;
}

B.创建三列布局

要求:两个侧边栏一左一右浮动,主列宽度自适应,各列等高

<div class="task2">
        <div class="sidebar"></div>
        <div class="extra"></div>
        <div class="main"></div>
    </div>

对应的布局代码:

.task2{
    overflow: hidden;
}
.task2 .sidebar{
    width:160px;
    height:300px;
    background:red;
    padding-bottom:400px;
    margin-bottom: -400px;
    float:left;
}
.task2 .main{
    height:200px;
    background: pink;
    padding-bottom:400px;
    margin-bottom:-400px;
    margin-left:170px;
    margin-right:210px;
}
.task2 .extra{
    height:400px;
    width:200px;
    float:right;
    background: blue;
    padding-bottom: 400px;
    margin-bottom: -400px;
}

根据浮动元素的排列方式,它们必须出现在环绕它们四周的所有内容之前,因此在上面的案例中,正文区域只能在左右两个侧边栏之后。

由此引发了第三个问题:

C:创建三列布局

要求(为了对搜索引擎友好,main区域要求在左右侧边栏的前面,同时main区域的宽度自适应,各列等高)

对此可以采用双飞翼布局或者圣杯布局,参见博客:

http://www.cnblogs.com/bobodeboke/p/4738768.html

3)清除浮动,clear。如果要让元素下落到左浮动对象的下方clear:left;或者右浮动对象的下方:right;对于页脚或其他需要显示在页面底部的元素,可以使用clear:both.本质上解决方法有两种:

  • a:让浮动元素所在的父元素拥有BFC环境
  • b:让浮动元素后面的元素清除浮动。

4)闭合浮动的方法(闭合比清除浮动更贴切)

当浮动元素高于外围元素(如div)里面其他内容时,就会从外围元素的底部凸出来,如果外围元素带有背景或者边框,这种高度塌陷情况就更加明显。解决的本质是

a)让包括浮动元素的外围元素拥有BFC环境,方法同上。

b)在外围元素的底部添加一个清除元素,此时可以:

a:在外围元素div的底部加一个清楚元素,如<br class=".clear">

d:在外围<div>中添加一些样式和类名。如.clearfix,其本质也是通过在浮动元素后面,通过:after伪类添加一个清除元素,针对ie,通过zoom触发器hasLayout

.clearfix:after{
   content:"";
  display:table;
  clear:both;
}

.clearfix{
   zoom:;
}

这些都可以强制外围块扩大到包含浮动元素。

 

5)防止浮动下落(float drop)

浏览器窗口显示的元素宽度并不等于它的width值,而是left/right border,left/right margin,left/right padding三者值的总和。float drop总是由于没有足够空间容纳所有列,导致有的浮动元素落到下一列造成。此时的解决方法:

(1)严格计算,所有列的总和<=100%

(2)使用box-sizing属性,如将下列代码放在css reset中

注意:clearfix解决的是浮动问题中的图片凸出,对于绝对定位中的图片凸出是没有办法的,此时只能够定义外围元素的高度

*{
-moz-box-sizing:border-box;
box-sizing:border-box;
}

还有其他属性,background-clip,background-origin的取值和box-sizing一样,有 content-box,padding-box,border-box

css响应式布局

响应式布局(RWD)结合了三大理念:

基于布局的弹性网格:响应式布局中不在使用固定布局,而使得宽度随着屏幕大小而改变。

用于图片和视频的弹性媒体:使得图片和媒体能够进行缩放,以适应不同的屏幕大小。

为不同屏幕宽度创建不同样式的css媒体查询:根据当前条件为浏览器发送不同的样式。

  • 通过在<head>中添加response.js,可以让旧版IE支持媒体查询;
  • 媒体查询通过引入不同的样式文件来实现,如<link href="css/small.css" rel="stylesheet" media="(max-width:580px)">
  • 不过当前最通用的,还是在样式文件中嵌入媒体查询

最新文章

  1. MAC OS X El CAPITAN 搭建SPRING MVC (1)- 目录、包名、创建web.xml
  2. 2015-9月份,Android开发,面试题总结,主要记录没有答出来的问题
  3. bzoj1468 Tree
  4. Python基础篇【第7篇】: 面向对象(2)
  5. C#密封类
  6. PHP中常用的正则表达式由哪些元素构成?
  7. 分享一套精美的现代 UI PSD 工具包【免费下载】
  8. VMWare10安装Ubuntu 13.10过程
  9. Python按行读取文件
  10. Vitaliy and Pie(模拟)
  11. POJ 3041 Asteroids(匈牙利+邻接表)
  12. 用PetaPoco为ASP.NET已有数据库建模
  13. (Sqlyog或Navicat不友好处)SHOW ENGINE INNODB STATUS 结果为空或结果为=====================================
  14. 关于UIView用户交互相关的属性和方法
  15. 微信小程序录音实现
  16. [工具向]__关于androidstudio工具使用过程中学习到的一些知识点简记
  17. ASP.NET MVC4添加区域视图 找到多个与名为“home”的控制器匹配的类型
  18. 百度统计api获取数据
  19. Winform开发框架之字段权限控制
  20. 菜鸟在ubuntu 16.04下制作am335x的SD卡启动盘反思

热门文章

  1. cURL 学习笔记与总结(2)网页爬虫、天气预报
  2. DirectX 常用选项(转)
  3. Ubuntu 14.04 为 root 帐号开启 SSH 登录
  4. delphi 高版本可执行程序减小的办法
  5. Java 遍历Map时 删除元素
  6. The Producer-Consumer Relationship
  7. phpcms 导航栏点击栏目颜色定位方法
  8. JS中数组对象去重
  9. VB的注释
  10. ecshop