CSS布局奇技淫巧:宽度自适应

2016/11/03 · CSS ·
自适应

原文出处:
无双   

css这个东西,说难不难,说容易也不容易。我觉得最重要的还是经验的积累,正所谓的不积硅步,无以至千里。这一系列文章讲述几种css特殊布局的实现,也当作为自己做个备忘吧。

首先讲的是三列布局,左右两列宽度固定,中间一列宽度自适应

这个很好实现,左右两列分别左浮动和右浮动并给一个固定宽度,中间不浮动,也不设定宽度。这样基本就可以了。但为了兼容IE还必须做些工作。

看下代码结构:

澳门皇冠金沙网站 1

效果为:

澳门皇冠金沙网站 2

中间列要不要设置margin-left和margin-right ?

注意,中间那列需要把左右两个外边距分别设为左右两列的宽度,否则会有些问题。如下:

在谷歌、火狐等标准浏览器下是这样的(包括IE8+):

澳门皇冠金沙网站 3

而在IE6、IE7中是这样的(图是在IE6下截的)

澳门皇冠金沙网站 4

我们可以看到中间那列子元素的margin-left或margin-right的起点是不一致的,在IE6、IE7中,即使不给中间列设定margin-left和margin-right,它的子元素的左右外边距的起点仍然是在左右两列宽的的基础上的,就像是有margin-left和margin-right一样。所以为了各浏览器保持一致,中间那列还是设一个margin-left和margin-right为好。

IE6中的3px间隙bug

在上图的ie6截图中,我们看到各列之间有一条3px的间隔,这是只有IE6才有的问题。

如果中间那列的margin-left和margin-right都为0的话,则只要把左列的margin-right设为-3px,右列的margin-left设为-3px就行了。

但如果把中间列的margin-left和margin-right分别为左右两列的宽度时(上面已经说了,这也是必须这样做的),即使把左列的margin-right设为-3px,右列的margin-left设为-3px也还是没有效果。这时候还得把中间列的margin-left设为左列宽度-3px,margin-right设为右列宽度-3px才行。如下:

澳门皇冠金沙网站 5

最终的代码

XHTML

<!DOCTYPE html> <html> <head> <meta charset=”utf-8″
/> <title>宽度自适应布局</title> <style> body, div
{ margin:0; padding:0; } div { height:200px; color:#F00; } .left {
float:left; width:100px; background:#00f; _margin-right:-3px; } .right
{ float:right; width:100px; background:#0f0; _margin-left:-3px; }
.center { background:#333; margin:0 100px; _margin:0 97px; }
</style> </head> <body> <div
class=”left”>我是left</div> <div
class=”right”>我是right</div> <div
class=”center”>我是center</div> </body> </html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>宽度自适应布局</title>
<style>
    body, div {
        margin:0;
        padding:0;
    }
    div {
        height:200px;
        color:#F00;
    }
    .left {
        float:left;
        width:100px;
        background:#00f;
        _margin-right:-3px;
    }
    .right {
        float:right;
        width:100px;
        background:#0f0;
        _margin-left:-3px;
    }
    .center {
        background:#333;
        margin:0 100px;
        _margin:0 97px;
    }
</style>
</head>
<body>
<div class="left">我是left</div>
<div class="right">我是right</div>
<div class="center">我是center</div>
</body>
</html>

两列布局,一列宽度固定,另一列自适应布局也是这个道理的。

1 赞 3 收藏
评论

澳门皇冠金沙网站 6

CSS布局奇技淫巧:高度自适应

2016/11/03 · 澳门皇冠金沙网站,CSS ·
自适应

原文出处:
无双   

何为高度自适应?

高度自适应就是高度能跟随浏览器窗口的大小改变而改变,典型的运用在一些后台界面中上面一栏高度固定用作菜单栏或导航栏,下面一栏高度自适应用于显示内容。高度自适应不像宽度自适应那样简单,在兼容浏览器方面也稍微复杂一些。

布局思路

在IE7+及chrome、firefox等浏览器中,高度自适应可以利用绝对定位来解决。但一个元素是绝对定位时,如果没有给它设定高度或宽度,则它的的高度和宽度是由它的top、right、bottom、left属性决定的,但这一法则在IE6中并不适用,因此在IE6中还得另辟蹊径。在IE6中给html设定padding,并不会撑大html元素的尺寸,这正是我们要利用的地方。

在IE7+ 和 W3C浏览器中的方案

看下代码:

澳门皇冠金沙网站 7

再看下效果:

澳门皇冠金沙网站 8

在IE6中的方案

好吧,不想再对IE6吐槽,只想尽快搞定它。

在IE6中的思路是,把html和body元素的高度设定为100%,即浏览器窗口的高度,然后利用padding-top在html元素上挤出一点空间来,因为绝对定位的最高参照物是参照html元素的,所以可以把顶栏绝对定位在html的padding-top那块空间上。这时body的高度就是html的高度(也是浏览器窗口的高度)减去html的padding-top的值,这也是ie6非常奇怪的一个特性,因为按照w3c盒模型来讲,增加了html元素的padding-top,则html元素的高度也会相应增加,这时浏览器窗口应该会出现垂直滚动条了。但IE6不会,html的增加了padding-top后,整个html元素的高度还是保持不变,即浏览器窗口的高度,变化的是body的高度减小了,用来抵消html的padding-top.

还是先看看代码吧:

澳门皇冠金沙网站 9

再看下效果:

澳门皇冠金沙网站 10

最终的兼容代码

XHTML

<!DOCTYPE html> <html> <head> <meta charset=”utf-8″
/> <title>高度自适应布局</title> <style> html,body{
height:100%;} body,div{ margin:0; padding:0; color:#F00;} * html{
padding-top:100px;}/*for ie6*/ .top{ background:#36C; height:100px;}
* html .top{ background:#36C; height:100px; position:absolute; top:0;
width:100%;}/*for ie6*/ .main{ background:#F90; position:absolute;
width:100%; top:100px; bottom:0; overflow:auto;} * html .main{
background:#F90; position:static; height:100%;}/*for ie6*/
</style> </head> <body> <div
class=”top”>我是top,固定高度</div> <div
class=”main”>我是main,高度随浏览器大小变化而变化<p
style=”height:500px;”></p></div> </body>
</html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>高度自适应布局</title>
<style>
html,body{ height:100%;}
body,div{ margin:0; padding:0; color:#F00;}
* html{ padding-top:100px;}/*for ie6*/
.top{ background:#36C; height:100px;}
* html .top{ background:#36C; height:100px; position:absolute; top:0; width:100%;}/*for ie6*/
.main{ background:#F90; position:absolute; width:100%; top:100px; bottom:0; overflow:auto;}
* html .main{ background:#F90; position:static; height:100%;}/*for ie6*/
</style>
</head>
<body>
<div class="top">我是top,固定高度</div>
<div class="main">我是main,高度随浏览器大小变化而变化<p style="height:500px;"></p></div>
</body>
</html>

效果图:

非ie6

澳门皇冠金沙网站 11

ie6

澳门皇冠金沙网站 12

推广

这种方法也适用于顶栏与底栏高度固定,中间那栏高度自适应的三栏布局

3 赞 3 收藏
评论

澳门皇冠金沙网站 6

方法一:

问题:行内,两个div宽度都不固定,第一个撑开多少,剩下的第二个自适应补满。

  但是有时候我们的图片是不方便作为背景图呈现的,而是内联的<img>,百分比padding也是可以轻松应对的,求套路是比较固定的,图片元素外面需要一个固定比例的容器元素,例如下面的HTML结构:

  <div class="banner">
    <img src=""banner.jpg>
  </div>
  .banner元素同样负责控制比例,然后图片填充.banner元素即可,CSS代码如下:

  .banner {
      padding: 15.15% 0 0;
      position: relative;
  }
  .banner > img {
      position: absolute;
      width: 100%; height: 100%;
      left: 0; top: 0;
  }

别的不多说,直接上代码,或者参考在线DEMO,下面所有的DEMO都有HTML和CSS代码,感兴趣的同学自己慢慢看吧。

方法1:

HTML Markup

<table>

       <div id="container">
            <div id="wrapper">
                <div id="sidebar">Left Sidebar</div>
                <div id="main">Main Content</div>
            </div>
        </div>

       <td style=”border:1px solid black;text-align:
center;white-space:nowrap;word-break:keep-all;”>你试试计算的卡萨丁反馈</td>

CSS Code

    <td style=”width:100%;border:1px solid black;text-align:
center;”>5566</td>

       <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            html {
                height: auto;
            }

            body {
                margin: 0;
                padding: 0;

            }

            #container {
                background: #ffe3a6;
            }

            #wrapper {
                display: inline-block;
                border-left: 200px solid #d4c376;/*==此值等于左边栏的宽度值==*/
                position: relative;
                vertical-align: bottom;
            }

            #sidebar {
                float: left;
                width: 200px;
                margin-left: -200px;/*==此值等于左边栏的宽度值==*/
                position: relative;         
            }

            #main {
                float: left;
            }  

            #maing,
            #sidebar{
                min-height: 200px;
                height: auto !important;
                height: 200px;
            }
        </style>

</table>

查看在线DEMO。

方法2:

方法二

<div>

HTML Markup

    <div style=”border:1px solid black;text-align:
center;display:table-cell;white-space:nowrap;word-break:keep-all;”>你试试计算的卡萨丁反馈</div>

       <div id="container">
            <div id="left" class="aside">Left Sidebar</div>
            <div id="content" class="section">Main Content</div>
        </div>

    <div style=”width:100%;border:1px solid black;text-align:
center;display:table-cell”>5566</div>

CSS Code

</div>

       <style type="text/css">
                *{margin: 0;padding: 0;}
                #container {
                    overflow: hidden;
                }

                #left {
                    background: #ccc;
                    float: left;
                    width: 200px;
                    margin-bottom: -99999px;
                    padding-bottom: 99999px;

                }

                #content {
                    background: #eee;
                    margin-left: 200px;/*==此值等于左边栏的宽度值==*/
                    margin-bottom: -99999px;
                    padding-bottom: 99999px;
                }
                #left,
                #content {
                    min-height: 200px;
                    height: auto !important;
                    height: 200px;
                }
        </style>

坑点:纯数字会自然地撑开第一个的宽度,要是单词、汉字和空格会存在换行,撑不开宽度。

查看在线的DEMO。

所以添加了属性  ” white-space:nowrap;word-break:keep-all; ”。

方法三:

HTML Markup

       <div id="container">
            <div id="content">Main Content</div>
            <div id="sidebar">Left Sidebar</div>
        </div>

CSS Code

           *{margin: 0;padding: 0;}
            #container{
                background-color:#0ff;
                overflow:hidden;
                padding-left:220px; /* 宽度大小等与边栏宽度大小*/
            }
            * html #container{
                height:1%; /* So IE plays nice */
            }
            #content{
                background-color:#0ff;
                width:100%;
                border-left:220px solid #f00;/* 宽度大小等与边栏宽度大小*/
                margin-left:-220px;/* 宽度大小等与边栏宽度大小*/
                float:right;
            }
            #sidebar{
                background-color:#f00;
                width:220px;
                float:right;
                margin-left:-220px;/* 宽度大小等与边栏宽度大小*/
            }
            #content,
            #sidebar {
                min-height: 200px;
                height: auto !important;
                height: 200px;
            }

查看在线DEMO效果。

方法四:

HTML Markup

       <div id="container2">
            <div id="container1">
                    <div id="col1">Left Sidebar</div>
                    <div id="col2">Main Content</div>
            </div>
        </div>

CSS Code

       *{padding: 0;margin:0;}
        #container2 {
            float: left;
            width: 100%;
            background: orange;
            position: relative;
            overflow: hidden;
          }
          #container1 {
            float: left;
            width: 100%;
            background: green;
            position: relative;
            left: 220px;/* 宽度大小等与边栏宽度大小*/
          }

          #col2 {
            position: relative;
            margin-right: 220px;/* 宽度大小等与边栏宽度大小*/
          }

          #col1 {
            width: 220px;
            float: left;
            position: relative;
            margin-left: -220px;/* 宽度大小等与边栏宽度大小*/
          }

            #col1,#col2 {
                min-height: 200px;
                height: auto !important;
                height: 200px;
            }

查看在线DEMO。

方法五:

HTML Markup

       <div id="container1">
            <div id="container">
                <div id="left">Left Sidebar</div>
                <div id="content">
                    <div id="contentInner">Main Content</div>
                </div>
            </div>
        </div>

CSS Code

       *{padding: 0;margin: 0;}
        #container1 {
            float: left;
            width: 100%;
            overflow: hidden;
            position: relative;
            background-color: #dbddbb;
        }
        #container {
            background-color: orange;
            width: 100%;
            float: left;
            position: relative;
            left: 220px;/* 宽度大小等与边栏宽度大小*/
        }
        #left {         
            float: left;
            margin-right: -100%;
            margin-left: -220px;/* 宽度大小等与边栏宽度大小*/
            width: 220px;
        }
        #content {
            float: left;
            width: 100%;
            margin-left: -220px;/* 宽度大小等与边栏宽度大小*/
        }
        #contentInner {         
            margin-left: 220px;/* 宽度大小等与边栏宽度大小*/
            overflow: hidden;
        }

        #left,
        #content {
                min-height: 200px;
                height: auto !important;
                height: 200px;
        }

查看在线DEMO。

针对上面的面试题要求,我一共使用了五种不同的方法来实现,经过测试都能在各浏览器中运行,最后我有几点需要特别提出:

  1. 上面所有DEMO中,要注意其方向性的配合,并且值要统一,如果您想尝试使用自己布局需要的宽度值,请对照相关代码环节进行修改;
  2. 上面所有DEMO中,没有设置他们之间的间距,如果您想让他们之间有一定的间距,有两种方法可能实现,其一在上面的DEMO基础上修改相关参数,其二,在相应的里面加上”div”标签,并设置其“padding”值,这样更安全,不至于打破你的布局
  3. 因为我们这里有一列使用了自适应宽度,在部分浏览器下,当浏览器屏幕拉至到一定的大小时,给我们带来的感觉是自适应宽度那栏内容像是被隐藏,在你的实际项目中最好能在“body”中加上一个“min-width”的设置。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图