Web布局中的几种宽高自适应

当然像亚马逊首页那一种布局会更个性化一些,它会根据用户持有设备的屏幕大小而现实内容。例如:一部PC机上可能一排现实5个商品,一部iPad上可能显示3个商品,而一部手机上可能一排只显示1个商品。至少不要 出现如下这种情况,在符合W3C标准的浏览器中显示正常,而在IE6,7中页面乱套,因为IE6,7仍然拥有很庞大的用户群;即使你做的Web应用是面向某些企业用户的,这种情况下用户较少,但你也不能强求用户使用哪一种浏览器。要解决这个问题,这就需要用到页面布局中的自适应,虽然这个问题看起来很简单。

我在这里将会介绍三种我最近在项目中用到的自适应:

◆ 页面整体宽度自适应

◆ iframe宽高自适应

◆ jqgrid高度自适应

页面整体宽度自适应

先看看下面的页面基本布局图

页面分为三个部分:

(1) Header,这一部分宽度自适应

(2) Left 左边栏,为定宽200px,一般为菜单或导航

(3) Right右侧主内容区域,宽度自适应

既然做了分解,我们就把它当做需求来一步一步实现它吧,首先是Header区域。

请看代码1:

 
 
 
 
  1.  
  2. body{  
  3. font-family: Arial, Helvetica, sans-serif;  
  4. margin: 0;  
  5. padding: 0;  
  6. }  
  7. #header  
  8. {  
  9. height: 70px;  
  10.  margin: 20px 30px;  
  11. padding: 0;  
  12. border: 1px solid #ccc;  
  13. }  
  14.  
  15.  
  16.  
  17.  
  18.  
 
  •  
  • 关键的代码只有一行,我已经标出。

    现在有一个问题了,如果Header的内容也比较丰富,可能Logo + Banner的总宽度为1000px了,但有些小屏幕却看不完整,这时我们得为这个Header 加个最小宽度限制。在IE 7 +和W3C浏览器中,拥有一个min-width属性可以实现这个效果,但是IE6不支持(参照各版本IE浏览器CSS兼容性列表)。不过css expression可以帮我们解决这个问题,请看代码2:

     
     
     
     
    1.  
    2.  
    3.  
    4.  
    5. Header自适应 
    6.  
    7. body{  
    8. font-family: Arial, Helvetica, sans-serif;  
    9. margin: 0;  
    10. padding: 0;  
    11. }  
    12. #header  
    13. {  
    14. /* IE6 不支持min-width属性,但是IE7+和W3C支持 */  
    15. min-width:1000px;  
    16. /* 用CSS表达式让IE6也支持最小宽度 */  
    17. _width:expression((document.documentElement.clientWidth||document.body.clientWidth)<1000?"1000px":"");  
    18. height: 70px;  
    19.  padding-left: 30px;  
    20. padding-right: 30px;  
    21. }  
    22. #header_content{  
    23. width: 100%;  
    24. border: 1px solid #ccc;  
    25. height: 100%;  
    26. }  
    27.  
    28.  
    29.  
    30.  
    31.  
    32.  
     
  •  
  •  
  •  
  •  
  • 在代码2中我并没有直接更改#header用margin属性来控制,虽说margin:0 auto可以来控制居中自适应,但是如果需要页边距为30像素时用margin: 0 30px则不行了了(在Firefox满屏是可以的,但浏览器缩小时,左侧nargin是存在的,而右侧被吃掉了)

    #p#

    OK,现在已经实现Header部分的居中自适应了,下面的Left和Right也不会麻烦。虽然上面的Header层使用了expression来实现宽度自适应,但是下面的Right层则不能使用同样的方式,因为Header层依赖的是body,而Right层则不是。如果不考虑IE6的存在,则用如下代码就可以实现本文开头的布局图。请看代码3:

     
     
     
     
    1.  
    2. body{  
    3. font-family: Arial, Helvetica, sans-serif;  
    4. margin: 0;  
    5. padding: 0;  
    6. }  
    7. #header  
    8. {  
    9. /* IE6 不支持min-width属性,但是IE7+和W3C支持 */  
    10. min-width:1000px;  
    11. /* 用CSS表达式让IE6也支持最小宽度 */  
    12. _width:expression((document.documentElement.clientWidth||document.body.clientWidth)<1000?"1000px":"");  
    13. height: 70px;  
    14. padding-left: 30px;  
    15. padding-right: 30px;  
    16. }  
    17. #header_content{  
    18. width: 100%;  
    19. border: 1px solid #ccc;  
    20. height: 100%;  
    21. }  
    22. #main{  
    23. /* IE6 不支持min-width属性,但是IE7+和W3C支持 */  
    24. min-width:1000px;  
    25. /* 用CSS表达式让IE6也支持最小宽度 */  
    26. _width:expression((document.documentElement.clientWidth||document.body.clientWidth)<1000?"1000px":"");  
    27. height: 70px;  
    28. padding-left: 30px;  
    29. padding-right: 30px;  
    30. margin-top: 20px;  
    31. }  
    32. #left{  
    33. border: 1px solid #ccc;  
    34. float: left;  
    35. vertical-align:middle;  
    36. text-align:center;  
    37. width: 200px;  
    38. }  
    39. #right{  
    40. border: 1px solid #ccc;  
    41.  float: right;  
    42. position: absolute;  
    43. left: 240px;  
    44. right: 30px;  
    45. min-width: 790px;  
    46. vertical-align:middle;  
    47. text-align:center;  
    48. overflow: hidden;  
    49. }  
    50.  
    51.  
    52.  
    53.  
    54.  
    55.  
    56.  
    57.  
    58.  
    59.  
    60. Left

       
    61.  
    62.  
    63. Right

       
    64.  
    65.  
    66.  

    红色部分标出的是关键代码,又回到之前的问题了,min-width属性在IE6中不支持,所以你在IE6中运行代码3将得不到我们预期的结果。那么,现在就要借助js来实现这个效果了。请看代码4:

     
     
     
     
    1. View Code  
    2.  
    3. "text/css">
       
    4. body {
       
    5.     margin:0;
       
    6.     padding: 0;
       
    7. }
       
    8. #container {
       
    9.     /* IE6 不支持min-width属性,但是IE7+和W3C支持 */
       
    10.     min-width:1000px;
       
    11.     /* 用CSS表达式让IE6也支持最小宽度 */
       
    12.     _width:expression((document.documentelement.clientwidth||document.body.clientwidth)<1000?"1000px":"");
       
    13.     margin: 0 auto;
       
    14. }
       
    15. #header {
       
    16.     /* IE6 不支持min-width属性,但是IE7+和W3C支持 */
       
    17.     min-width:940px;
       
    18.     height: 70px;
       
    19.     padding-left: 30px;
       
    20.     padding-right: 30px;
       
    21. }
       
    22. /* Header Content的实际宽度已经为1002px了 */
       
    23. #header_content {
       
    24.     width: 100%;
       
    25.     border: 1px solid #ccc;
       
    26.     height: 100%;
       
    27. }
       
    28. #main {
       
    29.     padding-left:30px;
       
    30.     padding-right: 30px;
       
    31.     margin-top: 10px;
       
    32. }
       
    33. #main_content {
       
    34.     width: 100%;
       
    35. }
       
    36. #left {
       
    37.     border: 1px solid #ccc;
       
    38.     width: 200px;
       
    39.     float: left;
       
    40. }
       
    41. #right {
       
    42.     border: 1px solid #ccc;
       
    43.     float: right;
       
    44.     min-width:700px;
       
    45. }
       

    46.  
    47. "text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js">
       
    48. "text/javascript">
       
    49.     $(document).ready(function(){
       
    50.             //调用函数
       
    51.             var pagestyle = function() {
       
    52.                 var right = $("#right");
       
    53.                 // 请注意这个3减去300的实际算法
       
    54.                 var w  = $(window).width() - 300;
       
    55.                 if(w < 700){
       
    56.                     w   = 700;
       
    57.                 }
       
    58.                 right.width(w);
       
    59.             }
       
    60.             // 窗体加载时自适应宽度
       
    61.             pagestyle();
       
    62.             // 注册窗体改变大小事件 
       
    63.             $(window).resize(pagestyle);
       
    64.     });
       
    65.      
       

    66.  
    67. "container">
       
    68.   "header">
       
    69.     "header_content"> "http://images.cnblogs.com/logo_small.gif" alt=""> 
       
    70.   
       
    71.   "main">
       
    72.     "left">
       
    73.       

      Left


       
    74.     
       
    75.     "width: 1049px; " id="right">
       
    76.       

      Right


       
    77.     
       
    78.    
    79.  
    80.  
     

    代码中有几处要注意的地方,我在下图中有标注出来,要查看运行结果,请复制上面的代码保存为html,所有url都是外部链接。

    ***部分终于讲完了,呼~~~。

    #p#

    iframe宽高自适应

    有了前面的基础,要做iframe的宽高自适应就很简单了。iframe高度自适应是根据屏幕的高度来的(无滚动条),宽度自适应已经通过前面的方式实现了,高度自适应只需要对height属性进行计算处理就可以实现。

    根据上面提供的代码,要更改的地方很少。这里有一个完整的iframe例子下载:iframe auto width and height demo,代码可以直接看里面的。

    无图无真相,还是截个图看看吧。

    jqgrid高度自适应

    jqgrid是一个较为强大的表格控件,对于它的介绍为不再赘述,至于它的用法和结合asp.net进行ajax分页的方式我将在下一篇讲述(不是loading once的方式,loading once存在一些bug)。由于上面的iframe高度已经根据屏幕的高度做了限制,而jqgrid提供了一页显示10,20,30条这种类似的选项,原有的高度是不可能让30条数据显示完全的。这就需要为jqgrid限制一个***高度,例如300px,当内容的高度超出300px时,jqgrid就得以竖向滚动条滑动来显示内容。

    假定我们已经为jqgrid绑定好数据源,jqgrid的高度为360px。要实现兼容所有浏览器的jqgrid高度自适应,我们现在还需借助一个东西,http://noteslog.com/post/how-to-fix-the-resize-event-in-ie/,其实还是为了解决IE resize的bug。

    还是截两个效果图,图1每页显示10条,图2每页显示30条。

    总结

    上面的代码中实际还是有一些问题的,在IE8中已经不支持expression表达式了,而且这种脚本式的css也影响代码的整体美观。除了最普通的一行式宽度自适应,其它种类的自适应都需要借助脚本来实现,想必大家现在已经知道最终的解决方案了,通过jquery + wresize插件能够做到兼容所有浏览器的宽高自适应。

    原文:http://www.cnblogs.com/keepfool/archive/2011/12/26/2302186.html

    本文题目:Web布局中的几种宽高自适应
    当前链接:http://www.csdahua.cn/qtweb/news27/473577.html

    网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网

    成都快上网为您推荐相关内容

    网站设计知识

    同城分类信息