前端兼容性问题总结(2)

怪异模式

怪异模式是没有遵守 W3C 规范的一种兼容模式,其中的 width 是包括 contentWidth, 左右padding, 左右border 在内的全部范围(height 也一样),类似于 box-sizing: border-box;,而且 table 的 font-size 不能从父元素继承。以下情况会触发浏览器怪异模式(Quirks Mode):

  • 没写 DOCTYPE 触发怪异模式

  • <!DOCTYPE ...>前加<?xml version="1.0" encoding="utf-8" ?>, IE6 下会触发怪异模式

  • <!DOCTYPE ...>前加入<!-- keep IE7 in Quirks Mode -->, IE7进入怪异模式

  • <!DOCTYPE ...>前有任何非空字符,会在IE6 下会触发怪异模式

  • <!DOCTYPE ...>前有 XML ,在IE7 下不会触发怪异模式,但不能有其他非空字符

检查document.compatMode,可以查看浏览器工作在哪个模式:值BackCompat为怪异模式,值CSS1Compat为标准模式

display:inline-block 元素间有间隙

    • apple
    • banana
    • pineapple
    • peach
    • orange
      • apple
      • banana

      • pineapple

      • peach

      • orange

        IE可能出现的文档样式短暂失效问题

        css 篇

        =====

        双倍间距问题

        /一下代码在 IE6 中会出现双倍间距/

        #box{

        float: left;

        margin: 10px;

        }

        //解决方法

        #box{

        float: left;

        margin: 10px;

        display: inline;

        }

        错位问题

        /IE6中,这样的多个盒子并列时会发生向下偏移,应该对偏移的盒子添加负 margin-top 进行修正/

        .box{

        float: left;

        }

        IE6 奇数宽高问题

        IE6 中盒子的宽(width) 和高(height)设置为奇数时会有 bug,尽量设置为偶数即可。

        IE6 Peekaboo Bug

        一个 div#top 中加入一个 div#float 向左浮动,然后加入一个或多个 div, 直到清除浮动为止:

        float div
        inside-div text!
        inside-div text!
        clear div

        解决方法,给 #top 一个 height 或 width :

        #top{

        height: 300px;

        }

        盒子坍塌

        这个问题比较普遍,在盒内层元素设置外边距时会发生

        /发生盒子坍塌/

        #box{

        height: 300px;

        }

        #box .inner-box{

        margin:20px;

        }

        /修正/

        #box{

        height: 300px;

        margin-top: -20px;

        }

        #box .inner-box{

        margin:20px;

        }

        文字大小

        字体大小在不同浏览上不一致。例如font-size:14px,在 IE 中的实际行高是16px,下面有3px留白;在 Firefox 中的实际行高是17px,下面有3px留白,上边1px留白;在 opera 中就更不一样了。解决方式统一指定行高 line-height

        html{

        font-size: 14px;

        line-height: 14px;

        }

        另外,我们会遇到 font-size:62.5% 这样的定义,为了把默认的 16px 映射为 10px, 这样1em = 10px 更利于计算。

        去除元素默认边距

        有很多元素默认带有边距,对我们排版很不利。但利用通配符*去除边距存在性能问题,所以用下面语句清除默认边距

        body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{

        margin: 0;

        padding: 0;

        }

        低版本 IE 高度限定失效

        一般的元素指定高度属性 height 可以固定该元素高度,但在低版本 IE 中无法固定元素高度,该元素高度依然会被内容撑开,需要注意。(宽度也一样)

        IE6 不支持 png 透明效果

        解决方式用滤镜

        #box{

        _background: none;

        filter: progid:DXImageTransForm.Microsoft.AlphaImageLoader(src=‘路径’);

        }

        Firefox 的宽度问题

        Firefox浏览器会的 body 比其他浏览器的 body 宽度小1个像素,注意设置其子元素(尤其 float 元素大小,防止排版混乱。

        IE6中的吞吃问题

        IE6 中为上下2个 div 中的上一个地址设置背景时,下一个 div 也会带有背景。类似的还有 overflow:scroll 时,出现的滚动条不完整。应该 分别对在上方的 div 和滚动条不完整的 div 加 zoom: 1样式。

        IE6 图片格式问题

        IE6 中的图片默认存在边框,应统一去除。同时图片下方会有空隙,用 font-size解决

        img{

        border: none;

        font-size: 0;

        }

        IE中无法定义1px高度这样的小盒子

        IE6 中的空元素高度不能低于19px,解决方式有四种:

        1. 在元素中插入空注释 <!---->

        2. 在元素中插入空格 &nbsp;

        3. 加入 css: overflow:hidden;

        4. 加入 css: font-size: 0;

        IE6 z-index 失效

        当父元素已设置 z-index 属性后,子元素的 z-index 会失效。

        IE6中 select 始终高于 div

        浮层 div 出现时隐藏 select,浮层 div 消失时再显示 select。

        让 chrome 支持小于 12px 的字体

        #box{

        font-size: 8px;

        -webkit-text-size-adjust: none;

        }

        /* 但是,上面这个方法 chrome27 以后就不能用了。但我们可以用 css3 解决这个问题 */

        #box{

        font-size: 12px;

        -webkit-transform: scale(0.75);

        }

        CSS Hack

        兼容性属性设置,注意书写顺序:优先写高等级浏览器支持方式、优先写支持浏览器多的方式

        /以 color 属性为例,注意书写顺序/

        #box{

        color: #f00; //所有浏览器都支持

        color: #0f0 !important; //只有 IE6 无效

        color: #00f\9; //所有 IE 都有效

        color: #ff0\0; //IE8+ 有效

        color: #f0f\9\0; //IE9+ 有效

        *color: #fff; //仅 IE6, IE7 有效

        #color: #0ff; //仅 IE6, IE7 有效

        +color: #800; //仅 IE6, IE7 有效

        -color: #008; //只有 IE6 有效

        _color: #080; //只有 IE6 有效

        }

        由于后定义的属性覆盖先定义的属性,所有上面设置最后的效果为:

        IE6 为 #080

        IE7 为 #800

        IE8 为 #ff0

        IE9,10 为 #0f0

        其他 为 #f00

        javascript 篇

        ============

        innerText 和 innerContent

        1. innerText 和 textContent 的作用相同

        2. innerText IE8之前的浏览器支持

        3. innerContent 老版本的Firefox支持

        4. 新版本的浏览器两种方式都支持

        和以上四种情况完全一致的还有parentElement(老IE)和parentNode

        获取兄弟节点/元素的兼容性问题

        ie8以前不支持previousElementSiblingnextElementSibling,以及诸如此类带有Element的元素属性。利用previousSibling

        nextSibling等不带Element的属性实现如下:

        // 获取下一个紧邻的兄弟元素

        function getNextElement(element){

        var ele = element;

        if(ele.nextElementSibling) return ele.nextElementSibling;

        do{

        ele = ele.nextSibling;

        }while(ele && ele.nodeType !== 1);

        return ele;

        }

        // 获取上一个紧邻的兄弟元素

        function getPreviousElement(element){

        var ele = element;

        if(ele.perviousElementSibling) return ele.perviousElementSibling;

        do{

        ele = ele.perviousSibling;

        }while(ele && ele.nodeType !== 1);

        return ele;

        }

        // 获取第一个子元素

        function getFirstElement(parent){

        if(parent.firstElementChild) return parent.firstElementChild;

        var ele = parent.firstChild;

        while(ele && ele.nodeType !== 1) ele = ele.nextSibling;

        return ele;

        }

        // 获取最后一个子元素

        function getLastElement(parent){

        if(parent.LastElementChild) return parent.LastElementChild;

        var ele = parent.lastChild;

        while(ele && ele.nodeType !== 1) ele = ele.perviousSibling;

        return ele;

        }

        // 获取所有兄弟元素

        function sibling(ele){

        if(!ele) return null;

        var elements = [ ];

        var el = ele.previousSibling;

        while(el){

        if(el.nodeType === 1)

        elements.push(el);

        el = el.previousSibling;

        }

        el = element.nextSibling;

        while(el){

        if(el.nodeType === 1)

        elements.push(el);

        el = el.nextSibling;

        }

        return elements;

        }

        其它DOM操作

        IE中有一些很好用的 DOM 方法,但是其他浏览器却没有,比如:

        - ele.swapNode(anotherEle)用来交换节点;

        - ele.removeNode()删除当前节点;

        - ele.insertAgjacentHTML('position','HTMLText')ele.insertAgjacentHTML('position',ele) 用来插入节点;

        部分实现方式写在下面:

        最后

        资料过多,篇幅有限

        开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

        自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。

        elements.push(el);

        el = el.previousSibling;

        }

        el = element.nextSibling;

        while(el){

        if(el.nodeType === 1)

        elements.push(el);

        el = el.nextSibling;

        }

        return elements;

        }

        其它DOM操作

        IE中有一些很好用的 DOM 方法,但是其他浏览器却没有,比如:

        - ele.swapNode(anotherEle)用来交换节点;

        - ele.removeNode()删除当前节点;

        - ele.insertAgjacentHTML('position','HTMLText')ele.insertAgjacentHTML('position',ele) 用来插入节点;

        部分实现方式写在下面:

        最后

        [外链图片转存中…(img-ZipjfWIy-1714562907812)]

        [外链图片转存中…(img-JJnI4ztR-1714562907813)]

        资料过多,篇幅有限

        开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

        自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。

      • 20
        点赞
      • 24
        收藏
        觉得还不错? 一键收藏
      • 0
        评论

      “相关推荐”对你有帮助么?

      • 非常没帮助
      • 没帮助
      • 一般
      • 有帮助
      • 非常有帮助
      提交
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值