HTML+CSS布局技巧及兼容问题【阅读季】

时间:2023-03-09 08:00:16
HTML+CSS布局技巧及兼容问题【阅读季】
  • 在IE6和IE7中,行高值必须大于字体的2px以上才能保证字体的完整显示或当作为链接时能显示下划线。

  • IE6 下去掉 input等元素 的边框 border: 0 none; 所有浏览器都可以了

  • 边框1px {td不重叠状态}:border-collapse: collapse;(table、td需同时设置)

  • IE6、7边框断续:{min-height:1px; _height:1px;}或{zoom:1;overflow:hidden;}均可解决

  • IE6、7、8 FF 兼容透明:filter:alpha(opacity=70);-moz-opacity:0.7;opacity: 0.7

  • IE6、7、8 FF 浏览器兼容虚线框:a{outline:none; blr:expression(this.onFocus=this.blur());}/*ie输入框input输入法不能切换*/

  • 文字中间横线:text-decoration:line-through;

  • css3投影效果:文字{text-shadow:1px -1px 1px #970505;} 盒子{box-shadow:2px 2px 2px #fff;}

  • 文字省略号css样式:text-overflow:ellipsis ;{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:315px; }必备条件

  • textarea输入框设置:resize:none;overflow-y: auto;竖条显示无

  • 图片垂直居中代码css:display: table-cell; overflow: hidden;text-align: center;vertical-align: middle;
    /*兼容ie6-7*/{+display:block;+font-size:300px;+font-family:"Times New Roman", Times, serif;}

  • 中文字间距:letter-spacing: 50px;{可取正负值}

  • Div最小高度兼容IE6:height:100px;overflow:visible;{min-height:100px;height:auto !important;}IE7、8 FF兼容

  • div的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高  ; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行
  • Position:relative定位问题针对IE6:(1)给父层设置zoom:1;触发layout;  (2)给父层设置width或height

  • position:fixed不兼容ie6设置:正常设置:position:fixed;width:100%;left:0;bottom:0px;
    Ie6设置下:<!--[if IE 6]>  <style type="text/css">  html{overflow:hidden;}  body{height:100%;overflow:auto;}  类名{position:absolute;right:17px;} </style>  
    <![endif]--> 
    内页里:*html{background-image:url(about:blank);background-attachment:fixed;}/*解决IE6下滚动抖动的问题*/
    .类名{_position:absolute;_bottom:auto;_top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)));_margin-bottom:0px;}

  • 使用IE特有的条件判断语句:
    <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]-->
    <!--[if IE]> 所有的IE可识别 <![endif]-->
    <!--[if IE 6]> 仅IE6可识别 <![endif]-->
    <!--[if lt IE 6]> IE6以下版本可识别 <![endif]-->
    <!--[if gte IE 6]> IE6以及IE6以上版本可识别 <![endif]-->
    <!--[if IE 7]> 仅IE7可识别 <![endif]-->
    <!--[if lt IE 7]> IE7以下版本可识别 <![endif]-->
    <!--[if gte IE 7]> IE7以及IE7以上版本可识别 <![endif]-->
    <!--[if IE 8]> 仅IE8可识别 <![endif]-->
    <!--[if IE 9]> 仅IE9可识别 <![endif]-->

  • div的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px;然后插入文字,就垂直居中了。缺点是要控制内容不要换行。

  • margin加倍的问题

    设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。

    解决方案是在这个div里面加上display:inline;

    例如:

    <#div id=”imfloat”>

    相应的css为

    #IamFloat

    {

      float:left; margin:5px;/*IE下理解为10px*/

      display:inline;/*IE下再理解为5px*/

    }

  • 浮动ie产生的双倍距离

    #box{

      float:left; width:100px; margin:0 0 0 100px; //这种情况之下IE会产生200px的距离 display:inline; //使浮动忽略

    }

    这里细说一下block与inline两个元素:

    block元素的特点是,总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);

    Inline元素的特点是,和其他元素在同一行上,不可控制(内嵌元素);

    #box

    {

      display:block; //可以为内嵌元素模拟为块元素

      display:inline; //实现同一行排列的效果

      diplay:table;

    }

  • IE与宽度和高度的问题
    IE 不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏览器里这两个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度。
    比如要设置背景图片,这个宽度是比较重要的。
    要解决这个问题,可以这样:
    #box{ width: 80px; height: 35px;}
    html>body #box
    {
    width: auto; height: auto; min-width: 80px; min-height: 35px;
    }

  • 页面的最小宽度
    min -width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得这个,而它实际上把width当做最小宽度来使。为了让这一命令在IE上也能用,可以把一个<div> 放到 <body> 标签下,然后为div指定一个类, 然后CSS这样设计:
    #container{ min-width: 600px; width:e-xpression(document.body.clientWidth < 600? "600px": "auto" );}
    第一个min-width是正常的;但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。

  • DIV浮动IE文本产生3象素的bug
    左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距.
    #box{ float:left; width:800px;}
    #left{ float:left; width:50%;}
    #right{ width:50%;}
    *html #left{ margin-right:-3px; //这句是关键}
    <div id="box">
      <div id="left"></div>
      <div id="right"></div>
    </div>

  • IE捉迷藏的问题
    当div应用复杂的时候每个栏中又有一些链接,DIV等这个时候容易发生捉迷藏的问题。有些内容显示不出来,当鼠标选择这个区域是发现内容确实在页面。
    解决办法:
    对#layout使用line-height属性 或者给#layout使用固定高和宽。页面结构尽量简单。

  • float的div闭合;清除浮动;自适应高度;
    例如:<#div id=”floatA” ><#div id=”floatB” ><#div id=” NOTfloatC” > 
    这里的NOTfloatC并不希望继续平移,而是希望往下排。(其中floatA、floatB的属性已经设置为 float:left;)  
    这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。 
    在 <#div class=”floatB”> <#div class=”NOTfloatC”>之间加上 < #div class=”clear”>这个div一定要注意位置,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。  
    并且将clear这种样式定义为为如下即可: .clear{ clear:both;}

  • 作为外部 wrapper 的 div 不要定死高度
    为了让高度能自动适应,要在wrapper里面加上overflow:hidden;  
    当包含float的 box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
    例如某一个wrapper如下定义: .colwrapper{ overflow:hidden; zoom:1; margin:5px auto;}

  • 对于排版
    我们用得最多的css描述可能就是float:left.有的时候我们需要在n栏的float div后面做一个统一的背景,
    譬如: <div id=”page”> <div id=”left”></div> <div id=”center”></div> <div id=”right”></div> </div>
    比如我们要将page的背景设置成蓝色,以达到所有三栏的背景颜色是蓝色的目的,
    但是我们会发现随着left center right的向下拉长,而 page居然保存高度不变,问题来了,
    原因在于page不是float属性,而我们的page由于要居中,不能设置成float,
    所以我们应该这样解决:
    <div id=”page”>
    <div id=”bg” style=”float:left;width:100%”>
    <div id=”left”></div>
    <div id=”center”></div>
    <div id=”right”></div>
    </div>
    </div>
    再嵌入一个float left而宽度是100%的DIV解决之

  • 万能float 闭合(非常重要!)
    关于 clear float 的原理可参见 [How To Clear Floats Without Structural Markup],将以下代码加入Global CSS 中,给需要闭合的div加上 class="clearfix" 即可,屡试不爽.
    /* Clear Fix */
    .clearfix:after { content:"."; display:block; height:0; clear:both; visibility:hidden; }
    .clearfix { display:inline-block; }
    /* Hide from IE Mac */
    .clearfix {display:block;}
    /* End hide from IE Mac */
    /* end of clearfix */
    或者这样设置:.hackbox{ display:table; //将对象作为块元素级的表格显示}

    使用after伪对象清楚浮动。

    该方法只适用于非IE浏览器。

    使用中需注意以下几点。

    1.该方法中必须为需要清除浮动元素的伪对象中设置height:0,否则该元素会比实际高出若干像素;

    2.content属性是必须的,但其值可以为空,蓝色理想讨论该方法的时候content属性的值设为".",但我发现为空亦是可以的。

  • 高度不适应
    高度不适应是当内层对象的高度发生变化时外层高度不能自动进行调节,特别是当内层对象使用margin 或paddign 时。
    例:
    #box {background-color:#eee; }
    #box p {margin-top: 20px;margin-bottom: 20px; text-align:center; }
    <div id="box">
    <p>p对象中的内容</p>
    </div>
    解决方法:
    在P对象上下各加2个空的div对象CSS代码:
    .1{height:0px;overflow:hidden;}或者为DIV加上border属性。

  • IE6下为什么图片下有空隙产生
    解决这个BUG的方法也有很多,
    可以是改变html的排版,
    或者设置img 为display:block
    或者设置vertical-align 属性为 vertical-align:top | bottom |middle |text-bottom 都可以解决.

  • 如何对齐文本与文本输入框
    加上 vertical-align:middle;
    <style type="text/css">
    <!--
    input {width:200px; height:30px;border:1px solid red;vertical-align:middle; }
    -->
    </style>

  • web标准中定义id与class有什么区别吗?
    一.web标准中是不容许重复ID的,比如 div id="aa" 不容许重复2次,而class 定义的是类,理论上可以无限重复, 这样需要多次引用的定义便可以使用他.
    二.属性的优先级问题 ID 的优先级要高于class,看上面的例子
    三.方便JS等客户端脚本,如果在页面中要对某个对象进行脚本操作,那么可以给他定义一个ID,否则只能利用遍历页面元素加上指定特定属性来找到它,这是相对浪费时间资源,远远不如一个ID来得简单.

  • LI中内容超过长度后以省略号显示的方法
    此方法适用与IE与OP浏览器
    <style type="text/css">
    <!--
    li {
    width:200px;
    white-space:nowrap;
    text-overflow:ellipsis;
    -o-text-overflow:ellipsis;
    overflow: hidden;
    }
    -->
    </style>

  • 为什么无法定义1px左右高度的容器
    IE6下这个问题是因为默认的行高造成的,
    解决的方法也有很多
    例如:overflow:hidden | zoom:0.08 | line-height:1px

    HTML+CSS布局技巧及兼容问题【阅读季】

  • 怎么样才能让层显示在FLASH之上呢
    解决的办法是给FLASH设置透明
    <param name="wmode" value="transparent" />

  • 怎样使一个层垂直居中于浏览器中
    这里我们使用百分比绝对定位,与外补丁负值的方法,负值的大小为其自身宽度高度除以2
    <style type="text/css">
    <!—
    div
    {
    position:absolute;
    top:50%;
    lef:50%;
    margin:-100px 0 0 -100px;
    width:200px;
    height:200px;
    border:1px solid red;
    }
    -->
    </style>

  • Div居中问题
    div设置 margin-left, margin-right 为 auto 时已经居中,
    IE 不行,IE需要设定body居中,
    首先在父级元素定义text-algin: center;
    这个的意思就是在父级元素内的内容居中。

  • 链接(a标签)的边框与背景
    a 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。
    给 a 和 menubar 设置高度是为了避免底边显示错位,
    若不设 height, 可以在 menubar 中插入一个空格。

  • 超链接访问过后hover样式就不出现的问题
    被点击访问过的超链接样式不在具有hover和active了
    解决方法是
    改变CSS属性的排列顺序: L-V-H-A
    Code:
    <style type="text/css">
    <!--
    a:link {}
    a:visited {}
    a:hover {}
    a:active {}
    -->
    </style>

  • 游标手指cursor
    cursor: pointer 可以同时在 IE FF 中显示游标手指状,
    hand 仅 IE 可以

  • UL的padding与margin
    ul标签在FF中默认是有padding值的,
    而在IE中只有margin默认有值,
    所以先定义 ul{margin:0;padding:0;}就能解决大部分问题

  • BOX模型解释不一致问题
    在FF和IE 中的BOX模型解释不一致导致相差2px
    解决方法:
    div{margin:30px!important;margin:28px;}
    注意这两个 margin的顺序一定不能写反, important这个属性IE不能识别,
    但别的浏览器可以识别。
    所以在IE下其实解释成这样:
    div {maring:30px;margin:28px}
    重复定义的话按照最后一个来执行,所以不可以只写margin:xx px!important;
    #box
    {
    width:600px; //for ie6.0\
    - w\idth:500px; //for ff+ie6.0}
    #box{
    width:600px!important //for ff
    width:600px; //for ff+ie6.0
    width /**/:500px; //for ie6.0-}

  • 属性选择器(这个不能算是兼容,是隐藏css的一个bug)
    p[id]{}
    div[id]{}
    这个对于IE6.0和IE6.0以下的版本都隐藏,
    FF和OPera作用.属性选择器和子选择器还是有区别的,
    子选择器的范围从形式来说缩小了,
    属性选择器的范围比较大,
    如p[id]中,所有p标签中有id的都是同样式的

  • 最狠的手段 - !important;

    如果实在没有办法解决一些细节问题,
    可以用这个方法.FF对于”!important”会自动优先解析,
    然而IE则会忽略.
    如下
    .tabd1
    {
    background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/
    background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */ 
    }
    值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过

  • 为什么FF下文本无法撑开容器的高度
    标准浏览器中固定高度值的容器是不会象IE6里那样被撑开的,
    那我又想固定高度,又想能被撑开需要怎样设置呢?
    办法就是去掉height设置min-height:200px;
    这里为了照顾不认识min-height的IE6
    可以这样定义: { height:auto!important; height:200px; min-height:200px; }

  • 楼梯式的效果
    几乎所有的Web开发者都会使用list来创建导航条。下面是你可能会用到的代码:

    1. <ul>
    2. <li><ahref="#"></a></li>
    3. <li><ahref="#"></a></li>
    4. <li><ahref="#"></a></li>
    5. </ul>
    1. ul {
    2. list-style: none;
    3. }
    4. ul li a {
    5. display: block;
    6. width: 130px;
    7. height: 30px;
    8. text-align: center;
    9. color: #fff;
    10. float: left;
    11. background: #95CFEF;
    12. border: solid1px#36F;
    13. margin: 30px5px;
    14. }

    HTML+CSS布局技巧及兼容问题【阅读季】

    下面是两个解决方法

    解决方法一

    设置li元件的float属性。

    1. ul li { float: left; }

    解决方法二

    设置 display: inline 属性。

    1. ul li {
    2. display: inline
    3. }
  • float元件的两倍空白
    请看下面的代码:

    1. #element{
    2. background: #95CFEF;
    3. width: 300px;
    4. height: 100px;
    5. float: left;
    6. margin: 30px0 030px;
    7. border: solid1px#36F;
    8. }

    期望的结果是:

    HTML+CSS布局技巧及兼容问题【阅读季】

    解决方案

    和上面那个BUG的解决方案一样,设置 display: inline 属性可以解决问题。

      1. #element{
      2. background: #95CFEF;
      3. width: 300px;
      4. height: 100px;
      5. float: left;
      6. margin: 30px0 030px;
      7. border: solid1px#36F;
      8. display: inline;
      9. }
  • IE6下的{clear:both}出现怪异的空白

    .clear{ clear:both; height:0px; margin:0; padding:0; width:0; border:none; overflow:hidden; }

  • 空div在IE(FF中没有)是有默认高度的,可以用定义:

    div

    {

    width:100%;

    background:#9c0;

    ling-height:0

    }

  • 利用border属性确定出错元素的布局特性

    使用float属性布局一不小心就会出错。这时为元素添加border属性确定元素边界,错误原因即水落石出。

    border:1px solid #000;

  • float元素的父元素不能指定clear属性

    MacIE下如果对float的元素的父元素使用clear属性,周围的float元素布局就会混乱。这是MacIE的著名的bug,倘若不知道就会走弯路。

  • float元素务必指定width属性

    很多浏览器在显示未指定width的float元素时会有bug。所以不管float元素的内容如何,一定要为其指定width属性

  • float元素的宽度之和要小于100%  
    如果float元素的宽度之和正好是100%,某些古老的浏览器将不能正常显示。因此请保证宽度之和小于99%。

  • 是否重设了默认的样式?

    某些属性如margin、padding等,不同浏览器会有不同的解释。因此最好在开发前首先将全体的margin、padding设置为0、列表样式设置为none等。
    【body,button,ul,li,ol,p,dl,dd,h1,h2,h3,h4,h5,h6,img,iframe,input,form,textarea{margin:0;padding:0;list-style-type:none;}】 或*{ margin:0;padding:0}

  • 是否忘记了写DTD?

    如果无论怎样调整不同浏览器显示结果还是不一样,那么可以检查一下页面开头是不是忘了写下面这行DTD:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">