前端布局layout总结,左右布局,上中下布局

老生长谈:css实现右侧固定宽度,左侧宽度自适应

反过来也可以:左侧宽度固定,右侧自适应。不管是左是右,反正就是一边宽度固定,一边宽度自适应。

这种布局比较常见,博客园很多默认主题就是这种。一般情况下,这种布局中宽度固定的区域是侧边栏,而自适应的区域是主体内容区——相信把侧边栏搞成自适应的人很少吧?

要实现这种布局,也算比较简单。我们先给出html结构:

1
2
3
4
5
<div id="wrap">
   <div id="sidebar" style="height:240px;">固定宽度区 </div>
   <div id="content" style="height:340px;">自适应区 </div>
</div>
<div id="footer">后面的一个DIV,以确保前面的定位不会导致后面的变形 </div>

代码中的#wrap的div,是用来包裹我们要定位的这两个区的;他后面还有个#footer,用来测试在前面的定位搞定后会不会导致后面的div错位——如果错位了,那证明我们的定位方法必须改进。

下面列举几个常见的方法:

1,固定宽度区浮动,自适应区不设宽度而设置 margin

我们拿右边定宽左边自适应来做示范,CSS代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#wrap  {
     overflow :  hidden ;  *zoom :  1 ;
   }
  # content  , #sidebar  {
     background-color :  #eee ; 
   }
   #sidebar  {
     float :  right ;  width :  300px ;
   }
  # content  {
     margin-right :  310px ;
   }
   #footer  { background-color :  #f00 ; color : #fff ;  margin-top :  1em }

其中,sidebar让他浮动,并设置了一个宽度;而content没有设置宽度。

大家要注意html中必须使用div标签,不要妄图使用什么p标签来达到目的。因为div有个默认属性,即如果不设置宽度,那他会自动填满他的父标签的宽度。这里的content就是例子。

当然我们不能让他填满了,填满了他就不能和sidebar保持同一行了。我们给他设置一个margin。由于sidebar在右边,所以我们设置content的margin-right值,值比sidebar的宽度大一点点——以便区分他们的范围。例子中是310.

假设content的默认宽度是100%,那么他设置了margin后,他的宽度就变成了100%-310,此时content发现自己的宽度可以与sidebar挤在同一行了,于是他就上来了。

而宽度100%是相对于他的父标签来的,如果我们改变了他父标签的宽度,那content的宽度也就会变——比如我们把浏览器窗口缩小,那wrap的宽度就会变小,而content的宽度也就变小——但,他的实际宽度100%-310始终是不会变的。

这个方法看起来很完美,只要我们记得清除浮动(这里我用了最简单的方法),那footer也不会错位。而且无论content和sidebar谁更长,都不会对布局造成影响.
 

但实际上这个方法有个很老火的限制——html中sidebar必须在content之前

但我需要sidebar在content之后!因为我的content里面才是网页的主要内容,我不想主要内容反而排在次要内容后面。

但如果sidebar在content之后,那上面的一切都会化为泡影。

可能有的人不理解,说你干嘛非要sidebar在后面呢?这个问题说来话长,反正问题就是——content必须在sidebar之前,但content宽度要自适应,怎么办?

下面有两个办法,不过我们先把html结构改成我们想要的样子:

1
2
3
4
<div id="wrap">
   <div id="content" style="height:340px;">自适应区,在前面 </div>
   <div id="sidebar" style="height:240px;">固定宽度区 </div>
</div>

2,固定宽度区使用绝对定位,自适应区照例设置margin

我们把sidebar扔掉,只对content设置margin,那么我们会发现content的宽度就已经变成自适应了——于是content对sidebar说,我的宽度,与你无关。

content很容易就搞定了,此时来看看sidebar,他迫不得已抛弃了float。我们来看看sidebar的特点:在右边,宽度300,他的定位对content不影响——很明显,一个绝对主义分子诞生了。

于是我们的css如下:

1
2
3
4
5
6
7
8
9
#wrap  {
     *zoom :  1 ;  position :  relative ;
   }
   #sidebar  {
     width :  300px ;  position :  absolute ;  right :  0 ;  top :  0 ;
   }
  # content  {
     margin-right :  310px ;
   }

这段css中要注意给wrap加上了相对定位,以免sidebar太绝对了跑到整个网页的右上角而不是wrap的右上角。

好像完成了?在没有看footer的表现时,我很欣慰。我们来把sidebar加长——增长100px!不要一年,只要一条内裤!哦,,,只要一句代码。


但是,footer怎么还是在那儿呢?怎么没有自动往下走呢?footer说——我不给绝对主义者让位!

其实这与footer无关,而是因为wrap对sidebar的无视造成的——你再长,我还是没感觉。

看来这种定位方式只能满足sidebar自己,但对他的兄弟们却毫无益处。

3,float与margin齐上阵

经过前面的教训,我们重新确立了这个自适应宽度布局必须要达成的条件:

  1. sidebar宽度固定,content宽度自适应
  2. content要在sidebar之前
  3. 后面的元素要能正常定位,不能受影响

由于绝对定位会让其他元素无视他的存在,所以绝对定位的方式必须抛弃。

如果content和sidebar一样,都用float,那content的自适应宽度就没戏了;如果不给content加float,那sidebar又会跑到下一行去。

所以,最终我决定:float与margin都用。

我打算把content的宽度设为100%,然后设置float:left,最后把他向左移动310,以便于sidebar能挤上来。

但这么一来content里面的内容也会跟着左移310,导致被遮住了,所以我们要把他重新挤出来。为了好挤,我用了一个额外的div包裹住内容,所以html结构变成了这种样子:

1
2
3
4
5
6
7
8
<div id="wrap">
   <div id="content" style="height:140px;">
     <div id="contentb">
      content自适应区,在前面
     </div>
   </div>
   <div id="sidebar" style="height:240px;">sidebar固定宽度区 </div>
</div>

css则变成这样:

1
2
3
4
5
6
7
8
9
#sidebar  {
     width :  300px ;  float :  right ;
   }
  # content  {
     margin-left :  -310px ;  float :  left ;  width :  100% ;
   }
   #contentb  {
     margin-left :  310px ;
   }

这样一改,真正的“content”就变成了contentb,他的宽度跟以前的content一样,是100%-310.

大家可能注意到了代码中的两个margin-left,一个-310px一个310px,最后结合起来相当于什么都没干,着实蛋疼。但他确实解决了content与sidebar的顺序问题。

这个方法的缺点就是:太怪异,以及额外多了一层div。

4,标准浏览器的方法

当然,以不折腾人为标准的w3c标准早就为我们提供了制作这种自适应宽度的标准方法。那就简单了:把wrap设为display:table并指定宽度100%,然后把content+sidebar设为display:table-cell;然后只给sidebar指定一个宽度,那么content的宽度就变成自适应了。

代码很少,而且不会有额外标签。不过这是IE7都无效的方法。

———————割尾巴————————-

如果不考虑ie7及以下版本,则使用标准方法;如果不在意sidebar与content的顺序,则用第一种方法;否则用第3种方法。

以上代码都没在IE6测试,有问题不负责解释。个人觉得,让IE6寿终正寝的办法就是——从此不再理他。

在网页设计中,我经常遇到div一边固定、一边自适应的需求,在学习了关于CSS的一些书籍和网上的一些案例后,总结了两个例子,以便应对以后的不时之需。话不多说,直接看代码。

第一个,是div左边变化,右边固定的代码:

[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <title></title>  
  5.     <style type="text/css">  
  6.         #header,#footer  
  7.         {  
  8.             width:100%;  
  9.             height:150px;  
  10.             background:#ff0;  
  11.             border:1px dashed #f00;  
  12.         }  
  13.         #container  
  14.         {  
  15.             width:100%;  
  16.             height:500px;  
  17.             border:1px dashed #0f0;  
  18.             background:#ffd;  
  19.         }  
  20.         #sidebar  
  21.         {  
  22.             width:300px;  
  23.             background:orange;  
  24.             border:2px dotted inherit;  
  25.             float:right;  
  26.             height:100%;  
  27.         }  
  28.         #extraContent  
  29.         {  
  30.             float:left;  
  31.             width:100%;  
  32.             margin-left:-304px;  
  33.             height:100%;  
  34.         }  
  35.         #content  
  36.         {  
  37.             margin-left:304px;  
  38.             background:#dec;  
  39.             height:100%;  
  40.         }  
  41.     </style>  
  42. </head>  
  43. <body>  
  44.     <div id="header">  
  45.         标题  
  46.     </div>  
  47.     <div id="container">  
  48.         <div id="extraContent">  
  49.             <div id="content">  
  50.                 内容  
  51.             </div>  
  52.         </div>  
  53.         <div id="sidebar">  
  54.             侧边栏  
  55.         </div>  
  56.     </div>  
  57.     <div id="footer">  
  58.         页尾  
  59.     </div>  
  60. </body>  
  61. </html>  

效果如下:


想要变成左边固定,右边变化很简单,只需要将 sidebar 的 float 设为 left ,extraContent 的 float 设为 right 即可。


第二个,是div上边固定,下边变宽的代码:

[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <title></title>  
  5.     <style type="text/css">  
  6.         html,body  
  7.         {  
  8.             margin:0;  
  9.             padding:0;  
  10.             width:100%;  
  11.             height:100%;  
  12.         }  
  13.         #main  
  14.         {  
  15.             padding: 0;  
  16.             margin: 0;  
  17.             width: 100%;  
  18.             height: 100%;  
  19.             background:#gray;  
  20.         }  
  21.           
  22.         #right  
  23.         {  
  24.             width: auto;  
  25.             height: 100%;  
  26.             margin-left: 325px;  
  27.             padding: 0;  
  28.              background:#ffd;  
  29.         }  
  30.         #left  
  31.         {  
  32.             width: 320px;  
  33.             height: 100%;  
  34.             float: left;  
  35.             position:relative;  
  36.             padding-top:320px;  
  37.             box-sizing: border-box;/*为元素设定的宽度和高度决定了元素的边框盒*/  
  38.         }  
  39.         #left_top  
  40.         {  
  41.             width: 100%;  
  42.             height: 318px;  
  43.             background:#ff0;  
  44.             position:absolute;  
  45.             top:0;  
  46.             left:0;  
  47.         }  
  48.   
  49.         #left_bottom  
  50.         {  
  51.             height:100%;  
  52.             overflow: scroll;  
  53.             background:#dec;  
  54.         }  
  55.     </style>  
  56. </head>  
  57. <body>  
  58.     <div id="main">  
  59.         <div id="left">  
  60.             <div id="left_top">  
  61.                 定高  
  62.             </div>  
  63.   
  64.             <div id="left_bottom">  
  65.             <pre>  
  66.             变高1  
  67.             变高2  
  68.             变高3  
  69.             变高4  
  70.             变高5  
  71.             变高6  
  72.             变高7  
  73.             变高8  
  74.             变高9  
  75.             变高10  
  76.             变高11  
  77.             变高12  
  78.             变高13  
  79.   
  80.   
  81.   
  82.   
  83.   
  84.   
  85.   
  86.   
  87.             变高50  
  88.   
  89.   
  90.   
  91.   
  92.   
  93.   
  94.             变高 100  
  95.             </pre>  
  96.   
  97.             </div>  
  98.         </div>  
  99.         <div id="right">  
  100.         内容区域  
  101.         </div>  
  102.     </div>  
  103. </body>  
  104. </html>  

效果如下:


这其中的关键就是 
[html]  view plain  copy
  1. box-sizing: border-box;  
因为正常情况下,我们给元素设置的宽高都是指content(内容)的宽高。而加完这个属性后,width, height 就变成了border(边框)之内的宽高,也即 content+padding 所包含的大小。这样我们就可以通过设置padding的大小从而达到控制元素宽高的目的了。

猜你喜欢

转载自blog.csdn.net/hahahhahahahha123456/article/details/80211279