浏览器兼容问题,原始代码注意和label-preset-env插件

浏览器兼容问题,需要注意两点,或者说是两种处理方式。就是原始代码注意和label-preset-env插件。
关于原始代码指的是不要使用浏览器之间有差别,部分无法支持的语法结构,包括布局和css形式。关于插件,指的是使用abel-preset-env里面的browers来指定运行浏览器的名字和版本,是支持名字和版本多重选择的。其实插件的输出规则也是按照原始代码规则进行编写的。

以供参考2篇博文
https://www.cnblogs.com/ylliap/p/6133487.html
https://baijiahao.baidu.com/s?id=1619653290292160339&wfr=spider&for=pc

参数注意

targets 指定运行环境
targets.node 指定node版本
targets.browsers 指定浏览器版本
modules 指定何种形式的模块,设置为false表示不转码模块

{
    "presets": [
        ["env",{
            "targets": {
                "chrome": 52,
                "browsers": ["last 2 versions","safari 7"]
            }
        }]
    ]
}

多重选择

{  "presets": [
    ["env", {      "targets": {        "browsers": [ "ie >= 8", "chrome >= 62" ]      }      
    }]
  ]}

阅读目录

1. Web标准以及W3C

2. 主流浏览器内核

3. 标准模式(Standards Mode)和怪异模式(Quirks Mode)

4. CSS盒模型

5. 重置浏览器样式

6. HTML语义化

7. CSS选择器的优先级

8. 双外边距浮动问题

9. 3像素问题

10. IE6不支持min-*

11. IE6不支持png-24透明图片

12. IE6不能定义1px左右宽度的容器

13. IE5~8不支持opacity

14. Firefox点击链接出现的虚线框

15. 外边距叠加

16. 图片默认间距

17. 清除浮动

在总结浏览器问题之前,我觉得我们应该掌握目录中的1~7标题的内容,对后面的问题,我想应该会更明白一些,并且可以避免许多Bug。

1. Web标准以及W3C
Web标准是由万维网联盟(W3C)制订的,WEB标准的产生,网页内容能被更多的用户所访问到,文件下载和页面显示速度更快,所有页面都能提供适合打印的版本,网页开发人员开发更快捷,代码更易于维护,提高了搜索引擎的精确性,提高了网站的易用性。

我们需要注意的代码标准有:
标签必须闭合(如:<br />
小写元素和属性名,与HTML不一样,XHTML大小写是敏感的
标签都必须合理嵌套(如:<div><span></span></div>
属性值必须加引号(如:<height="80">
C在这里插入代码片SS样式表一定要放在<head></head>之间
特殊符号用编码表示(如:小于号(<),并不是标签的一部分,需要用编码&lt;表示。
所有属性赋值,XHTML规定所有属性都必须有一个值,没有值的就重复本身
在注释中不使用--符号
2. 主流浏览器的内核
浏览器内核主要指的是浏览器的渲染引擎,渲染引擎决定了浏览器如何加载和显示网页的内容以及信息。我们主要用于测试的浏览器都有:IE、Chrome、Firefox、Safari、Opera、360浏览器。

    IE:trident内核(IE内核)
    Firefox:geoko内核,Mozilla自己开发的一套开放源代码、以C++编写的渲染引擎。
    Safari:webkit内核,开源的浏览器引擎,源自于Linux平台上的一个引擎,经过Apple公司的修改可以支持Mac与Windows平台。
    Chrome:Blink内核,Google和Opera Software共同研发。
    Opera:以前是presto内核,现在改为Blink内核。
   360浏览器: 兼容模式(trident内核)、极速模式(Blink内核)。

3. 标准模式(Standards Mode)和怪异模式 (Quirks Mode)
在Netscape Navigator和Microsoft Internet Explorer为数不多的浏览器盛行时,他们对网页有不同的实现方式,那个时候的网页都是针对这两个浏览器写的。随着各种浏览器的兴起,加上Web标准的制定,现在的浏览器不能继续使用以前的页面了,所以浏览器引入了标准模式和怪异模式来解决这一问题。

标准模式就是浏览器按照Web标准来渲染页面;为了解决浏览器还是能使用以前写的页面,所以怪异模式就产生了。怪异模式在不同的浏览器显示都是不一样的,因为他们都是按照自己的方式来渲染页面。
我们知道了标准模式和怪异模式,可是浏览器是怎么选择模式来渲染页面的呢?我们经常在页面的开头看到<!DOCTYPE>声明,这是告诉浏览器选择哪个版本的HTML,对于渲染模式的选择,浏览器是根据DTD的声明。如果网页中有DTD标准文档的声明,那浏览器会按照标准模式来渲染网页;如果网页没有DTD声明或者HTML4以下的DTD声明,那浏览器就按照自己的方式渲染页面,页面进入怪异模式。

4. CSS盒模型
盒模型有两种:IE盒模型(图1)、标准的W3C盒模型(图2)。从图1和图2就可以看出,IE盒模型的width包括了border、padding、content,而W3C盒模型的width仅限于content。

在CSS3的属性中,box-sizing可以设置盒模型类型,默认值为content-box,content-box表示W3C盒模型,border-box表示IE盒模型。
在这里插入图片描述
IE
在这里插入图片描述
W3C

5. 重置浏览器样式
不同的浏览器对标签的默认样式值不同,所以我们需要有一套样式表来重置浏览器样式,避免我们写的网页在各个浏览器中造成的显示差异。

http://cssreset.com/,该网站有最流行的CSS重置样式表,可以根据自己的需求复制。
    还有一种标准化方法,跟重置方法有点不一样,它会使浏览器中不一致的地方标准化,而不是重新修改这些地方。

http://necolas.github.io/normalize.css/,该网站提供了normalize.css的样式文件。(好像国内有被墙了,只能FQ了。)
https://github.com/kristerkari/normalize.scss,可以在该页面,下载normalize.scss文件。在写Sass时,无论是normalize.css还是normalize.scss都可以使用,引用到样式表开头即可。

6. HTML语义化
HTML语义化就是页面去掉样式或者加载失败的时候能够让页面呈现出清晰的结构。HTML5新增了好多标签,例如:header、footer、nav、menu、section、article等等,我们单单从字面上理解,就知道标签的含义。在写页面的时候,我们可以直接引用这些标签,不需要再用没有任何含义的div标签了,对于机器可以识别,对于开发人员,很容易明白,这就是HTML语义化。

HTML语义化的好处有:有利于SEO优化,利于被搜索引擎收录,更便于搜索引擎的爬虫程序来识别;便于项目的开发及维护,使HTML代码更具有可读性,便于其他设备解析。

7. CSS选择器优先级

掌握选择器优先级,再也不用!important来到处打补丁。

CSS的基本选择器:

id选择器(用DOM的id申明)
类选择器(用一个样式类名申明)
标签选择器(用HTML标签申明)
属性选择器(用DOM的属性申明)
还有一种添加样式可以在标签上直接添加,属于行内样式。

在这里,我们只做简单说明,以上面几种选择器来排序:行内元素 < id选择器 < 类选择器/属性选择器 < 标签选择器。

8. 双外边距浮动问题
问题出现的浏览器:IE6及其更低的版本

问题描述:任何浮动的元素上的外边距加倍,例如:如果元素设置的外边距为margin-left: 15px,在浏览器里会显示为margin-left: 30px。

解决方法:将元素的display属性设置为inline,因为元素为浮动的,所以这么设置不会影响元素在浏览器的显示。

9. 像素问题
问题出现的浏览器:IE6及其更低的版本

问题描述:两个相邻的div之间有3个像素的空隙,一个div使用了float,而另一个没有使用产生的。

解决方法:A. 对另一个div也使用float;

B. 给浮动的div添加属性margin-right: –3px,但是这样写,在其他浏览器又会不正常,所以我们需要添加IE6的hack,在属性margin-right前在这里插入代码片添加下划线_margin-right: –3px。(IE6以及更低版本的hack,是在属性前面添加下划线_)

10. IE6不支持min-*
问题出现的浏览器:IE6及其更低的版本

问题描述:IE6不支持min-height该属性。即使定义了元素高度,如果内容超过元素的高度,IE6在解析时,会自动延长元素的高度。

解决方法:利用IE6不识别!important,给元素设置固定高度,并且设置元素高度自动。

height: auto !important;
height: 300px;
min-height: 300px;
因为IE6不识别!important,它值识别到height: 300px,当内容超过300px时,它会自动延长高度。

IE7及其其他浏览器都识别!important,虽然定义了height: 300px,但是!important的优先级最高。所以内容超过300px时,还是会自动延长。

11. IE6不支持png-24透明图片
问题出现的浏览器:IE6及其更低的版本

问题描述:在IE6中,使用png-24透明图片,不透明。

解决方法:图片使用gif格式或者png-8格式图片。

12. IE6不能定义1px左右宽度的容器
问题出现的浏览器:IE6

问题描述:创建一个高度为1px的容器,在IE6中没效果。

解决方法:因为行高line-height在IE6下有默认值,设置ling-height: 1px | overflow: hidden | zoom: 0.08。

13. IE5~8不支持opacity
问题出现的浏览器:IE8及其更低的版本

问题描述:IE5~8不支持CSS属性opacity
解决方法:这时可以另外添加ie滤镜alpha,如下:

  opacity: 0.8;
filter: alpha(opacity = 80); /*for IE5~7*/
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(opacity = 80)"; /*for IE8*/

14. Firefox点击链接出现的虚线框
问题出现的浏览器:Firefox浏览器

问题描述:Firefox浏览器在点击链接时,会自动在元素周围添加一个虚线边框。

解决方法:我们为了和其他浏览器保持一致,需要去掉该虚线框,我们可以给a标签设置outline属性,如下:

a {outline: none;}
a:focus {outline: none;}
15. 外边距叠加
问题出现的浏览器:所有浏览器

问题描述:当两个或者更多垂直外边距相遇时,它们将形成一个外边距,这个外边距的高度等于两个发生叠加的外边距的高度中的较大者。

解决方法:这并不是一个浏览器Bug,这是CSS的一个特性,如果想要防止这种情况发生,和padding搭配使用。(要根据实际情况来解决,这里只是简要说明哈~~~)

16. 图片默认间距
问题出现的浏览器:主流浏览器都有此问题

问题描述:几个img标签排列的时候,浏览器都会有默认的间距。

解决方法:为img标签添加属性float。

17. 清除浮动
如果容器中有浮动的元素,容器的高度不能自动延长适应内容的高度,使得内容溢出到容器外而影响页面布局,为了避免这种情况的发生,我们需要用CSS来清除元素的浮动。
一般常用的方法有三种:

    A. 在浮动元素后面添加带有clear属性的空元素

<div>
  <div style="float: left;">left</div>
  <div style="float: right;">right</div>
  <div style="clear: both;"></div>
</div>
    B. 给容器添加属性overflow: hidden或者overflow: auto,在IE6中还需触发haslayout,所以还需添加zoom: 1。

<div style="overflow: auto;*zoom: 1;">
  <div style="float: left;">left</div>
  <div style="float: right;">right</div>
</div>
    C. 使用:after伪元素


<style>
  .clearfix {*zoom: 1;}
  .clearfix:after {content: ".";display: block;height: 0;visibility: hidden;clear: both;}
</style>

<div class="clearfix">
  <div style="float: left;">left</div>
  <div style="float: right;">right</div>
</div>

从面试题的问题角度去理解熟悉
1,浏览器兼容问题加粗样式一:不同浏览器的标签默认的margin和padding不同

问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。

碰到频率:100%

解决方案:

可以使用Normalize来清除默认样式,具体可参考文章:来,让我们谈一谈 Normalize.css

也可以使用如下代码:

body,h1,h2,h3,ul,li,input,div,span,a,form …… { margin:0; padding:0; }

2,浏览器兼容问题二:块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大

问题症状:常见症状是IE6中后面的一块被顶到下一行

碰到频率:90%(稍微复杂点的页面都会碰到,float布局最常见的浏览器兼容问题)

解决方案:在float的标签样式控制中加入 display:inline;将其转化为行内属性

备注:我们最常用的就是div+CSS布局了,而div就是一个典型的块属性标签,横向布局的时候我们通常都是用div float实现的,横向的间距设置如果用margin实现,这就是一个必然会碰到的兼容性问题。

3,浏览器兼容问题三:设置较小高度标签(一般小于10px),在IE6,IE7,遨游中高度超出自己设置高度

问题症状:IE6、7和遨游里这个标签的高度不受控制,超出自己设置的高度

碰到频率:60%

解决方案:给超出高度的标签设置overflow:hidden;或者设置行高line-height 小于你设置的高度。

备注:这种情况一般出现在我们设置小圆角背景的标签里。出现这个问题的原因是IE8之前的浏览器都会给标签一个最小默认的行高的高度。即使你的标签是空的,这个标签的高度还是会达到默认的行高。

4,浏览器兼容问题四:行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,IE6间距bug

问题症状:IE6里的间距比超过设置的间距

碰到几率:20%

解决方案:在display:block;后面加入display:inline;display:table;

备注:行内属性标签,为了设置宽高,我们需要设置display:block;(除了input/img标签比较特殊)。在用float布局并有横向的margin后,在IE6下,他就具有了块属性float后的横向margin的bug。不过因为它本身就是行内属性标签,所以我们再加上display:inline的话,它的高宽就不可设了。这时候我们还需要在display:inline后面加入display:talbe。

5,浏览器兼容问题五:图片默认有间距

问题症状:几个img标签放在一起的时候,有些浏览器会有默认的间距,通配符清除间距也不起作用。

碰到几率:20%

解决方案:使用float属性为img布局

备注:因为img标签是行内属性标签,所以只要不超出容器宽度,img标签都会排在一行里,但是部分浏览器的img标签之间会有个间距。去掉这个间距使用float是正道。(也可使用负margin,虽然能解决,但负margin本身就是容易引起浏览器兼容问题的用法,所以尽量不要使用)

6,浏览器兼容问题六:标签最低高度设置min-height不兼容

问题症状:因为min-height本身就是一个不兼容的CSS属性,所以设置min-height时不能很好的被各个浏览器兼容

碰到几率:5%

解决方案:如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;}

备注:在B/S系统前端开发时,有很多情况下我们有这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。

7,浏览器兼容问题七:各种特殊样式的兼容,比如透明度、圆角、阴影等。特殊样式每个浏览器的代码区别很大,所以,只能现查资料通过给不同浏览器写不同的代码来解决。

8,清除浮动:

   .clearfix::after {
        content: "";
        display: table;
        clear: both;
    }

.clearfix {
    *zoom: 1;
}

9,盒模型

Element {
        box-sizing: border-box;
        /*box-sizing: content-box;*/
    }

/* CSS hack*/

我很少使用hacker的,可能是个人习惯吧,我不喜欢写的代码IE不兼容,然后用hack来解决。不过hacker还是非常好用的。使用hacker我可以把浏览器分为3类:IE6 ;IE7和遨游;其他(IE8 chrome ff safari opera等)

◆IE6认识的hacker 是下划线_ 和星号 *

◆IE7 遨游认识的hacker是星号 *

比如这样一个CSS设置:

div { height: 300px; height: 200px; _height:100px; }
IE6浏览器在读到height:300px的时候会认为高时300px;继续往下读,他也认识
heihgt, 所以当IE6读到*height:200px的时候会覆盖掉前一条的相冲突设置,认为高度是200px。继续往下读,IE6还认识_height,所以他又会覆盖掉200px高的设置,把高度设置为100px;

IE7和遨游也是一样的从高度300px的设置往下读。当它们读到*height200px的时候就停下了,因为它们不认识_height。所以它们会把高度解析为200px,剩下的浏览器只认识第一个height:300px;所以他们会把高度解析为300px。因为优先级相同且想冲突的属性设置后一个会覆盖掉前一个,所以书写的次序是很重要的。

做兼容页面的方法是:每写一小段代码(布局中的一行或者一块)我们都要在不同的浏览器中看是否兼容,当然熟练到一定的程度就没这么麻烦了。建议经常会碰到兼容性问题的新手使用。很多兼容性问题都是因为浏览器对标签的默认属性解析不同造成的,只要我们稍加设置都能轻松地解决这些兼容问题。如果我们熟悉标签的默认属性的话,就能很好的理解为什么会出现兼容问题以及怎么去解决这些兼容问题。

实战是解决问题的最佳途径,也是遇到问题的唯一途径,大家多多亲自制作才能更快更好的成长,另外多去借鉴别人的经验也是进步的捷径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值