精通CSS(2)-布局

css布局被认为是一个很麻烦的东西,可能它本身并不复杂,只是浏览器的不一致让人觉得很头疼。对于初学者来说或许框架能更快的得到想要的结果,但这种傻逼的使用方式蒙蔽了布局的内部原理,这是非常可怕的!

所有css布局技术的根本都是3个基本概念:定位、浮动和外边距操控(喵了个咪的,怎么又是3个)。下面开始写代码(一定要自己写一遍)。

1.浮动布局

貌似浮动布局是最简单也是最可靠的,先来一个简单的两栏布局,页面居中:

代码方案:

[html]  view plain copy
  1. <html>  
  2. <body>  
  3. <div class="wrapper">  
  4.     <div class="header">head</div>  
  5.     <div class="container">  
  6.         <div class="leftbar">  
  7.             <p>left</p>  
  8.             <p>left</p>  
  9.         </div>  
  10.         <div class="content">  
  11.             <p>content</p>  
  12.             <p>content</p>  
  13.             <p>content</p>  
  14.             <p>content</p>  
  15.             <p>content</p>  
  16.             <p>content</p>  
  17.         </div>  
  18.     </div>  
  19.     <div class="clear"></div>  
  20.     <div class="footer">footer</div>  
  21. </div>  
  22. <style type="text/css">  
  23. /*让容器水平居中,但IE6不支持margin:auto属性,解决方法是利用text-align:center*/  
  24. body{  
  25.     text-align: center;/*IE6君认为该属性让所有的东西都居中*/  
  26. }  
  27. .wrapper{  
  28.     width: 960px;  
  29.     margin: 0 auto;  
  30.     text-align: left;/*调整text-align为左对齐*/  
  31. }  
  32. .header,.footer{  
  33.     height: 60px;  
  34.     background-color: #9a2;  
  35. }  
  36. .leftbar{  
  37.     width: 200px;  
  38.     float: left;  
  39.     background-color: #00f;  
  40. }  
  41. .content{  
  42.     width: 740px;/*空出20px作为隔离带*/  
  43.     float: right;  
  44.     background-color: #0e8;  
  45. }  
  46. .clear{clear:both;}  
  47. </style>  
  48. </body>  
  49. </html>  


 然后再来个三栏布局,只要稍微改一下代码:

[html]  view plain copy
  1. <html>  
  2. <body>  
  3. <div class="wrapper">  
  4.     <div class="header">head</div>  
  5.     <div class="container">  
  6.         <div class="leftbar">  
  7.             <p>left</p>  
  8.             <p>left</p>  
  9.         </div>  
  10.         <div class="content">  
  11.             <div class="main-content">  
  12.                 <p>content</p>  
  13.                 <p>content</p>  
  14.                 <p>content</p>  
  15.                 <p>content</p>  
  16.                 <p>content</p>  
  17.                 <p>content</p>  
  18.             </div>  
  19.             <div class="rightbar">  
  20.                 <p>right</p>  
  21.                 <p>right</p>  
  22.             </div>  
  23.         </div>  
  24.     </div>  
  25.     <div class="clear"></div>  
  26.     <div class="footer">footer</div>  
  27. </div>  
  28. <style type="text/css">  
  29. /*让容器水平居中,但IE6不支持margin:auto属性,解决方法是利用text-align:center*/  
  30. body{  
  31.     text-align: center;/*IE6君认为该属性让所有的东西都居中*/  
  32. }  
  33. .wrapper{  
  34.     width: 960px;  
  35.     margin: 0 auto;  
  36.     text-align: left;/*调整text-align为左对齐*/  
  37. }  
  38. .header,.footer{  
  39.     height: 60px;  
  40.     background-color: #9a2;  
  41. }  
  42. .leftbar{  
  43.     width: 200px;  
  44.     float: left;  
  45.     background-color: #00f;  
  46. }  
  47. .content{  
  48.     width: 740px;/*空出20px作为隔离带*/  
  49.     float: right;  
  50.     background-color: #0e8;  
  51. }  
  52. .clear{clear:both;}  
  53. /*在content内部再分浮动,形成3栏布局*/  
  54. .main-content{  
  55.     width: 600px;  
  56.     float: left;  
  57.     background-color: #7621de;  
  58. }  
  59. .rightbar{  
  60.     width: 120px;  
  61.     float: right;  
  62.     background-color: #b23aa2;  
  63. }  
  64. </style>  
  65. </body>  
  66. </html>  
效果图:


浮动布局的方法有很多,用起来也特别方便。虽然效果图是挫了点,但不要在意这些细节,这不是重点。。。

2.固定宽度、流式和弹性布局

2.1固定宽度布局

固定宽度布局就是以像素为单位的布局,上面的两个例子都是固定宽度布局。这种布局的好处是知道每个元素的精确宽度,非常方便。坏处就是在不同分辨率的显示器下会出现显示溢出或者大量空白。随着屏幕尺寸的多样化,外加移动web的需求,固定宽度布局常常被认为是糟糕的权益之计。

2.2流式布局

流式布局的灵活性更大,因为它采用的是百分数布局。这样随着不同窗口大小可以进行伸缩。一般还会添加以像素或em为单位的min-width来防止布局变得太窄。(有关min-width和min-height与浏览器兼容性问题,请戳这里:点击打开链接)。

在这里再总结一下px和em的关系。px是按像素计算的绝对单位。em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸(任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px)。

那么12px=0.75em,10px=0.625em。为了简化font-size的换算,需要在css中的body选择器中声明 Font-size=62.5%,这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了。

em有如下特点:

  • em的值并不是固定的;
  • em会继承父级元素的字体大小。

所以我们在写CSS的时候,需要注意几点:

  • body选择器中声明Font-size=62.5%;
  • 将你的原来的px数值除以10,然后换上em作为单位;
  • 重新计算那些被放大的字体的em数值。避免字体大小的重复声明。

也就是避免1.2 * 1.2= 1.44的现象。比如说你在#content中声明了字体大小为1.2em,那么在声明p的字体大小时就只能是1em,而不是1.2em, 因为此em非彼em,它因继承#content的字体高而变为了1em=12px。

但是12px汉字例外,就是由以上方法得到的12px(1.2em)大小的汉字在IE中并不等于直接用12px定义的字体大小,而是稍大一点。这个问 题 Jorux已经解决,只需在body选择器中把62.5%换成63%就能正常显示了。原因可能是IE处理汉字时,对于浮点的取值精确度有限。

2.3弹性布局

虽然流式布局比固定布局好,但是当分辨率过大时行会过长,窗口太窄时行会很短。对于这个问题,弹性布局可能是一种解决方案。

弹性布局相对于字号来设置元素的宽度,而不是浏览器宽度。以em为单位设置宽度,可以确保在字号增加时整个布局随之扩大。

[html]  view plain copy
  1. <html>  
  2. <body>  
  3. <div class="wrapper">  
  4.     <div class="header">head</div>  
  5.     <div class="container">  
  6.         <div class="leftbar">  
  7.             <p>left</p>  
  8.             <p>left</p>  
  9.         </div>  
  10.         <div class="content">  
  11.             <div class="main-content">  
  12.                 <p>content</p>  
  13.                 <p>content</p>  
  14.                 <p>content</p>  
  15.                 <p>content</p>  
  16.                 <p>content</p>  
  17.                 <p>content</p>  
  18.             </div>  
  19.             <div class="rightbar">  
  20.                 <p>right</p>  
  21.                 <p>a a a a</p>  
  22.             </div>  
  23.         </div>  
  24.     </div>  
  25.     <div class="clear"></div>  
  26.     <div class="footer">footer</div>  
  27. </div>  
  28. <style type="text/css">  
  29. /*让容器水平居中,但IE6不支持margin:auto属性,解决方法是利用text-align:center*/  
  30. body{  
  31.     text-align: center;/*IE6君认为该属性让所有的东西都居中*/  
  32. }  
  33. .wrapper{  
  34.     font-size: 62.5%;/*调整字号为默认16px的62.5%,使10px=1em,方便计算*/  
  35.     max-width: 95%;  
  36.     width: 96em;  
  37.     margin: 0 auto;  
  38.     text-align: left;/*调整text-align为左对齐*/  
  39. }  
  40. .header,.footer{  
  41.     height: 6em;  
  42.     background-color: #9a2;  
  43. }  
  44. .leftbar{  
  45.     width: 20%;  
  46.     float: left;  
  47.     background-color: #00f;  
  48. }  
  49. .content{  
  50.     width: 78%;   
  51.     float: right;  
  52.     background-color: #0e8;  
  53. }  
  54. .clear{clear:both;}  
  55. /*在content内部再分浮动,形成3栏布局*/  
  56. .main-content{  
  57.     width: 80%;  
  58.     float: left;  
  59.     background-color: #7621de;  
  60. }  
  61. .rightbar{  
  62.     width: 18%;  
  63.     float: right;  
  64.     background-color: #b23aa2;  
  65. }  
  66. </style>  
  67. </body>  
  68. </html>  

上面只是以em为容器单位,但内部div使用的仍然是百分比。这样内部宽度仍然是相对字号的,可以很方便的修改布局的总尺寸,不必修改每个宽度的尺寸。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值