美文网首页
浏览器兼容

浏览器兼容

作者: Eazer | 来源:发表于2017-06-21 22:26 被阅读0次

1.什么是 CSS hack?

  • 由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果
  • CSS hack的目的就是使你的CSS代码兼容不同的浏览器。当然,我们也可以反过来利用CSS hack为不同版本的浏览器定制编写不同的CSS效果

2.谈一谈浏览器兼容的思路

  • 要不要做
    • 产品的角度(产品的受众、受众的浏览器比例、效果优先还是基本功能优先)
    • 成本的角度 (有无必要做某件事)
  • 做到什么程度
    • 让哪些浏览器支持哪些效果
  • 如何做
    • 根据兼容需求选择技术框架/库(jquery)
    • 根据兼容需求选择兼容工具(html5shiv.js、respond.js、css reset、normalize.css、Modernizr)
      postCSS
    • 条件注释、CSS Hack、js 能力检测做一些修补

3.列举5种以上浏览器兼容的写法

1.属性前缀法
例如 IE6能识别下划线""和星号" * ",IE7能识别星号" * ",但不能识别下划线"",IE6~IE10都认识"\9",但firefox前述三个都不能认识

.box{
  color: red;
  _color: blue; /*ie6*/
  *color: pink; /*ie67*/
  color: yellow\9;  /*ie/edge 6-8*/
}

2.选择器前缀法

*html *前缀只对IE6生效
*+html *+前缀只对IE7生效
@media screen\9{...}只对IE6/7生效
@media \0screen {body { background: red; }}只对IE8有效
@media \0screen\,screen\9{body { background: blue; }}只对IE6/7/8有效
@media screen\0 {body { background: green; }} 只对IE8/9/10有效
@media screen and (min-width:0\0) {body { background: gray; }} 只对IE9/10有效
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {body { background: orange; }} 只对IE10有效

3.条件注释
条件注释 (conditional comment) 是于HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。

<!--[if !IE]><!-->
<script>alert(1);</script>
<!--<![endif]-->
<!--[if IE 8]>
<link href="ie8only.css" rel="stylesheet">
<![endif]-->

使用了条件注释的页面在 Windows Internet Explorer 9 中可正常工作,但在 Internet Explorer 10 中无法正常工作。

4.属性兼容的方式

inline-block: >=ie8
min-width/min-height: >=ie8
:before,:after: >=ie8
div:hover: >=ie7
inline-block: >=ie8
background-size: >=ie9
圆角: >= ie9
阴影: >= ie9
动画/渐变: >= ie10

5.使用兼容框架

Bootstrap (>=ie8)
jQuery 1.~ (>=ie6), jQuery 2.~ (>=ie9)
Vue (>= ie9)

6.利用和兼容相关的开发工具

  • html5shiv.js
  • respond.js
  • css reset
  • normalize.css
  • Modernizr

举例Modernizr:首先你下载完你自定义的脚本以后,你就可以像引用普通js文件一样引用它了,然后就可以用了。

<script src="Scripts/Modernizr.js" type="text/javascript"></script>

运行的时候它会在html元素上添加一批CSS的class名称,这些class名称标记当前浏览器支持哪些特性和不支持哪些特性,支持的特性就直接显示该天特性的名称作为一个class(例如:canvas,websockets),不支持的特性显示的class是“no-特性名称”(例如:no-flexbox)。下面这段代码是运行在Chrome下的效果:

<html class=" js flexbox canvas canvastext webgl no-touch geolocation postmessage 
          websqldatabase indexeddb hashchange history draganddrop websockets 
    rgba hsla multiplebgs backgroundsize borderimage borderradius 
    boxshadow textshadow opacity cssanimations csscolumns cssgradients
    cssreflections csstransforms csstransforms3d csstransitions fontface 
     generatedcontent video audio localstorage sessionstorage webworkers 
          applicationcache svg inlinesvg smil svgclippaths">

而在IE9里的效果是:

<html class=" js no-flexbox canvas canvastext no-webgl no-touch geolocation 
      postmessage no-websqldatabase no-indexeddb hashchange no-history 
    draganddrop no-websockets rgba hsla multiplebgs backgroundsize 
    no-borderimage borderradius boxshadow no-textshadow opacity 
    no-cssanimations no-csscolumns no-cssgradients no-cssreflections
    csstransforms no-csstransforms3d no-csstransitions fontface 
    generatedcontent video audio localstorage sessionstorage 
    no-webworkers no-applicationcache svg inlinesvg smil svgclippaths">

你还可以结合HTML5/CSS3特性一起使用

你可以直接使用Modernizr在元素里生成的class名称,在你的css文件里定义相应的属性以便支持当前浏览器。例如,下面的代码属性,在支持shadow阴影的浏览器显示shadow,不支持的浏览器显示标准的边框:

.boxshadow #MyContainer {
border: none;
-webkit-box-shadow: #666 1px 1px 1px;
-moz-box-shadow: #666 1px 1px 1px;
}

.no-boxshadow #MyContainer {
border: 2px solid black;
}

因为如果浏览器支持box-shadows的话,Modernizr就会将boxshadow class添加到元素,然后你可以将它管理到一个相应的div的id上。如果不支持,Modernizr就会将no-boxshadow class添加到元素,这样显示的就是一个标准的边框。这样我们就可以很方便地在支持CSS3特性的浏览器上使用CSS3新功能,不支持的浏览器上继续使用以前的方式。

4.以下工具/名词是做什么的

  • 条件注释
    条件注释 (conditional comment) 是于HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。
    适用于优雅降级向下兼容,使其兼容IE6 IE7 IE8
  • IE Hack
    针对不同的浏览器去写不同的CSS,让它能在不同的浏览器中也能得到我们想要的页面效果,主要有
    1 属性前缀法
    利用不同浏览器的bug来识别浏览器,然后对该浏览器加入样式
    如IE6能识别下划线"_和星号" ",IE7能识别星号" ",但不能识别下划线"",IE6~IE10都认识"\9"
    2 选择器前缀法
    3 IE条件注释法
  • js 能力检测能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力。使用这种方式无需顾及浏览器如何如何,只需确定浏览器是否支持特定的能力,就可以给出相关的方案。
  • html5shiv.js解决IE6 7 8 Safari 4.x (iPhone 3.x) 以及Firefox 3.x不支持html5的新特性和新标签问题
  • respond.js在IE6 7 8上模拟CSS3的媒体查询功能
  • css reset通过CSS重置浏览器默认样式
  • normalize.css
    Normalize.css是一种CSS reset的替代方案,是温和版的CSS reset。在默认的HTML元素样式上提供了跨浏览器的高度一致性。
    保护有用的浏览器默认样式而不是完全去掉它们
    为大部分HTML元素提供统一化样式
    修复了常见的桌面端和移动端浏览器的bug并保证各浏览器的一致性
    用一些小技巧优化CSS可用性
    用注释和详细的文档来解释代码
  • Modernizr浏览器功能检测以确定浏览器是否支持各种html5和css3特性,引用Modernizr生效之后,它会给html元素添加一批css的class名称,这些class名称标记当前浏览器支持哪些特性和不支持哪些特性,支持的特性就直接显示该天特性的名称作为一个class(例如:canvas,websockets),不支持的特性显示的class是“no-特性名称”(例如:no-flexbox)。
  • postCSSPostCSS 本身是一个工具。它提供了一种方式用 JavaScript 代码来处理 CSS。它负责把 CSS 代码解析成抽象语法树结构(Abstract Syntax Tree,AST),再交由插件来进行处理。插件基于 CSS 代码的 AST 所能进行的操作是多种多样的,比如可以支持变量和混入(mixin),增加浏览器相关的声明前缀,或是把使用将来的 CSS 规范的样式规则转译(transpile)成当前的 CSS 规范支持的格式。从这个角度来说,PostCSS 的强大之处在于其不断发展的插件体系。

相关文章

  • 浏览器前缀 js输出

    浏览器前缀 -ms- 兼容IE浏览器-moz- 兼容firefox-o- 兼容opera-webkit- 兼容ch...

  • 浏览器前缀js输出

    浏览器前缀-ms- 兼容IE浏览器-moz- 兼容firefox-o- 兼容opera-webkit- 兼容chr...

  • 浏览器前缀 js输出

    浏览器前缀 -ms- 兼容IE浏览器-moz- 兼容firefox-o- 兼容opera-webkit- 兼容ch...

  • 浏览器前缀 js输出

    浏览器前缀 -ms- 兼容IE浏览器-moz- 兼容firefox-o- 兼容opera-webkit- 兼容ch...

  • ESModule 浏览器兼容性

    import 浏览器兼容性 export 浏览器兼容性

  • 浏览器前缀,js简介

    浏览器前缀用于兼容流里流气 -ms- 兼容IE浏览器 -moz- 兼容firefox -o- 兼容opera -w...

  • 2019-06-05

    css浏览器前缀: -ms- 兼容IE浏览器; -moz- 兼容firefox -o- 兼容opera, -web...

  • 常见浏览器兼容问题及解决

    一、什么是浏览器兼容问题所谓浏览器兼容问题就是指不同浏览器或同种浏览器不同版本对相同代码解析效果不同,浏览器兼容问...

  • 浏览器常见的兼容问题

    什么是浏览器的兼容问题 浏览器的兼容性问题也就是网页的兼容性或者网站兼容性问题, 指网页在各种浏览器上的cs...

  • CSS浏览器前缀

    浏览器样式前缀 为了让CSS3样式兼容,需要将某些样式加上浏览器前缀: -ms- 兼容IE浏览器 -moz- 兼容...

网友评论

      本文标题:浏览器兼容

      本文链接:https://www.haomeiwen.com/subject/nbxxcxtx.html