css移动端的兼容性问题 (适配问题)

css移动端的兼容性问题 (适配问题)

一、浮动问题
简述:
我们在平时切页面时,经常会出现用完浮动(float),忘记删除.下面的布局出现莫名其妙的空白高度,导致布局调整失败

1、1.父级div定义height
    原理:父级div手动定义height,就解决了父级div无法自动获取到高度问题
    优点:简单,代码少,容易掌握
    缺点:只适合高度固定的不惧,要给出精确的高度,如果高度和父级div不一样
2.结尾处加空div标签clear:both
    原理:添加一个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度
    
    优点:简单,代码少,浏览器支持好,不容易出现怪问题
    缺点:不少初学者不理解原理;如果页面浮动布局多,就要增加很多空div,让人感觉很不爽
    
3.父级div定义伪类:after和zoom
    原理:IE8以上和非IE浏览器才支持:after,原理和方法2有点类似,zoom(IE转有属性)可解决ie6,ie7浮动问题
    优点:浏览器支持好,不容易出现怪问题(目前:大型网站都有使用,如:腾迅,网易,新浪等等)
    缺点:代码多,不少初学者不理解原理,要两句代码结合使用,才能让主流浏览器都支持
4.父级div定义overflow:hidden
    原理:必须定义width或zoom:1,同时不能定义height,使用overflow:hidden时,浏览器会自动检查浮动区域的高度
    
    优点:简单,代码少,浏览器支持好
    缺点:不能和position配合使用,因为超出的尺寸的会被隐藏(只推荐没有使用position或对overflow:hidden理解比较深的朋友使用)

5、5.父级div定义overflow:auto
    原理:必须定义width或zoom:1,同时不能定义height,使用overflow:auto时,浏览器会自动检查浮动区域的高度
    
    优点:简单,代码少,浏览器支持好
    
    缺点:内部宽高超过父级div时,会出现滚动条。
    
6.父级div也一起浮动

    原理:所有代码一起浮动,就变成了一个整体
    
    优点:没有优点
    
    缺点:会产生新的浮动问题。
    
7.父级div定义display:table

    原理:将div属性变成表格
    
    优点:没有优点
    
    缺点:会产生新的未知问题
    
8.结尾处加br标签clear:both
    原理:父级div定义zoom:1来解决IE浮动问题,结尾处加br标签clear:both

避免使用浮动

1.表格布局

2.使用display:inline-block
    IE6/7不支持display:inline-block属性,只是可以让标签有类似于inline-block的属性.使用text-align:justify;做测试的时候的一些样式表现证实了:确实IE6/7是不支持display:inline-block属性,只是让其表现的跟inline-block一样,对于inline水平的元素,其表现度可以用perfect一词来形容了

所以拿li举例 ul{display:inline-block;} li{display:inline;}

3.一点小阻挠:inline-block元素间的换行符空格间隙问题
    可在父级元素样式下写font-size:0; 子级元素各自给特定的font-size
    letter-spacing可以尝试给负值来解决.但是,Opera浏览器下极限是间隙1像素,0像素会反弹,换行符间隙还原
4.更进一步:更加灵活的inline-block列表布局

    使用text-align:justify可以实现自动等宽水平排列的列表布局,而且是两端对齐的,不需要计算宽度,一切都是浏览器自动的,很方便很强大。
                    
5、详细教程(http://www.zhangxinxu.com/wordpress/2010/11/拜拜了浮动布局-基于displayinline-block的列表布局/)

二、
链接:http://blog.csdn.net/chenmoquan/article/details/41547609
1、水平居中—使用 text-align
2、margin: auto 居中
3、table-cell 居中
4、Absolute 居中
5、使用 translate 居中
6、使用 Flexbox 居中
7、使用 calc 居中

三、常见的兼容性问题

    1、常见的问题:height设置100%没有高度,但是有宽度
    2、造成这个现象的原因是:浏览器解析规则引发的高度自适应问题

兼容问题主要存在:
    IE和FireFox浏览器的常见问题margin,padding,box-sizing
    *{margin:0;padding:0;box-sizing:border-box;}
    IE的不兼容问题(比如一些标签video,audio等标签)
    <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]-->
    <!--[if IE]> 所有的IE可识别 <![endif]-->
    <!--[if IE 6]> 仅IE6可识别 <![endif]-->
    <!--[if lt IE 6]> IE6以及IE6以下版本可识别 <![endif]-->
    <!--[if gte IE 6]> IE6以及IE6以上版本可识别 <![endif]-->
    <!--[if IE 7]> 仅IE7可识别 <![endif]-->
    <!--[if lt IE 7]> IE7以及IE7以下版本可识别 <![endif]-->
    <!--[if gte IE 7]> IE7以及IE7以上版本可识别 <![endif]-->
    <!--[if IE 8]> 仅IE8可识别 <![endif]-->
    <!--[if IE 9]> 仅IE9可识别 <![endif]-->

四、css hack

1、hack的利弊
    一般情况下,我们尽量避免使用CSShack,但是有些情况为了顾及用户体验实现向下兼容,不得已才使用hack。比如由于IE8及以下版本不支持CSS3,而我们的项目页面使用了大量CSS3新属性在IE9/Firefox/Chrome下正常渲染,这种情况下如果不使用css3pie或htc或条件注释等方法时,可能就得让IE8-的专属hack出马了。使用hack虽然对页面表现的一致性有好处,但过多的滥用会造成html文档混乱不堪,增加管理和维护的负担。相信只要大家一起努力,少用、慎用hack,未来一定会促使浏览器厂商的标准越来越趋于统一,顺利过渡到标准浏览器的主流时代。抛弃那些陈旧的IE hack,必将减轻我们编码的复杂度,少做无用功。
    
2、hack的方式     Hack主要针对IE浏览器
    CSS hack方式一:条件注释法
    CSS hack方式二:类内属性前缀法
    CSS hack方式三:选择器前缀法

五、css filter

1、!important

        css !important作用是提高指定CSS样式规则的应用优先权。
        !important是CSS1就定义的语法,作用是提高指定样式规则的应用优先权。语法格式{ cssRule !important },即写在定义的最后面,例如:box{color:red !important;}
        在CSS中,通过对某一样式声明! important ,可以更改默认的CSS样式优先级规则,使该条样式属性声明具有最高优先级,也就是相当于写在最下面。

        但是跟CSS3动画不一样
        -webkit-
        -ms-
        -o-
        -ff-
        no prefix

六、更换渲染模式

1、IE 兼容模式
    Bootstrap中不支持 IE 古老的兼容模式。为了让 IE 浏览器运行最新的渲染模式下,建议将此 <meta> 标签加入到你的页面中:
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
2、国产浏览器高速模式
    国内浏览器厂商一般都支持兼容模式(即 IE 内核)和高速模式(即 webkit 内核),不幸的是,所有国产浏览器都是默认使用兼容模式,这就造成由于低版本 IE (IE8 及以下)内核让基于 Bootstrap 构建的网站展现效果很糟糕的情况。幸运的是,国内浏览器厂商逐渐意识到了这一点,某些厂商已经开始有所作为了!

3、将下面的 <meta> 标签加入到页面中,可以让部分国产浏览器默认采用高速模式渲染页面:
        <meta name="renderer" content="webkit">

七、浏览器内核

1、IE: trident内核
   Firefox:gecko内核
   Safari:webkit内核
   Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核
   Chrome:Blink(基于webkit,Google与Opera Software共同开发)

2、浏览器内核对于浏览器而言,是基础,是依托。如果没有了浏览器内核,那么浏览器是无法独立存在且产生作用的。其实浏览器内核学名叫做渲染引擎,起到的作用就是显示网页。它的存在,决定了网页的呈现的内容、格式以及效果。所以说,一个好的浏览器,一定是基于有一个稳定、高端、作用明显的浏览器内核的。
3、WebKit内核,它是目前应用范围最大的开源内核,新出的X5内核也同样是依托于WebKit的基础上,对其进行深度的开发和拓展才形成的。目前应用于各大主流浏览器,包括AppleSafari(苹果浏览器)Android自带浏览器、Symbian手机浏览器等。Firefox内核,同样也是开源内核,但是它的应用范围相对来说就要小不少了。同时还有IE内核,它的存在已经有了一定的历史,但是由于存在较严重的安全问题,渐渐被取代。

八、让H5页面适应所有的iphone手机以及安卓机型的六大技巧

1、兼容iphone各版本机型最佳的方式就是自适应

2、viewport 简单粗暴的方式:
        <meta name="viewport" content="width=320,maximum-scale=1.3,user-scalable=no">
3、为什么是1.3?
    目前大部分页面都是以320px为基准的布局,而iphone6的宽度比是375/320 = 1.171875,iphone6+则是 414/320 = 1.29375那么以1.29倍也就约等于1.3了。
    为了让手机也能获得良好的网页浏览体验,Apple找到了一个办法:在移动版(iOS)的Safari中定义了viewport meta标签①,它的作用就是创建一个虚拟的窗口(viewport),而且这个虚拟窗口的分辨率接近于桌面显示器,Apple将其定位为980px②。以一代iphone下的Safari来说就是:
        viewport全部属性&值如下:
        
        width: viewport宽度
        
        height: viewport高度
        
        initial-scale: 初始缩放比例
        
        maximum-scale: 最大缩放比例
        
        minimum-scale: 最小缩放比例
        
        user-scalable: 是否允许用户缩放例:width=960 或 device-width
        
        height=1000 或 device-height
        
        initial-scale=0.5
        
        maximum-scale=2
        
        minimum-scale=1
        
        user-scalable=1 或 0 (yes 或 no)layout viewport的默认值在Apple实现viewport后,其他浏览器也加入了对viewport meta的支持,但彼此间还是有些差异,差异最大的是layout viewport的表现:Safari iPhone: 980px
        Opera: 850px
        Android WebKit: 800px
    IE:                 974px最后关注下width=device-width其实这个属性&值很有意思,字面意应该是viewport宽度等于设备宽度,但在实际中不同的浏览器都给出了个定值:320px;这个值还是源于 Apple,因为早期iphone的分辨率为320px × 480px,大量为iphone量身定制的网站都设置了viewport:width=device-width,并且按照宽度320px来设计制作,所 以其他浏览器加入viewport支持时为了兼容性也将device-width定义为了320px。注解① 除此之外不同移动浏览器厂商也有不同的解决方案,例如UCweb就是使用中间件技术

九、REM 布局

1、REM布局
    REM是CSS3新增的一种单位,并且移动端的支持度很高,android2.x+,ios5+ 都支持。REM是相对于dom结构的根元素来设置大小,也就是html这个元素。相较于em单位,rem使用上更容易理解及运用。
    REM与PX的换算可以查看网址: https://offroadcode.com/prototypes/rem-calculator/
    假设,html我们设置font-size:12px; 也就是说12px相对于1rem,那么18px也就是 18/12 = 1.5rem。
    那么我们以320px的设计布局为基准,将html设置为font-size:100px,即100px = 1rem。(设置100px是为了方便计算)那么可以将大部分px单位除以100就可以直接改成rem单位了。
    
    REM如何做响应式布局?
    
2、如果仅仅是适配ip6+设备,那么使用media query就行
    伪代码如下:
        /*320px布局*/
        
        html{font-size: 100px;}
        body{font-size: 0.14rem /*实际相当于14px*/}

        /* iphone 6 */
        
        @media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){
            html{font-size: 117.1875px;}
        }
        
        /* iphone6 plus */
        
        @media (min-device-width : 414px) and (max-device-width : 736px) and (-webkit-min-device-pixel-ratio : 3){
            html{font-size: 129.375px;}
        }
3、如果是完全自适应,那么可以通过JS来控制

    (function (doc, win) {
    
        var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',

        /*recalc重新计算*/
        recalc = function () {
        
             var clientWidth = docEl.clientWidth;
             if (!clientWidth) return;
            docEl.style.fontSize = 100 * (clientWidth / 320) + 'px';
         };

        // Abort if browser does not support addEventListener
        if (!doc.addEventListener) return;
        win.addEventListener(resizeEvt, recalc, false); //false由里向外
        doc.addEventListener('DOMContentLoaded', recalc, false);
    })(document, window);

4、图片自适应
    REM布局,那么用百分比布局也能实现一样的效果,但是用百分比布局,必须要面临一个问题:图片宽度100%,页面加载时会存在高度塌陷的问题
    那么可以用padding-top设置百分比值来实现自适应。
    公式如下:
        padding-top = (Image Height / Image Width) * 100%
    原理:padding-top值为百分比时,取值是是相对于宽度的。
    .cover{position: relative; padding-top: 100%; height: 0; overflow: hidden;}
    .cover img{position: absolute; top: 0; width: 100%;}
5、图片高清化
    设备像素比问题
    <img src="small.jpg" srcset="small.jpg 640w 1x, small-hd.jpg 640w 2x, large.jpg 1x, large-hd.jpg 2x"> 
    不过目前前端这边图片的实现基本都用lazyload的方式实现。srcset的图片加载方式在实际项目中运用还比较少。
6、背景图高清化
    media query 实现高清化
    img标签的高清化,可以通过JS判断devicePixelRatio的值来加载不同尺寸的图片,但是对于背景图,写在CSS中的,用JS来判断就略麻烦了,还好CSS通过media query也能判断dpr。
    目前兼容性最好的背景图高清化实现方式,使用media query的 -webkit-min-device-pixel-ratio 做判断:(代码见下页)

7、/* 普通显示屏(设备像素比例小于等于1)使用1倍的图 */
  .css{
      background-image: url(img_1x.png);
  }

  /* 高清显示屏(设备像素比例大于等于2)使用2倍图  */
  @media only screen and (-webkit-min-device-pixel-ratio:2){
      .css{
    background-image: url(img_2x.png);
      }
  }

 /* 高清显示屏(设备像素比例大于等于3)使用3倍图  */
  @media only screen and (-webkit-min-device-pixel-ratio:3){
      .css{
    background-image: url(img_3x.png);
      }
  }
详细的各种机型和对应的-webkit-min-device-pixel-ratio 值

8、image-set 实现高清化
image-set,它是Webkit的私有属性,也是Css4的一个属性,它是为了解决Retina屏幕下的图像显示而生。
使用方式也很简单。伪代码如下:
    .css {
      background-image: url(1x.png);    /*不支持image-set的情况下显示*/
      background: -webkit-image-set(
            url(1x.png) 1x,/* 支持image-set的浏览器的[普通屏幕]下 */
            url(2x.png) 2x,/* 支持image-set的浏览器的[2倍Retina屏幕] */
            url(3x.png) 3x/* 支持image-set的浏览器的[3倍Retina屏幕] */
            );
     }
目前移动端的支持程度来看,ios7+,android 4.4+ 下已经支持了。如果仅仅是做ip6+的高清适配方案。 image-set 也是一种实现方案。

使用image-set 与 media query 实现有什么区别及好处?
image-set不需要告诉浏览器使用什么图像,而是直接提供了图像让浏览器选择。这就意味着,如果在低网速下,浏览器可以选择加载低分辨率的图片。(PS:好智能的样子)
但是相比如media query的实现,image-set仅支持单个图片的高清化,不适合在css sprite下使用。 并且兼容性也是一大硬伤。
一般来说,用在LOGO区域,单个图片图标的区域下,也是个不错的选择。


9、关于图片列表适配
    也就是要让布局更灵活,在电商网站里面,商品列表是一个非常常见的结构。一种比较智能的列表方式是:两端对齐,间距自适应。(圣杯布局)
    那么可以使用FLEXBOX布局来实现两端对齐的效果,也可以使用 text-align:justify 的方式实现。
    具体实现办法:http://www.ghugo.com/inline-block-justify/
    
css4新增选择器:  http://css4-selectors.com/selectors/

技术博客推荐: http://www.zhangxinxu.com/wordpress/category/js/

阿里矢量图标库:    http://iconfont.cn/

码云:     http://git.oschina.net/

github:     http://www.github.com/

stackoverflow:  http://stackoverflow.com/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,744评论 1 92
  • 1.移动端开发视窗口的添加 h5端开发下面这段话是必须配置的 meta name="viewport" conte...
    在风口阅读 797评论 0 9
  • display: none; 与 visibility: hidden; 的区别 联系:它们都能让元素不可见 区别...
    纹小艾阅读 1,425评论 0 1
  • 透过朝西的窗户,看到两组高耸的铁塔。右边一组立于武吉知马山顶; 左边一组立于武吉巴督山顶。高高的铁塔给新加坡过于丘...
    少一帅阅读 557评论 0 0
  • 路尽霞残夜漫江。江波浩浩思茫茫。 愁心窗下随流水,旅迹天涯踏晚霜。 春故事,梦回廊。曾经谁与说昏黄。 檐灯不解孤眠...
    蓦山磎阅读 614评论 5 6