CSS设计指南 笔记5

CSS设计指南 笔记5

5 页面布局

5.1 布局的基本概念

多栏布局基本实现方案

  • 固定宽度
    • 布局大小不会随用户调整浏览器窗口大小而变化
  • 流动
    • 布局大小会随用户调整浏览器窗口大小而变化
      • 能更好地适应大屏幕
      • 放弃对页面某些方面的控制
  • 弹性
    • 在浏览器窗口变宽时,不仅布局变宽,所有内容元素的大小也会变化

布局高度

多数情况下,布局中结构化元素(乃至任何元素)的高度是不必设定的

  • 布局能随着内容数量的增加而垂直伸缩

假如明确设定了元素高度,超出的内容要么被裁剪,要么跑到容器之外(取决于overflow属性)

布局宽度

需要更精细地控制布局宽度

即使必须设定栏宽,也不要给包含在其中的内容元素设定宽度,应该让这些内容元素自动扩展到填满栏的宽度

一般原则:应该控制布局宽度,而让内容决定布局高度

5.2 三栏-固定宽度布局

<div id="wrapper">
    <header>
    	<!-- 与布局同宽的页眉 -->
    </header>
    
    <nav>
    	<!-- 栏1 -->
    </nav>
    
    <article>
    	<!-- 栏2 -->
    </article>
    
    <aside>
    	<!-- 栏3 -->
    </aside>
    
    <footer>
    	<!-- 与布局同宽的页脚 -->
    </footer>
</div>
#wrapper {
    width: 960px;
    margin: 0 auto;
    border: 1px solid;
}

nav {
    width: 150px;
    float: left;
}

nav li {
    /* 去掉列表项目符号 */
    list-style-type: none;
}

article {
    width: 600px;
    float: left;
}

aside {
    width: 210px;
    float: left;
}

footer {
    /* 应用清除,阻止上移,不超过浮动元素的下方边界 */
    clear: both;
}

栏的总宽度等于外包装的宽度

为栏设定内边距和边框

调整栏中内容,布局有可能超过容器宽度导致右边的栏滑到左边栏的下方

  • 为例让内容与栏边界空开距离,为栏添加外边界和内边距
  • 在栏中添加大图片或者没有空格的长字符串

解决方式:

  • 重设宽度以抵消内边距和边框

    • 每次调整内、外边距都要重新设定布局宽度
  • 给容器内部的元素应用内边距和边框

    • 前提:内部元素没有明确地设定宽度
    • 问题
      • 如果调整内容与容器边界的距离需要调整每个元素
      • 会增大栏宽
    • 优化:在栏中添加一个没有宽度的div,让它包含所有内容元素,然后给这个div应用边框和内边距
      • 浮动栏并设定栏宽,但不给任何内容元素设定宽度,要让内容元素扩展以填充它们的父元素
  • 使用box-sizing: border-box;

    • 导致内容变短,但不影响布局
    • IE6和IE7不支持

子 - 星选择符

一个组合选择符

星号选择符:选择“所有元素”

子 - 星选择符:选择元素的所有后代元素

someSelector > *

潜在性能问题:会导致浏览器遍历整个DOM结构去查找所有匹配的元素

预防过大的元素

预见到可能出现一些过大的元素(大图片,换行)

  • 添加声明

    .inner img {
        max-width: 100%;
    }
    
  • 给每个栏(或内部div)添加overflow:hidden声明

  • 给所有栏的外包装元素应用word-wrap:break-word声明

5.3 三栏-中栏流动布局

实现三栏布局且让中栏内容区流动(不固定)的核心问题,就是处理右栏的定位,并在中栏内容区大小改变时控制右栏与布局的关系

  • 在中栏改变大小时使用负外边距定位右栏
  • 使用CSS3让栏容器具有类似表格单元的行为
5.3.1 用负外边距实现

控制两个外包装容器的外边距,其中一个外包装包围所有三栏,另一个外包装只包围左栏和中栏

<div id="main_wrapper">
    <header></header>
    
    <div id="threecolwrap"> /* 三栏外包装 */
        <div id="twocolwrap"> /* 两栏外包装 */
        	/* 左栏 */
            <nav></nav>
            
            /* 中栏 */
            <article></article>
    	</div>
        
        /* 右栏 */
        <aside></aside>
    </div>
    
    <footer></footer>
</div>
* {
    margin: 0;
    padding: 0;
}

body {
    font: 1em helvetica, arial, sans-serig;
}

div #main_wrapper {
    min-width: 600px;
    max-width: 1000px;
    /* 超过最大宽度时,布局居中 */
    margin: 0 auto;
}

header {
    padding: 5px 10px;
}

div #threecolwrap {
    /* 浮动强制它包围浮动的栏 */
    float: left;
    width: 100%;
}

div #twocolwrap {
    /* 浮动强制它包围浮动的栏 */
    float: left;
    width: 100%;
    /* 把右栏拉到区域外边距腾出的位置上 */
    margin-right: -210px;
}

nav {
    float: left;
    width: 150px;
    padding: 20px 0;
}

/* 让子元素与栏边距保持一定距离 */
nav > * {
    margin: 0 10px;
}

article {
    width: auto;
    margin-left: 150px;
    /* 在流动居中的栏右侧腾出空间 */
    margin-right: 210px;
    padding: 20px 0;
}

/* 让子元素与栏边距保持一定距离 */
aside > * {
    margin: 0 10px;
}

footer {
    clear: both;
    width: 100%;
    text-alignZ: center;
}

人造栏技术

给包围栏的外包装元素应用与各栏同宽的背景图片和背景色

5.3.2 用CSS3单元格实现

不会导致固定不变的表格布局,也不会出现难以重新应用样式的问题

把布局中的栏设定为table-cell

  • 单元格(table-cell)不需要浮动就可以并排显示,直接为它们应用内边距也不会破坏布局
  • 默认情况下一行中的所有单元格高度相同
  • 任何没有明确设定宽度的栏都是流动的

CSS3表格行为在IE7以及更低版本中没有得到支持

  • 没有任何腻子脚本
<nav>
	<!-- 内容 -->
</nav>
<article>
	<!-- 内容 -->
</article>
<aside>
	<!-- 内容 -->
</aside>
nav {
    display: table-cell;
    width: 150px;
    padding: 10px;
}
article {
    display: table-cell;
    padding: 10px 20px;
}
aside {
    display: table-cell;
    width: 210px;
    padding: 10px;
}

5.4 多行多栏布局

5.4.1 CSS选择符的实际应用

给标记中每个主要区域的顶级元素添加一个ID,放在上下文选择符的开头框定后代元素

5.4.2 内部DIV实战
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值