H5页面适配全部iPhone和安卓机型的六个技巧

一、viewport 简单粗暴的方式:css

<meta name="viewport" content="width=320,maximum-scale=1.3,user-scalable=no">

直接设置viewport为320px的1.3倍,将页面放大1.3倍。html

为何是1.3?前端

目前大部分页面都是以320px为基准的布局,而iphone6的宽度比是375/320 = 1.171875,iphone6+则是 414/320 = 1.29375那么以1.29倍也就约等于1.3了。
二、ip6+ 的CSS media queryandroid

@media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){
  /*iphone 6*/
}

@media (min-device-width : 414px) and (max-device-width : 736px) and (-webkit-min-device-pixel-ratio : 3){
  /*iphone 6 plus*/
}

PS: 也能够直接使用实际的device-width:如 device-width : 375pxios

在原有页面的基础上,再针对相应的屏幕大小单独写样式作适配。
三、REM布局web

REM是CSS3新增的一种单位,而且移动端的支持度很高,android2.x+,ios5+ 都支持。REM是相对于dom结构的根元素来设置大小,也就是html这个元素。相较于em单位,rem使用上更容易理解及运用。chrome

REM与PX的换算能够查看网址: https://offroadcode.com/prototypes/rem-calculator/浏览器

假设,html咱们设置font-size:12px; 也就是说12px相对于1rem,那么18px也就是 18/12 = 1.5rem。dom

那么咱们以320px的设计布局为基准,将html设置为font-size:100px,即100px = 1rem。(设置100px是为了方便计算)那么能够将大部分px单位除以100就能够直接改为rem单位了。iphone

REM如何作响应式布局?

 

一、若是仅仅是适配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;}
}

这样,在ip6下,也就将页面内的元素放大了1.17倍,ip6+下也就是放大了1.29倍。

 

二、若是是彻底自适应,那么能够经过JS来控制。

(function (doc, win) {
  var docEl = doc.documentElement,
    resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
    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);
  doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

页面初始化的时候计算font-size,而后再绑定resize事件。这种效果就和百分比布局同样了。

那么用REM作单位与百分比作单位有什么优点?

主要优点在于能更好的控制元素大小。(通常百分比应用在布局层,通常常见设置为50%,33.3%,25%之类的整数居多,难以运用在复杂的页面小部件内)。可是相比百分比布局,须要借助JS或media query实现,略有一点瑕疵。

 

四、图片自适应

刚说完REM布局,那么用百分比布局也能实现同样的效果,可是用百分比布局,必需要面临一个问题:图片宽度100%,页面加载时会存在高度塌陷的问题。.

如图:页面加载时图片高度默认不存在。

那么能够用padding-top设置百分比值来实现自适应。

公式以下:

padding-top = (Image Height / Image Width) * 100%

原理:padding-top值为百分比时,取值是是相对于宽度的。

相关代码实现:

<div class="cover">
    <img src="http://g.ald.alicdn.com/bao/uploaded/i1/TB1d6QqGpXXXXbKXXXXXXXXXXXX_!!0-item_pic.jpg_160x160q90.jpg" alt=""/>
</div>
.cover{position: relative; padding-top: 100%; height: 0; overflow: hidden;}
.cover img{position: absolute; top: 0; width: 100%;}

 

五、图片高清化

你们都知道,iphone6 plus 是3倍高清图了,它的devicePixelRatio = 3。

关于DPR的介绍能够查看这篇文章《 设备像素比devicePixelRatio简单介绍 》

在ios8下,已经开始支持img的 srcset 属性了(目前移动端也就ios8开始支持),也就是说,能够对一张图片设置2个URL,浏览器自动加载对应的图片。

 

 

黄色表示仅支持旧的srcset规范,绿色表示支持全新的srcset规范,包括sizes属性,w描述符。 这里不展开,详细了解可自行google。

以下DEMO,请切换devicePixelRatio值进行查看:

 

不过目前前端这边图片的实现基本都用lazyload的方式实现。srcset的图片加载方式在实际项目中运用还比较少。

 

 

六、背景图高清化

media query 实现高清化

img标签的高清化,能够经过JS判断devicePixelRatio的值来加载不一样尺寸的图片,可是对于背景图,写在CSS中的,用JS来判断就略麻烦了,还好CSS经过media query也能判断dpr。

目前兼容性最好的背景图高清化实现方式,使用media query的 -webkit-min-device-pixel-ratio 作判断:

/* 普通显示屏(设备像素比例小于等于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);
      }
  }

进一步,能够经过工具生成相应的3x,2x,1x的图片及css,在使用时直接引用便可。谁搞一个?

关于移动设备的 -webkit-min-device-pixel-ratio 值,能够查看该网页的整理: http://bjango.com/articles/min-device-pixel-ratio/

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 实现有什么区别及好处?

这篇文章里面作了很详细的阐述,你们能够看看:http://blog.cloudfour.com/safari-6-and-chrome-21-add-image-set-to-support-retina-images/

 

大致的意思是:image-set不须要告诉浏览器使用什么图像,而是直接提供了图像让浏览器选择。这就意味着,若是在低网速下,浏览器能够选择加载低分辨率的图片。(PS:好智能的样子)

可是相好比media query的实现,image-set仅支持单个图片的高清化,不适合在css sprite下使用。 而且兼容性也是一大硬伤。

通常来讲,用在LOGO区域,单个图片图标的区域下,也是个不错的选择。

 

关于图片列表适配,也就是要让布局更灵活,在电商网站里面,商品列表是一个很是常见的结构。一种比较智能的列表方式是:两端对齐,间距自适应。

那么可使用FLEXBOX布局来实现两端对齐的效果,也可使用 text-align:justify 的方式实现。

具体实现办法:http://www.ghugo.com/inline-block-justify/

相关文章
相关标签/搜索