`
highfly-s
  • 浏览: 100325 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

跨浏览器兼容性总结

阅读更多

一、        CSS样式兼容

1.        FLOAT闭合(clearing float

网页在某些浏览器上显示错位很多时候都是因为使用了float浮动而没有真正闭合,这也是div无法自适应高度的一个原因。如果父div没有设float而其子div却设了float的话,div无法包住整个子DIV,这种情况一般出现在一个父DIV下包含多个子DIV。解决办法:

1)         给父DIV也设上float

2)         在所有子DIV后新加一个空DIV(目前Ext是这么做的),比如:

.parent{width:100px;}

.son1{float:left;width:20px;}

.son2{float:left;width:80px;}

.clear{clear:both;margin:0;parding0;height:0px;font-size:0px;}

<div class="parent">

      <div class="son1"></div>

      <div class="son2"></div>

      <div class="clear"></div>

</div>

 

3)         万能 float 闭合

将以下代码加入Global CSS 中,给需要闭合的div加上 class=clearfix 即可,屡试不爽。

<style>

/* 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 */

</style>

:after(伪对象),设置在对象后发生的内容,通常和content配合使用,IE不支持此伪对象,非Ie 浏览器支持,所以并不影响到IE/WIN浏览器。这种的最麻烦。

 

4)         overflow:auto

只要在父DIVCSS中加上overflow:auto就搞定。举例:

.parent{width:100px;overflow:auto}

.son1{float:left;width:20px;}

.son2{float:left;width:80px;}

<div class="parent">

      <div class="son1"></div>

      <div class="son2"></div>

</div>

原理是,外围元素之所以不能很好的延伸,问题出在了overflow上,因为overflow不可见(见W3C的解释)。现在只要将给外围元素添 加一个“overflow:auto”,就可以解决问题,结果是除了IE,真的可以解决。下来就要解决IE的问题了,再加上“_height:1%”,这个问题就完全解决了。我试了一下,其实不加"_height:1%“在IE下也行,留着吧。

 

2.        截字省略号

.hh {

-o-text-overflow:ellipsis;

text-overflow:ellipsis;

white-space:nowrap;

overflow:hidden;

}

这个是在越出长度后会自行的截掉多出部分的文字,并以省略号结尾。技术是好技术,很多人都喜欢乱用,但注意Firefox并不支持。

 

<meta http-equiv="x-ua-compatible" content="ie=7" />

页面加上这句就可以让页面兼容IE7

 

供参考! 给大家提醒一个漂浮需要注意的问题 注意设置DIV宽和高 注意设置overflow:hidden; 注意闭合针对火狐 div样式display:inline-block;

 

3.        cursor:handcursor:pointer

firefox不支持hand,但ie支持pointer

解决方法:统一使用pointer

 

4.        CSS透明

几款浏览器对透明度的支持方式各不相同,为了保证在IE, Firefox, Chrome, Safari等主流浏览器下都能正常显示透明度的效果,我们可以定义一个透明度的class,因为一写就要写3条,省的每次都复制来复制去了。

具体代码如下:

.transparent{

filter:alpha(opacity=60);  /*支持 IE 浏览器*/

-moz-opacity:0.6; /*支持 FireFox 浏览器*/

opacity:0.6;  /*支持 Chrome, Opera, Safari 等浏览器*/

}

 

5.        css中的widthpadding

IE7FFwidth宽度不包括padding,在Ie6中包括padding。具体参见附录1第一节理解CSS盒子模型

 

 

更多参见附录1:跨浏览器兼容的CSS编码准则和技巧

 

 

二、        JavaScript兼容

1.        childrenchildNodes

IE提供的childrenchildNodesfirefox下的childNodes的行为是有区别的,firefoxchildNodes会把换行和空白字符都算作父节点的子节点,而IEchildNodeschildren不会。比如:

<div id="dd">

<div>yizhu2000</div>

</div>

iddddivIE下用childNodes查看,其子节点数为1,而ff下为三,我们可以从firefoxdom查看器里面看到他的childNodes["\n ", div, "\n"]

要在firefox下模拟children的属性我们可以这样做:

if (typeof(HTMLElement) != "undefined" && !window.opera) {

    HTMLElement.prototype.__defineGetter__("children", function() {

        for (var a = [], j = 0, n, i = 0; i < this.childNodes.length; i++) {

            n = this.childNodes[i];

            if (n.nodeType == 1) {

                a[j++] = n;

                if (n.name) {

                    if (!a[n.name])

                        a[n.name] = [];

                    a[n.name][a[n.name].length] = n;

                }

                if (n.id)

                    a[n.id] = n;

            }

        }

        return a;

    });

}

 

2.        firefoxie的事件

window.event只能在IE下使用,而不能用在Firefox下,这是因为Firefoxevent只能在事件发生的现场使用。  Firefox必须从源处加入event作参数传递。IE忽略该参数,用window.event来读取该event

比方说下面这个在ie下获得鼠标位置的方法:

<button onclick="onClick()" >获得鼠标点击横坐标</button>

<script type="text/javascript">

function onclick(){

alert(event.clientX);

}

</script>

 

需要改成

<button onclick="onClick(event)">获得OuterHTML</button>

<script type="text/javascript">

function onclick(event){

event = event || window.event;

alert(event.clientX);

}

</script>

才能在两种浏览器下使用

 

3.        HTML对象获取问题

FireFox获取方式document.getElementById("idName")

ie使用document.idname或者document.getElementById("idName")

解决办法:统一使用document.getElementById("idName");

 

4.        const问题

Firefox下,可以使用const关键字或var关键字来定义常量;

IE下,只能使用var关键字来定义常量;

解决方法:统一使用var关键字来定义常量。

 

5.        frame问题

以下面的frame为例:

<frame src="xxx.html" id="frameId" name="frameName" />

 

a)         访问frame对象

IE:使用window.frameId或者window.frameName来访问这个frame对象,frameIdframeName可以同名;

Firefox:只能使用window.frameName来访问这个frame对象;

另外,在IEFirefox中都可以使用window.document.getElementById("frameId")来访问这个frame对象;

 

b)         切换frame内容

IEFirefox中都可以使用window.document.getElementById("testFrame").src = "xxx.html"window.frameName.location = "xxx.html"来切换frame的内容;

如果需要将frame中的参数传回父窗口(注意不是opener,而是parent),可以在frame中使用parent来访问父窗口。例如:

parent.document.form1.filename.value="Aqing";

 

6.        body问题

Firefoxbodybody标签没有被浏览器完全读入之前就存在;而IEbody则必须在body标签被浏览器完全读入之后才存在;

 

7.        firefoxIE的父元素(parentElement)的区别

IEobj.parentElement

firefoxobj.parentNode

解决方法:因为firefoxIE都支持DOM,因此全部使用obj.parentNode

 

8.        innerText的问题

innerTextIE中能正常工作,但是innerTextFireFox中却不行,需用textContent

解决方法:

if (navigator.appName.indexOf("Explorer") > -1) {

    document.getElementById('element').innerText = "my text";

} else {

    document.getElementById('element').textContent = "my text";

}

 

9.        AJAX获取XMLHTTP的区别

var xmlhttp;

if (window.XMLHttpRequest) {

    xmlhttp = new XMLHttpRequest();

} elseif (window.ActiveXObject) { // IE的获取方式

    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

}

注意:在IE中,xmlhttp.send(content)方法的content可以为空,而firefox则不能为null,应该用send(""),否则会出现411错误。

 

 

 

附录1:跨浏览器兼容的CSS编码准则和技巧

1.        理解 CSS 盒子模型

如果你想实现不需要很多奇巧淫技的跨浏览器兼容的 CSS 代码,透彻地理解 CSS 盒子模型是首要事情,CSS 盒子模型并不难,且基本支持所有浏览器,除了某些特定条件下的 IE 浏览器。

 

CSS 盒子模型负责处理以下事情:

l  一个 blcok (区块)级对象占据多大的空间

l  该对象的边界,留白

l  盒子的尺寸

l  盒子与页面其它元素的相对位置

 

CSS 盒子模型有以下准则:

l  Block (区块)对象都是矩形 (事实上所有对象都如此)

l  其尺寸由 width, height, padding, borders, 以及 margins 决定

l  如果不设置高度,该盒子的高度将自动适应其包含的内容,加上留白等(除非使用了 float

l  如果不设置宽度,一个非 float 型盒子水平上将充满其父容器(扣除父容器的留白)

 

处理 block 级对象时,必须注意以下事项:

l  如果一个盒子的宽度设置为 100%,它就不能再设置 margins, padding, borders,否则会撑破其父容器

l  垂直毗邻的 margin 会引起复杂的坍塌问题,导致布局问题(比如两个垂直毗邻的 Block 对象,上面的对象的 bottom-margin 40,下面的对象的 top-margin 20,则两个对象的间距将是 40,而不是 60 - 译者)

l  拥有相对位置和绝对位置的对象,拥有不同的行为

 

Css-box-model in The Principles Of Cross-Browser CSS Coding

Firefox Firebug 中显示的盒子模型

 

2.        理解 block 级和 inline 对象的区别

这个看似简单的问题事如果能透彻地理解,会受益匪浅。

 

下图讲解了 block 级对象和 inline 级对象的区别:

Block-inline in The Principles Of Cross-Browser CSS Coding

 

下面是 block 级对象和 inline 级对象的基本区别:

l  Block 级对象会自然地水平充满其父容器,因此没有必要为之设置 100% 宽度属性

l  Block 级对象的起始摆放位置是其父容器的左上边界,并顺排在其前面的兄弟 Block 对象的下方(除非设置 float 或绝对位置)

l  Inline 级对象会忽略其宽度和高度设置

l  Inline 级对象会随着文字排版,并受排版属性的影响(如 white-space, font-size, letter-spacing

l  Inline 级对象可以使用 vertical-align 属性控制其垂直对齐,block 级对象不可以

l  Inline 级对象的下方会保留一些自然的空间,以适应字母 g 一类的会向下探出的笔画

l  一个设置为 float inline 对象将变成 block 对象

 

3.        理解 Floating Clearing 属性

实现多栏排版的最好方法是使用 float 属性,float 也是一个将使你受益匪浅的属性。一个 float 对象可以居左或居右,一个设置为 float 的对象,将根据设置的方向,左移或右移到其父容器的边界,或其前面的 float 对象的边界,而紧随其后的非 float 对象或内容,则包围在其相反的方向。

 

Float-css in The Principles Of Cross-Browser CSS Coding

 

以下是使用 float clear 属性的一些重要准则:

l  一个 float 对象,将从其置身的 block 级非 float 内容流中跳出,换句话说,如果你要将一个 box 向左边 float,它后面的 block 级非 float 对象会显示到下方,inline 级内容会在旁边包围

l  要让一段内容从一侧包围一个 float 对象,这段内容必须要么是 inline 级的,要么也设置为相同方向的 float

l  一个 float 对象,如果没有设置宽度,则会自动缩成其包含的内容的宽度,因此最好为 float 对象明确设置宽度

l  如果一个 block 对象包含 float 子对象,会出现本文中阐述的问题。

l  一个设置了 clear 属性的对象,将不会包围其前面的 float 对象

l  一个既设置了 clear 又设置了 float 属性的对象,只有 clear:left 属性生效,clear:right 不起作用

 

4.        首先使用 IE 进行测试

虽然我们都痛恨 IE6 IE7,但当你开始一个新项目的时候,最好还是首先针对这两种浏览器进行测试,否则,如果你在设计在后期才想起针对 IE6 IE7 进行测试,将出现以下问题:

l  你将不得不使用一些奇巧淫技,甚至使用独立的 IE6/7 CSS,导致 CSS 文件臃肿。

l  某些地方的布局将不得不重新设计

l  会增加测试的时间

l  你的布局在 IE/6/7 中和其它浏览器中不一样

 

IE6/7 仍有大量用户基础的国内(感谢中行,建行,农行,工行,以及各级政府网站),忽视这两种浏览器是极不明智的,首先针对 IE6/7 进行设计是一种很好的方法,一般来说,在IE6/7 通过测试的站点,在 FirefoxChromeSafariOpera 等标准浏览器面前基本不会出现问题,前提是,你的 CSS 设计是基于 W3C 标准的。

 

5.        IE 浏览器最常见的问题

l  IE6 中不可滥用 float,否则会带来内容消失以及文字重复等稀奇古怪的问题

l  IE6 中,float 对象,在 float 方向的那边,会出现双倍 margin,将 display 设置为 inline 会解决这个问题

l  IE6/7 中,一个没有直接或间接设置 hasLayout 的对象,会发生各种稀奇古怪的问题(译者注:对这类问题,zoom 这个 css 属性可以帮很大的忙,将 zoom 设置为除了 normal 之外的其它值,可以迫使一个对象 hasLayout 同时不影响这个对象的任何视觉外观)

l  IE6 不支持 min-width, max-width, min-height, max-height 一类的属性

l  IE6 不支持固定位置背景图

l  IE6/7 不支持很多 display 属性值(如 inline-table, table-cell, table-row

l  IE6 中,只有 a 这个对象才可以使用 :hover 这个伪类

l  IE 的某些版本对某些 CSS 选择器支持很少(如属性选择器,子对象选择器)

l  IE6~8 CSS3 的支持很有限 (不过有一些变通方法)

 

6.        永远不要指望在所有浏览器中都一模一样

在不同浏览器实现相同的体验个功能是可能的,实现近似像素级的一致外观也是可能的,但永远不要指望一模一样。

Form 控件在不同浏览器显示总是不同

 

以下是 Facebook 首页中的 select 控件,在5种不同浏览器的显示差异

 

某些 Form 控件,如果要求必须跨浏览器一致,可以找到变通办法,如,可以使用图片 替代 submit 按钮,但有一些控件,比如 radioselect textarea,文件选择框,是永远都不可能一模一样的。

 

7.        字体的表现都有差异

先不谈有的字体在有的系统中根本不存在,即时存在,它们在不同系统的渲染效果也不完全一样,比如,Windows ClearType 支持 IE7,但不支持 IE6,导致同一个字体在 IE7 IE6 有不同的样子。

 

Cleartype-ie in The Principles Of Cross-Browser CSS Coding

字体在 IE6 and IE7 中的区别

 

8.        使用 CSS 清零

使用 CSS 清零(CSS Reset)是实现跨浏览器兼容的灵丹妙药,CSS 清零可以消除不同浏览器对 marginpadding 这些属性的默认表现,你可以更容易控制诸如对齐,间隙等等问题。推荐使用 Eric Meyers CSS 清零代码。

 

Reset-wd in The Principles Of Cross-Browser CSS Coding

 

9.        参考 SitePoints CSS 兼容表

SitePoint CSS Reference 是一个非常好的资源(下载离线版),可以用来检查某些 CSS 属性的跨浏览器兼容问题

 

Sitepoint-chart in The Principles Of Cross-Browser CSS Coding

 

10.    结语

跨浏览器兼容是个永恒的话题,本文介绍的跨浏览器兼容 CSS 准则只是帮助 Web 开发设计者尽可能实现这一目标,除了这些,基于 CSS3 的渐进式增强设计也是一种趋势,Web 开发与设计者可以针对某些浏览器提供增强功能,而在不支持这些增强功能的浏览器中降级使用基本功能。

 

 

附录2:浏览器CSS选择器兼容性

注:

l  绿色 /   表示目前支持。

l  橙色 / Δ   表示浏览器部分支持当前CSS选择器。

l  红色 / Χ   表示浏览器完全不支持。

 

 

分享到:
评论

相关推荐

    css与javascript跨浏览器兼容性总结

    总之,解决CSS与JavaScript跨浏览器兼容性问题需要对不同浏览器的特性和渲染机制有所了解,并且通过实践总结出一系列兼容性解决方案。随着Web技术的发展,主流浏览器对标准的支持越来越好,但仍然需要开发者对旧版本...

    跨浏览器兼容CSS篇

    ### 跨浏览器兼容CSS篇:实现一致性的策略与技巧 #### 一、引言 在Web设计领域,确保网站在不同浏览器中呈现一致的效果是一项挑战性任务。由于各种浏览器对CSS的支持程度不尽相同,开发者经常面临布局差异的问题。...

    跨浏览器兼容的CSS代码编程方法

    然而,在实际开发中,由于不同浏览器对CSS的支持程度不同,导致了跨浏览器兼容性问题成为了一个长期困扰开发者的问题。本文将详细介绍如何编写跨浏览器兼容的CSS代码,并分享一些实用的技巧。 #### 二、CSS兼容性的...

    javascript解决浏览器兼容性问题

    为了确保跨浏览器兼容性,我们需要编写能够适配不同浏览器环境的代码。 ##### 2.1 创建XMLHttpRequest对象的通用方法 ```javascript var xmlhttp; // 创建XMLHTTPRequest对象 function createXMLHTTPRequest() { ...

    跨浏览器兼容CSS篇整理.pdf

    跨浏览器兼容性是Web开发中的一个关键议题,尤其是在CSS领域。由于不同的浏览器对CSS标准的实现存在差异,设计师和开发者需要采取策略确保网站在不同浏览器上表现一致。本文主要聚焦于CSS的跨浏览器兼容性,特别是...

    常见浏览器兼容性问题与解决方案

    浏览器兼容性问题一直是前端开发中的重要议题,尤其是在构建跨平台、多浏览器的网站或应用时。本文主要讨论了针对严谨型前端开发人员的浏览器解析差异导致的兼容性问题及其解决方案。 首先,问题一涉及到不同浏览器...

    浏览器兼容代码大全

    ### 浏览器兼容代码大全 #### 概述 本文档提供了一系列的代码示例,旨在...无论是通过CSS技巧、特殊的选择器还是条件注释,都可以有效地提高网站的跨浏览器兼容性。希望这些知识能够帮助你更好地进行前端开发工作。

    css浏览器兼容性总结.pdf

    CSS浏览器兼容性是前端开发者经常面临的一个挑战,尤其是在处理IE和Firefox等不同浏览器时。以下是一些关键的CSS兼容性问题及解决方案: 1. **垂直居中问题**: - 在IE和Firefox中,实现`div`的垂直居中可以通过...

    用于跨浏览器网页编程

    本文将从一个具体的示例出发,深入探讨如何通过JavaScript来检测用户所使用的浏览器类型及其版本,并进一步讲解实现跨浏览器兼容性的技巧。 #### 二、代码解析与优化 在给定的代码片段中,开发者尝试通过...

    Zero Clipboard 利用 Flash 进行复制 跨浏览器兼容

    1. **跨浏览器兼容性**:Zero Clipboard支持各种主流浏览器,包括Internet Explorer、Firefox、Chrome、Safari和Opera,这得益于Flash的广泛兼容性。 2. **简单易用**:Zero Clipboard提供了简洁的API,开发者只...

    浏览器兼容报告

    此外,遵循W3C的Web标准、利用现代浏览器特性的同时考虑向下兼容,是创建具有良好浏览器兼容性的网站的关键。 总结起来,浏览器兼容报告关注的是如何在不同浏览器内核环境下保持网页的一致性。Web开发者必须理解...

    CSDN剪切板,跨浏览器复制

    标题中的"CSDN剪切板"是一个专门设计用于实现跨浏览器复制功能的工具,它旨在解决在不同浏览器...通过理解和使用这个工具,开发者可以学习到关于Web Clipboard API、跨浏览器兼容性和如何实现高效前端交互的宝贵知识。

    终极解决kindeditor IE11兼容性看不到弹出框 360浏览器兼容性问题

    总结来说,解决KindEditor在IE11和360浏览器上的弹出框兼容性问题,需要对浏览器的特性有深入理解,同时熟悉JavaScript和CSS的跨浏览器兼容性策略。通过更新库、使用CSS hack、调试JavaScript代码以及检查第三方库的...

    JavaScript 浏览器兼容性总结及常用浏览器兼容性分析

    上述内容总结了常见的一些兼容性问题及其解决方案,为开发者提供了一份参考资料,以便更有效地编写跨浏览器的JavaScript代码。需要注意的是,随着浏览器的不断更新和升级,以及新标准的逐步推广,一些兼容性问题可能...

    JS浏览器兼容问题总结

    2. **兼容性提升**:这种方式既可以在IE中使用,也可以在Firefox等其他现代浏览器中使用,提高了代码的跨浏览器兼容性。 #### 四、HTML对象的id作为对象名的问题 **现有问题**:在IE中,可以直接使用HTML对象的ID...

    浏览器兼容总结.txt

    ### 浏览器兼容性总结 #### 一、数组元素获取方法 对于不同的浏览器,在处理数组元素时有所差异。在 Internet Explorer(以下简称IE)中,可以通过`()`或`[]`来访问数组元素;而在 Firefox 中,则只能通过`[]`来...

Global site tag (gtag.js) - Google Analytics