IE6~7的兼容性笔记
笔记01
1、元素浮动的兼容性
2、子级超出父级宽高
3、margin传递与兼容性问题
4、margin叠压
5、inline-block兼容
6、ie6最小高度
一、元素浮动的兼容性
1、元素浮动之后,能设置宽度的话就给元素加宽度,如果需要宽度是内容撑开,就给它里边的块元素加上浮动
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>元素浮动的兼容性</title> <style> .box{ width:400px; border:1px solid black; overflow:hidden; /*overflow:hidden最简洁最方便的清除浮动方法但不是最好的,清除浮动还是要用伪类的方法好一些 */ } .left{ float:left; background:orange; } .right{ float:right; background:yellow; } h2{ margin:0; } </style> </head> <body> <div class="box"> <div class="left"> <h2>标题</h2> </div> <div class="right"> <h2>更多</h2> </div> </div> </body> </html>
在标准浏览器下与ie6下是理想的布局
但是给H2加上高度样式后在IE6下出现兼容性问题
.box{ width:400px; border:1px solid black; overflow:hidden; } .left{ float:left; background:orange; } .right{ float:right; background:yellow; } h2{ margin:0; height:30px;/*这里加上高度*/ } </style>
h2标签加上这height:30px后在IE6下,标签元素的特征与浮动元素的特征就冲突了,为什么在IE6下浮动就没有生效?
分析一下,浮动属性是加给了div分别一左一右,但是h2是块元素默认就撑满一行的。
解决方法,给h2标签加上浮动解决了撑满一行的问题。让谁去浮动让谁去自适应把这个浮动加给谁。
<style> .box{ width:400px; border:1px solid black; overflow:hidden; } .left{ float:left; background:orange; } .right{ float:right; background:yellow; } h2{ float:left; margin:0; height:30px; }
2、第一块元素浮动,第二块元素加nargin值等于第一块元素,在IE6下会有间隙问题
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .box{ width:500px; } .left{ width:200px; height:200px; background:red; float:left; /*这里设置浮动,元素就可以在同一行显示了*/ } .right{ width:200px; height:200px; background:yellow; margin-left:200px; /*设置margin-left值为200像素,正好是上面.left元素的宽度*/ } </style> </head> <body> <div class="box"> <div class="left">left</div> <div class="right">right</div> </div> </body> </html>
设置的值是完全匹配的,但IE6下会有一个缝隙。
解决方案
1). 首先不建议这么写,浮动元素脱离文档流了,一个浮动与一个非浮动元素层级不一样,浮动元素会提升元素层级,导致渲染解析时会出现问题
2). 用浮动解决,千万不要一个元素浮动了,第二个元素用margin去撑开
<style> .box{ width:500px; } .left{ width:200px; height:200px; background:red; float:left; } .right{ width:200px; height:200px; background:yellow; float:left; } </style>
二、子级超出父级宽高
IE6下子元素超出父级宽高,会把父级的宽高撑开
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .box{ width:200px; height:200px; border:10px solid gray; } .content{ width:400px; height:400px; background:yellow; } </style> </head> <body> <div class="box"> <div class="content"></div> </div> </body> </html>
标准浏览器下父级包不住子级,IE6下子级居然把父级给撑大了,严重影响了布局。
解决方法,不建议这么写或者准确的说不建议让子元素的宽高超过父级,子级把父级撑开会严重影响到同级元素
三、margin传递与兼容性问题
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>margin兼容性问题</title> <style> .box{ background:orange; } .item{ height:50px; background:yellow; margin:50px; } </style> </head> <body> <div class="box"> <div class="item"></div> <div class="item"></div> </div> </body> </html>
上面的代码如图,maigin-top传递到父级
我们给父级加上边框(border)就没有传递了
<style> .box{ background:orange; border:1px solid orange;/*这加上边框margin就不会传递了*/ } .item{ height:50px; background:yellow; margin:50px; } </style>
加上border边框后效果如下图
标准浏览器下margin没有传递了,IE6下还是有问题,这是为什么呢?
我们换一种css属性,把border边框变成 overflow: hidden
<style> .box{ background:orange; overflow:hidden; /* 设置 overflow:hidden 标准浏览器下正常,IE6下还是有问题 */ } .item{ height:50px; background:yellow; margin:50px; } </style>
标准浏览器正常,IE6还是有问题,怎么解决IE6下margin传递的问题呢?
很简单只需要触发BFC以及haslayout
总结,标准浏览器设置border、overflow:hidden这些属性margin-top就不传递,IE6-7下面加 zoom: 1;
<style> .box{ background:orange; overflow:hidden; zoom:1; /* voerflow:hidden只触发了BFC,haslayout怎么触发?IE6 haslayout用zoom:1触发 */ } .item{ height:50px; background:yellow; margin:50px; } /* 解决margin-top传递 只需触发BFC、haslayout。 设置哪些样式就不margin-top传递,设置边框border或overflow:hidden、IE6~7下加zoom:1; */ </style>
四、margin叠压
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>margin兼容性问题</title> <style> .box{ background:orange; overflow:hidden; zoom:1; } .item{ height:50px; background:yellow; margin-top:50px; } .item100{ margin-top:100px; /* 注意这条样式加给了第二个元素*/ } /* 上下margin叠压 同级元素设置有上下margin的情形下,第一个元素的下面和第二个元素的上面margin会叠压,这是已知的条件,如果我们避开这个条件是不是就可以解决了呢? 在设置样式时候的通过小技巧避免这个问题, 1.尽量使用同一方向的margin,比如都设置margin-top或者margin-bottom。 2.item100样式加给了第二个div */ </style> </head> <body> <div class="box"> <div class="item"></div> <div class="item item100"></div> </div> </body> </html>
五、inline-block兼容
IE6下支持 display:inline-block;
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> div{ width:100px; height:100px; background:red; display:inline-block; *display:inline; *zoom:1; /* 加上这两行后div在ie6下从左到右显示了 */ } /* inline-block是css2.1的新出的IE6不支持 IE6下要内连块,需要加上这两句 *display:inline; *zoom:1; IE6/IE7下:inline-block解决方案 https://www.cnblogs.com/leejersey/archive/2012/07/11/2586506.html */ </style> </head> <body> <div>1</div> <div>2</div> <div>3</div> </body> </html>
六、ie6最小高度
IE6下最小高度默认19像素,怎么才能得到小于19像素的高度呢?
办法是在css里加上一行 *overflow:hidden 只在ie6下执行这行代码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>IE6下最小高度</title> <style> div{ height:1px; background:Red; *overflow:hidden; /* ie6下加上这行 */ } /* IE6下最小高度默认19px 解决方法 *overflow:hidden; */ </style> </head> <body> <div></div> </body> </html>
笔记02
7、双边距问题
8、li浮动元素4px问题
9、文字复制问题
10、相对定位与overflow的问题
11、绝对定位奇数问题
12、元素消失的问题
13、input空隙问题
14、表单控件背景问题
七、IE6双边距问题
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>IE6双边距</title> <style> body{ margin:0; } .item{ width:200px; height:200px; background-color:red; margin-left:50px; } </style> </head> <body> <div class="item"></div> </body> </html>
上面目前没有什么问题,接下来是个重点,当我们给item加上浮动之后,很明显他向右边移动了100像素(50*2等于100)
<style> body{ margin:0; } .item{ width:200px; height:200px; background-color:red; float:left;/* 这里加了浮动 */ margin-left:50px; } </style>
IE6下当元素浮动后,在设置margin那么就会产生双边距,这只是初步的一个描述。
接下来我们具体看一下问题,margin一定发生在左边吗,如果是右变呢?
<style> body{ margin:0; } .box{ width:750px; /* 每个宽度是200 x 3,再加上外边距50 x 3 */ overflow:hidden; border:1px solid gray; } .item{ width:200px; height:200px; background:red; margin-right:50px; /*这里变成右外边距 */ float:left; } </style>
右外边距在IE6下没有什么问题
我们还换成左外边距,增加到三个元素
<style> body{ margin:0; } .box{ width:750px; overflow:hidden; border:1px solid gray; } .item{ width:200px; height:200px; background:red; margin-left:50px; /* 这里换回左外边距 */ float:left; } </style>
我们把margin在换成左边距,标准浏览器下没问题只是换了一个方向,IE6下(如上图)被挤下去了,被挤下去说明宽度不够了,
由于第一个margin-left产生了双边距多了50个像素,正好就把第三个div被挤下来了。
那怎么解决这个问题?
针对IE6、7添加一条 *display: inline;
body{ margin:0; } .box{ width:750px; overflow:hidden; border:1px solid gray; } .item{ width:200px; height:200px; background:red; margin-left:50px; float:left; *display:inline; /* 添加一条 *display: inline; */ }
就跟标准浏览器一样了,我们要解决双边距这个问题的解决方法,针对的是IE6~7,添加display:inline;这条样式
八、li浮动4px的问题
li元素里面的子元素都浮动的话,li元素在IE6~7下会产生4px间隙
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>li里元素浮动li在IE6 ,7下方会产生4px间隙问题</title> <style> .list{ list-style:none; margin:0; padding:0; width:300px; } .list li{ height:30px; line-height:30px; border:1px solid red; } .list li a{ float:left; } .list li span{ float:right; } </style> </head> <body> <ul class="list"> <li> <a href="">左边</a> <span>右边</span> </li> <li> <a href="">左边</a> <span>右边</span> </li> <li> <a href="">左边</a> <span>右边</span> </li> </ul> </body> </html>
li元素下面产生了4px的间隙
这个问题我们需要思考:
1). 需要解决那么要给谁解决,每个红色框是一个li,左边与右边都是li的子元素,li之间的间隙也是由li产生的,所以我们要基于li去做解决
2). 问题也要在li上解决,解决方案针对IE6~7添加 *vertical-align: top
<style> .list{ list-style:none; margin:0; padding:0; width:300px; } .list li{ height:30px; line-height:30px; border:1px solid red; *vertical-align:top; /* 针对IE6~7下添加 */ } .list li a{ float:left; } .list li span{ float:right; } </style>
九、文字复制问题
IE6浮动元素之间加注释,会导致多复制一个文字问题
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .wrap{ width:400px; } .left{ float:left; } .right{ width:398px; float:right; } </style> </head> <body> <div class="wrap"> <div class="left"></div> <span></span><!-- IE6下文字溢出BUG --> <div class="right">↓这是一头多出来的猪</div> </div> </body> </html>
IE6浏览器里显示的样子,“来的猪”三个字是多出来的小尾巴
IE6下两个浮动元素之间有内联或注释元素,会导致多复制出文字的问题,怎么解决多出来的小尾巴呢?
先看出现小尾巴问题的条件,
1). 两个浮动元素中间有注释或内联元素,
2). 并且和父级宽度相差不超过3px,导致多复制一个文字问题。
解决方案避免这两个条件出现
1). 两个浮动元素中间避免出现内联元素或注释
2). 与父级跨度相差3像素或以上
.wrap{ width:400px; } .left{ float:left; } .right{ width:397px;/* 397px就没有小尾巴,398、399、400就有小尾巴,与父级跨度相差3像素或以上就没有小尾巴 */ float:right; } </style>
十、相对定位与overflow的问题
IE6,7 下父级元素overflow:hidden是包不住子级的relative
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .box{ width:200px; height:200px; background:yellow; border:10px solid red; overflow:hidden; } .content{ width:400px; height:400px; background:green; } </style> </head> <body> <div class="box"> <div class="content"></div> </div> </body> </html>
给父级加一个overflow:hidden在标准浏览器与IE6-7下都包住了子级,但是我们给子级加一个“position:relative;”标准浏览器下没有问题,IE6-7下父级就包不住子级了。
.box{ width:200px; height:200px; background:yellow; border:10px solid red; overflow:hidden; } .content{ width:400px; height:400px; background:green; position:relative;/* 子级加上相对定位 */ }
IE6-7下自己超过了父级的宽高之后,并且子级还有了相对定位,那么父级就驾驭不了子级了。可是我们的父级是一定要包住子级的,不然怎么叫父级呢!这个问题怎么解决?
首先我们想一下,子级加上position:relative之后会发生一些变化,我想让他们处于同一条件下或同一环境下,看是否能够解决。
解决方法:针对IE6-7给父级也加上position:relative,父级与子级处于同一个环境下,两个相对定义没有设置偏移量,是不会影响他们的位置的。
.box{ width:200px; height:200px; background:yellow; border:10px solid red; overflow:hidden; *position:relative; /* 父级也添加相对定位,针对IE6-7进行hack的处理 */ } .content{ width:400px; height:400px; background:green; position:relative; }
十一、绝对定位奇数问题
IE6 下绝对定位元素父级宽高是奇数(单数),绝对定位元素的right和bottom的值会有1px的偏差。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .box{ width:307px; height:307px;/* 307是奇数 */ background:red; position:absolute; position:relative; position:absolute; } .content{ width:100px; height:100px; background:yellow; position:absolute; right:0; bottom:0; } </style> </head> <body> <div class="box"> <div class="content"></div> </div> </body> </html>
解决方案:避免父级宽高出现奇数就好了,我们知道那些条件触发BUG就避免这些条件的成立。
.box{ width:208px; height:208px;/* 207是奇数改成208 */ background:red; position:absolute; position:relative; } .content{ width:100px; height:100px; background:yellow; position:absolute; right:0; bottom:0; }
十二、元素消失的问题
IE6 下绝对定位元素和浮动元素并列绝对定位元素消失
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .box{ width:200px; height:200px; border:1px solid gray; position:relative; } .item{ width:150px; height:150px; background:orange; float:left; margin-left:50px; *display:inline; /* margin-left:50px; *display:inline; IE6避免产生双边距 */ } .box span{ width:50px; height:50px; background:yellow; position:absolute; right:-10px; top:-10px; } </style> </head> <body> <div class="box"> <div class="item"></div> <span></span> </div> <!-- IE6 下绝对定位元素和浮动元素并列(并排的时候,同级的时候)绝对定位元素消失 --> </body> </html>
IE6 下绝对定位元素和浮动元素并列绝对定位元素消失。
解决方案:浮动元素和绝对定位元素是同级的话定位元素就会消失,所以咱们只要让他们两个元素不处于同级,不让他们并列就可以避免这个BUG个,给定位span元素套一层标签。
有很多兼容性的问题,我们知道他是怎么触发的,他们触发BUG的条件不成立就解决了,这种思路的学习很重要。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> .box{ width:200px; height:200px; border:1px solid gray; position:relative; } .item{ width:150px; height:150px; background:orange; float:left; margin-left:50px; *display:inline; /* margin-left:50px; *display:inline; IE6避免产生双边距 */ } .box span{ width:50px; height:50px; background:yellow; position:absolute; right:-10px; top:-10px; } </style> </head> <body> <div class="box"> <div class="item"></div> <p> <span></span> </p> </div> <!--给span嵌套一层p标签,让他们不同级就避免这个IE6下的BUG了--> </body> </html>
十三、input空隙问题
IE6下input的空隙
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>IE6下input的空隙</title> <style> .box{ width:200px; border:1px solid gray; background:red; } .box input{ border:0; margin:0; width:200px; height:30px; background:#fff; } </style> </head> <body> <div> <input type="text" name="user" /> </div> </body> </html>
解决方案:给input元素添加float
<style> .box{ width:200px; border:1px solid gray; } .box input{ border:none; margin:0; width:200px; height:30px; background:#fff; *float:left;/*添加浮动*/ } </style>
十四、表单控件背景问题
IE6下输入类型表单控件背景问题
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> input{ /* background:url(photo.gif) no-repeat; */ background:url(photo.gif) no-repeat fixed;/*添加fixed*/ } /* 问题,输入到尾声的时候在多输入后,背景图标也跟着移动了 思考,我们用的是背景图片,背景图片中有那些值是可以控制背景图片位置的呢?fixed固定背景图片,我们设置一个fixed那会让背景图片固定不动吗? 这一次没有动了。 所以我们要解决问题的时候,想一下问题是基于什么上面引发的,在针对这个问题,再去联想有什么可以解决这个问题。很显然这个图片会移动,我们把图片定上去是不是就不会移动了。 解决方法 设置background-attachment:fixed; 什么是输入类型表达控件?输入框、密码框这种用户自己输入的表单类型控件。 */ </style> </head> <body> <input type="text"/> </body> </html>
笔记03
1、css hack
2、PNG24兼容性问题
3、提升样式优先级
css hack
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>css hack</title> <style> div{ width:200px; height:200px; background:red; background:blue\9;/* IE10以及以下的 */ *background:green;/* IE7以及IE7一下的 */ _background:yellow;/* _IE6以及IE6以下的 */ } </style> </head> <body> <div></div> <!-- css hack hack黑客?(原意:修改) 针对不同的浏览器写不同的css样式的过程,就叫CSShack! \9 IE10以及以下的 * IE7以及IE7一下的 _ IE6及IE6以下的 CSS书写顺序从上到下,样式是从后面覆盖到前面的,所以我们要先统一处理,在根据不同的浏览器再进行hack处理。 hack不是特别标准的事情,远离css hack,有益身心健康!不到万不得已不适用hack。 --> </body> </html>
标准浏览器下是红色,IE10下是蓝色,IE7下是绿色,IE6下是黄色
PNG24兼容性问题
IE6支持PNG24图片的方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>PNG24兼容性 js插件</title> <script src="DD_belatedPNG_0.0.8a.js"></script> <script> DD_belatedPNG.fix("img,div"); /*** *js插件步骤 *01:先引入js文件"DD_belatedPNG_0.0.8a.js" *02:插件还需要在调用一下js文件里的方法"DD_belatedPNG.fix()" *03:方法里写什么呢?就写选择器,跟css选择器是一样的,需要对那个元素处理就选那个元素。"DD_belatedPNG.fix("img,div")"img,div标签的png再ie6下实现透明度 问题:这一种方法达不到所有的效果,不能处理body之上的png24。 DD_belatedPNG.fix("body"); */ </script> <style> body{ background:red url(png.png) no-repeat;/*js插件这种方法body上的png还不能透明*/ } div{ margin-top:200px; width:300px; height:300px; background:url(png.png) no-repeat; } </style> </head> <body> <div></div> <img src="png.png"/> </body> </html>
body下png透明,我一直没有尝试成功暂时记录
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>PNG24兼容性问题</title> <script src="DD_belatedPNG_0.0.8a.js"></script> <script> DD_belatedPNG.fix("body"); </script> <style> body{ /* body下的png图片透明怎么做呢?IE有filter滤镜是一个很强大的功能,比如我们的透明度,png也可以通过滤镜去处理。 ie6下hack加载滤镜。 有两行代码,下划线是hack针对ie6下处理 */ width:500px; height:500px; background:red url(png.png) no-repeat; _background-image:none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="png.png", sizingMethod="crop"); } </style> </head> <body> </body> </html>
提升样式优先级
!important > 行间选择 > id选择器 > class选择 > 标签选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>样式优先级</title> <style> div{ width:300px; height:300px; background:red!important; } </style> </head> <body> <div style="background:blue;">行间样式会高于标签选择,!important会比行间的还要高</div> <!-- !important提升样式优先级权重 优先级就是指代码执行生效的顺序。 行间样式优先执行 ID选择器排在第二 CLASS类选择器在第三 标签选择器第四 !important > 行间选择 > id选择器 > class选择 > 标签选择器 --> </body> </html>
通过审查元素里检查,黄色的样式被覆盖了,如果有感叹号说明样式写错了。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>样式优先级</title> <style> div div{ height:100px; background:yellow; } #box div{ background:pink; } .div1 div{ background:green; } </style> </head> <body> <div id="box"> <div></div> </div> <!-- 行间选择 > id选择器 > class类选择器 > 标签选择器 样式的价格 行间选择 1000元 id选择器 100元 class选择 10元 标签选择器 1元 div div{ 1+1=2 height:100px; background:yellow; } #box div{ 100+1=101 钱最多 background:pink; } .div1 div{ 10+1=11 background:green; } --> </body> </html>
2019-05-29