作业总结(一):IE6下面的那些坑

考完试就来实习的公司实习了,大概最近有两周时间就一直在做公司给新人布置的大作业。虽然只是很简单的一个小的项目,但却从其中总结到了不少有用的东西。计划将其发出来一系列文章,算是对这两周时间的总结。也算是在这里留下记录,防止以后坑在同一个地方,接下来几周没事持续填坑吧。

在没来公司之前,我做过的项目也好,学习的新技术也好。从来都没有去想过去兼容IE6及以下版本的浏览器的,之前一段时间淘宝刚宣布不再继续支持IE6,刚好我做大作业的时候,百度也宣布不再继续支持IE6。但是来了公司之后接到的新人大作业之后,js与css布局都有一个共同的要求,兼容IE6,7浏览器。虽然很无奈,也知道IE6下坑很多,但毕竟也算是个尝试。所以就硬着头皮去做了。

做的一个小小的项目,总结出来的IE6浏览器与现代浏览器所不同的表现就有十几条。真是really心疼几年前的前端er,兼容IE6真的会让人抓狂。然后碰到的有IE6下被人熟知的BUG,也有自己碰到比较不常见的BUG,总结了几条,下面就慢慢道来吧。

一:IE6下浮动元素双倍margin。

具体表现就是当给一个父元素的第一个子元素向左、右浮动时,倘若在这个浮动方向上添加了margin值,在IE6下这个margin值会加倍。下面来看例子。

<div id="parent">
    <p>IE6下浮动方向上的margin值将会变为设置值的两倍</p>
</div>
#parent p{
    float:left;
    margin-left:20px;
}

可以自己试一下,在IE6下明显能看出比其他浏览器margin要大一点。

解决方案:1.利用css hack,给该元素添加_margin: 10px;也就是利用只有IE6能识别的hack,将其margin值设为本来要设置margin值的一半,这样IE6加倍之后,就和正常浏览器表现一致了。

2.将浮动元素设置为行内元素。display:inline;

二::IE6下html文件里的注释会影响布局/出现了文本的重复。

BUG原因:当满足如下公式,溢出文字的个数=注释的条数*2-1。注释就会造成元素高度变化/出现重复文本。

解决方案:1.不要写注释。。 2.利用<!—[IF !IE]>标签包围注释。

三:IE6下:hover只对a标签起作用。

BUG原因:css1不支持对除a标签之外的标签添加hover效果。

解决方案:这个算是比较经典的IE6的BUG了,解决的方案有很多种,我使用的是引入一个htc文件。htc文件就是专门用来解决IE下BUG的文件。这个原理是使用js来给元素定义onmouseover和onmouseout事件,使得所有标签在IE6下都可以支持hover事件。具体的使用方法如下,先定义一个csshover.htc文件,将如下代码复制进去。

<public:attach event="ondocumentready" onevent="CSSHover()" /><script>
window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:[‘text-kashida‘,‘text-kashida-space‘,‘text-justify‘],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,‘on$1‘);var g=c.replace(p,‘.$2‘+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+‘:expression(CSSHover(this, "‘+f+‘", "‘+h+‘", "‘+k+‘"))‘);this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=‘‘}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:‘onmouseenter‘,deactivator:‘onmouseleave‘},onactive:{activator:‘onmousedown‘,deactivator:‘onmouseup‘},onfocus:{activator:‘onfocus‘,deactivator:‘onblur‘}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp(‘(^|\\s)‘+c+‘(\\s|$)‘,‘g‘);this.activator=function(){a.className+=‘ ‘+c};this.deactivator=function(){a.className=a.className.replace(d,‘ ‘)};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent(‘onbeforeunload‘,function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
</script>

接下来就是在你html文件的head头里按如下方式以正确的路径将其引进来,就可以完美解决IE6下hover只在a标签上有作用的BUG。

<!--[if lte IE 6]>
        <style type="text/css">
            body { behavior:url("./css/csshover.htc"); }
        </style>
<![endif]-->

四:IE6不支持子代选择器。

其实这个不算是IE6的BUG,而是IE8以下的浏览器都不支持子代选择器。

可以看下w3c的文档。https:www.w3.org/TR/css21/selector.html

解决方案:可以综合使用js获取子节点和给相应节点设置ID或者CLASS来解决。

五:IE6不支持getELementsByClassName。

这个是IE8以下都不支持的。

解决方案:利用浏览器能力检测,自己模拟一个getELementsByClassName方法。代码如下。

if(!document.getElementsByClassName){
        document.getElementsByClassName = function(className, element){
            var children = (element || document).getElementsByTagName(‘*‘);
            var elements = new Array();
            for (var i=0; i<children.length; i++){
                var child = children[i];
                var classNames = child.className.split(‘ ‘);
                for (var j=0; j<classNames.length; j++){
                    if (classNames[j] == className){
                        elements.push(child);
                        break;
                    }
                }
            }
            return elements;
        };
    }

六:IE6不支持边框透明。

这条呢,看上去貌似没什么,不支持边框透明,本来边框也不怎么设置透明这个值啊。那你就忽略了一种情况,要是用css画三角形来模拟下拉标识符时,就必须用到边框透明。

普通浏览器下这样设置

border-width: 4px 4px 0;
border-color: #a4a4a4 transparent transparent;

IE6不支持边框透明,因此可以这样设置边框来模拟效果。设置要显示一边的三角其边框值为:border-style:solid,其他三边边框为border-style:dashed。这样便可以利用虚线样式的border形成空白。代码如下。

_border-width: 4px 4px 0;
_border-color:#a4a4a4 white white white;
_border-style:solid dashed dashed dashed;

七:IE6文本框不支持placeholder属性

解决方法:利用浏览器能力检测,为低版本浏览器添加value值来代替placeholder。

八:IE6不支持min/max-width/height属性

解决方法:添加如下所示代码

_width:expression(this.width>300?"300px":ture); max-width:300px;

但css表达式应该尽量避免使用。最好是给IE6添加_height/_width。

九:IE6下3px的像素偏差

当浮动元素与非浮动元素相邻,即使你没在俩元素之间设置边距,依然看上去会出现一条缝隙。

BUG原因:非浮动元素的layout未触发。

解决方案:1.将非浮动元素也设置为浮动。2.浮动元素设置display:inline 和 -3px margin

时间: 2024-10-12 16:20:18

作业总结(一):IE6下面的那些坑的相关文章

ufldl学习笔记与编程作业:Linear Regression(线性回归)

ufldl出了新教程,感觉比之前的好.从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说.不必深究其它机器学习的算法.能够直接来学dl. 于是近期就開始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutorial/supervised/LinearRegression/ 从一个最简单的线性回归,能够

第八次作业,这不是占坑,前方高能预警!!

这不是占坑:这不是占坑:这不是占坑:重要的事情说三遍!!! 1.输入若干名学生的成绩(输入人数或用负数结束均可),求其平均分,最高分和最低分,并指出最高分和最低分的学生(给出下标即可),输入一个成绩,说明是第几个学生的成绩. #include<stdio.h>#define N 10int main(){ int score[N],n,sum,max,s,min,index1,index2,i,x; double average=0; printf("请输入学生的数量:\n"

(20140708作业)编程的魅力在于:你不真的跳下去,永远不知道这个坑有多深!

作业要求: 输出TypeCode枚举类内所有的值 1 //获取枚举类型的值 2 //var V = Enum.GetValues(typeof(TypeCode)); 3 4 //1.名称 5 Console.ForegroundColor = ConsoleColor.Yellow; //设置颜色 6 Console.WriteLine("输出名称:"); //提示 7 foreach (var name in Enum.GetNames(typeof(TypeCode))) //循

小结IE6的坑

1.z-index在position:relative/absolute等定位属性设置后还是无效,会导致top栏的导航栏目的子菜单被下面的层遮住,无法显示:解决办法:?http://www.wufangbo.com/ie6-ie7-z-index-bug/就是被子导航列表覆盖的层绝对不能设置为相对定位(在该层中想让其子元素设置为position:absolute;本层设置为position:relative;这样的组合在IE6中是绝对不允许的,解决办法是:去掉父层的position:relati

2017282110285--第一次个人作业

第一部分:结缘计算机 1.你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 其实我从高一就开始接触编程了,在高中我搞了两年的算法竞赛,算是有一点算法基础(捂脸,其实实力弱得一批),也是在那个时候开始爱上了编程.因此在高考结束后就报了信息安全专业,哪怕那时候父母不是很支持我报跟计算机相关的专业.我认为我的起步条件会比一般的零基础的萌新稍微好那么一点点,但也就仅限于此了,毕竟有天赋的人比比皆是,他们只是缺少一个契机罢了,入门之后分分钟起飞的也是一大把,更不用说那些大牛博主了,他们的程序员

软件工程M1/M2总结及阅读作业总结

一.软件工程M1/M2总结 写下这篇总结的时候,我们的软件项目尚未完工.虽然尝试申请了延期答辩,但最终未能成功.这意味着,我们的项目能否正常发布已经处于了一个微妙的状态.可能可以,也可能不可以.只能尽力而为了. 整个一学期的开发下来,我在软件工程方面体会最深的是成本问题以及技术债.以前写的项目往往没有特别严格的deadline,很多是个人的随兴而写的东西,写不动了就不写了.又或者是作业,最多也就那么一千行,怎么都是可以写完的.而软件工程这门课的团队项目,7个人,一个完整的网站,特别是对于我们这个

移动端填坑之路

搞PC项目,最头疼的莫过于做IE6/7/8的兼容性(很蛋疼的事).而在如今移动端H5的兴起中,面对形形色色的机型,各种各样的品牌手机,导致我吗们FE们要做各种手机适配问题.样式兼容问题等等(巨烦,找问题还不好找).以下是在移动端项目之路上所遇到的各种问题: UC浏览器--css3的坑 最近在做一个移动端项目,涉及到评论模块,有评论必有点赞功能,当然也就存在点赞动画效果,第一反应就是利用css3动画效果. 方案一:transition+伪元素 .方案二:transition.方案呢三:animat

第六周作业:《人月神话》对我做项目实践的启示(一)

<人月神话>这本书有两个老师都有给我们推荐,第一个老师推荐时不以为然,第二个老师也推荐时,自己感觉应该是挺重要的吧,于是去图书馆借了这本书来看,刚借回来时,总觉得时间不够.作业很多,也没来的及看,就一直搁置在了那里,直到上周,在我们的项目实践开始近三周,但进度却一直赶不上来的情况下,看到了这本书,才拿起来看.目前还没看完,先写一点儿领悟到的东西. 作者从焦油坑,提出项目失败的表现,把过去几十年的大型系统开发比作一个炼焦坑,各种团队一个个地淹没在焦油坑,他们都试图解决面对的问题,但他们都必须去了

css 填坑常用代码分享

以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. /*强制不换行*/ white-space:nowrap; /*自动换行*/ word-wrap: break-word; word-break: normal; /*强制英文单词断行*/ word-break:break-all; 2. 两端对齐 text-align:justify;text-justify:inter-ideogra 3. 去掉Webkit(chrome)浏览器中input(文本框)或texta