什么是浏览器兼容问题?所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的显示效果。所以浏览器的兼容性问题是前端开发人员经常会碰到和必须要解决的问题。
总结一下我编写代码的时候遇到的浏览器兼容问题,跟大家学习。
一、解决无法在IE6下面设置1px高的容器(div)的问题。
大家看看这一段代码:
当然,这段代码在非IE6下是能够设置1px高度的div的(如左图),但是在IE6中的效果如右图:
非IE6下: IE6下:
解决方案:在div里面添加一个空格符( )以创建内容;再设置line-height:1px;即可。
二、透明度opacity不兼容的问题,opacity是属于css2.1的内容,在IE6中并不支持(另外position:fixed;也是css2.1的内容,并不支持IE6)。
创建一个宽高100px的div,设置透明度为0.5,背景色黑色如下:
效果图分别如下:左边为非IE6,右边是IE6
非IE6: IE6:
会看到在IE6中并不支持该属性,解决方案:
3. IE6 での水平方向の二重マージンのバグ。 float に設定された div に設定されたマージンは、IE では 2 倍になります。これはie6に存在するバグです。
このようなバグを最初に引き起こすには、次の条件が満たされている必要があります:
1. 要素は float である必要があります;
2. 要素は水平マージン、マージン左、マージン右を持つ必要があります
3. 要素ブロック要素である必要があります
4. ブラウザは IE6 である必要があります。
上記の条件は必須なのでIE6でない限りこの問題は存在しません。解決策は簡単で、条件の 1 つを破棄するだけです。
例:
<head> <meta charset="UTF-8"> <title>测试浏览器兼容问题</title> <style> body{ background: #fff; } .wrap{ width: 300px; height: 150px; margin:50px auto; border: 2px solid #333; overflow: hidden; } .wrap div{ height: 100px; width: 100px; background: #333; float: left; margin-left: 20px; } </style></head><body> <div class="wrap"> <div></div> <div></div> </div></body>
レンダリングは次のとおりです: 左が非IE6、右がIE6です
IE6では、左側のmargin-leftの値が40pxであることがわかります。 、解決策は、display:inline を row 属性に変換することです。
4. IE6 では、画像に a タグを追加すると、デフォルトで枠線が表示されます。
img{
幅: 100px;
高さ: 100px;
}
レンダリングは次のとおりです: 左が非 IE6、右が IE6
この問題は比較的簡単に解決できます。画像の border:none; を設定するだけです。なお、aタグのborder値は設定されていませんが、画像が設定されています。
5. IE6 は、png 形式の画像の透明効果をサポートしていません。
解決策: プラグインを使用します: DD_belatedPNG.js プラグイン (このプラグインが必要な場合は、自分で Baidu を使用できます:))
使用方法の説明: 次のコードを貼り付けるだけです
<!--[if IE 6]> <script src="js/DD_belatedPNG_0.0.8a.js"></script> <script> DD_belatedPNG.fix('*'); </script> <![endif]-->
6. 所有権レイアウト haslayout について言及します。ブラウザの互換性の問題について話すときは、haslayout について言及する必要があります。
IE6と7では、レイアウトを持っていることがトリガーされない場合があります。ハレイアウトとは何ですか?私の理解では、要素 (タグ) にレイアウトがある場合、その要素は独自のデフォルト スタイルを取得し、すべてのレイアウトはこのデフォルト標準に従ってレイアウトされます。つまり、このレイアウトは正常であるということです。しかし、要素にデフォルトのレイアウトがない場合、レイアウトが乱雑になるでしょうか? (指定するスタイルは要素のレイアウト [デフォルト スタイル] に基づいているため)。したがって、この場合は、この所有レイアウトをトリガーし、haslayout をトリガーする必要があります。
haslayout をトリガーするには多くの方法があります:
1. 最も一般的で最も安全な方法: haslayout のない要素にzoom:1; を設定します (実際には、それが 1 であるかどうかは問題ではありません。なし)。他のブラウザではまったく認識されないため、最も安全であると言われています。
2. 高さを設定します: auto を除く任意の値。
3. フロートを設定します。
4. 幅を設定: auto 以外の任意の値。
7. ボックスモデルの 2 つのモードを紹介します。
皆さんはボックスモデルに精通しているはずです。ここでは、標準モードと奇妙なモードの2つのモードを紹介します
標準モード:通常、IE以外のブラウザで使用されます。計算方法:占有スペースの幅=コンテンツの幅+左右の内マージンの幅+左右のボーダーの幅+左右のマージンの幅(マージン+パディング+ボーダー+ content)
奇妙なモード:IE6を指す IE以前のバージョンの下側ボックスモデルの計算方法:占有領域の幅の合計=コンテンツ+マージン(コンテンツ+マージン)
類似点それらの違いは実際に簡単に確認できます:
同じ点: それらはすべてマージン、ボーダー、パディング、コンテンツで構成されます
違い: 標準モードのボックスの幅と高さの合計の計算方法が異なります。マージン、パディング、ボーダー、およびコンテンツの合計です。奇妙なモードでは、合計の幅はコンテンツからパディングとボーダーを差し引くことによって取得されます。
8. ブラウザの互換性には他にも問題があります。時間に限りがあるため、以下で一つ一つ説明しません:
①: さまざまなブラウザで img にギャップがあります (理由は次のとおりです)。 )
②: Ie6 では、最大幅、高さ、最小幅と高さが認識されず、min-width/height と Max-width/height は Ie6 では効果がありません、
③: 3 ピクセルの問題: 以下IE6、フローティング要素とフロー要素を並べて表示すると、それらの間に 3 ピクセルの問題が発生します。 (解決にはハックを使用します)
④:インライン要素を包含ボックスとして定義し、その包含ボックスに含まれる絶対配置要素をパーセント単位で配置すると混乱が生じます(ズーム:1)
⑤ : 複数ある場合 フローティング要素の途中にHTMLのコメント文がある場合、フローティング要素の幅が100%の場合、前の行の最後の文字が次の行に表示されます。
⑥: 2 つのブロック要素の場合、垂直マージン値は増加せず、それらの間の距離が最大マージン値になります。
⑦:优先级:被!important 注明的css属性具有最高优先级(.abc{color:red !important;})。但在ie6中!important具有一个bug:在同一组css属性中,!important不起作用。
⑧:火狐不识别background-position-y 或background-position-x;
⑨:ie6 不支持 fixed(前面有提到)
⑩:解决 ie6 最大、最小宽高 hack方法(这个说明一下)
/* 最小宽度 */.min_width{ min-width:300px; _width:expression(parseInt(this.clientWidth) < 300 ? "300px" : this.clientWidth);}/* 最大宽度 */.max_width{ max-width:600px; _width:expression(parseInt(this.clientWidth) > 600 ? "600px" : this.clientWidth);}/* 最小高度 */.min_height{ min-height:200px; _height:expression(parseInt(this.clientHeight) < 200 ? "200px" : this.clientHeight);}/* 最大高度 */.max_height{ max-height:400px; _height:expression(parseInt(this.clientHeight) > 400 ? "400px" : this.clientHeight);}
①①:z-index不起作用的 bug
九、css hack:前端开发人员根据不同的浏览器以及不同的版本而分别编写的特定的CSS样式,通俗理解就是专门为不同浏览器设置自己的样式。
各版本IE的hark,代码表示:
.bb{
height:32px;
background-color:#f1ee18; /*所有识别*/
.background-color:#00deff\9; /*IE6、7、8识别*/
+background-color:#f1ee18; /*IE6、7识别*/
_background-color:#f1ee18; /*IE6识别*/
}
< div class ="bb"> div >
像刚刚png图片不支持插入的代码一样,这种hack用在专门浏览器下,用法如下:下面还有很多类。
<!--[if IE 6]> <script src="js/DD_belatedPNG_0.0.8a.js"></script> <script> DD_belatedPNG.fix('*'); </script> <![endif]-->
符号 | 含义 | 示例 |
! | 非运算符 | 除IE外都可识别 |
lt | Less than小于 | |
gt | greater than大于 | |
lte | less than或equal小于等于 | |
gte | greater than或equal大于等于 | |
| | 或运算符 | |
& | 与运算符 |
|
/*类内部hack:*/ .header {_width:100px;} /* IE6专用*/ .header {*+width:100px;} /* IE7专用*/ .header {*width:100px;} /* IE6、IE7共用*/ .header {width:100px\0;} /* IE8、IE9共用*/ .header {width:100px\9;} /* IE6、IE7、IE8、IE9共用*/ .header {width:330px\9\0;} /* IE9专用*//*选择器Hack:*/ *html .header{} /*IE6*/ *+html .header{} /*IE7*/