移动端响应式设计笔记

5、Media(媒体查询器)、@media

Media(媒体查询器),是响应式设计的核心CSS技术

所有参数汇总:

  • width:浏览器可视宽度。

  • height:浏览器可视高度。

  • device-width:设备屏幕的宽度。(例如:"width=device-width")

  • device-height:设备屏幕的高度。

  • orientation:检测设备目前处于横向还是纵向状态。

  • aspect-ratio:检测浏览器可视宽度和高度的比例。(例如:aspect-ratio: 16/9)

  • device-aspect-ratio:检测设备的宽度和高度的比例。

  • color:检测颜色的位数。(例如:min-color: 32就会检测设备是否拥有32位颜色)

  • color-index:检查设备颜色索引表中的颜色,值不能是负数。

  • resolution:检测屏幕或打印机的分辨率。(例如:min-resolution: 300dpi或min-resolution: 118dpcm)

  • grid:检测输出的设备是网格的还是位图设备。

  • monochrome:检测单色楨缓冲区域中的每个像素的位数。(这个太高级,也很少会用到)

首先,我们要使用Media需要先在html页面添加如下代码来兼容移动设备的展示效果

1 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

参数解析:

①width=device-width:宽度等于当前设备的宽度

②initial-scale=1.0:初始缩放比例默认为1.0

🌂minimum-scale:允许用户缩放到的最小比例(默认设置为1.0),maximum-scale:允许用户缩放到的最大比例(默认设置为1.0)  

④user-scalable:用户是否可以手动缩放,一般不希望用户放大缩小页面

 

其次,需要加载兼容文件,因为IE8既不支持HTML5也不支持CSS3 Media,加载两个js文件保证能实现兼容效果

1 <!--[if lt IE 9]>
2   <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
3   <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
4 <![endif]-->

 

最后,我们可以在css文件里面使用@media来进行响应式编程

1 @media screen and (max-width: 960px){
2     body{
3         background: #000;
4     }
5 }

代码解析:

max-width: 960px:当页面小于960px的时候执行以下css样式代码

screen:告知设备在打印页面时使用衬线字体,在屏幕上显示无衬线字体,目前很多网站会直接省略该值,因为很少需要用户打印

所以往往为

1 @media (max-width: 960px){
2     body{
3         background: #000;
4     }
5 }

 

拓展:

1、实现等于960px尺寸、大于或者大于小于

/* 等于960px*/
@media (max-device-width:960px){
    body{
        background:red;
    }
}

/* 大于960px */
@media (min-width:960px){
    body{
        background:black;
    }
}

/* 混合使用:当页面宽度大于960px并且小于1200px时执行 */
@media screen and (min-width:960px) and (max-width:1200px){
    body{
        background:yellow;
    }
}

 

2、导航栏变侧边栏

3、多列变单列


 

 2、淘宝flexible

问题:

如何使用Flexible实现手机淘宝H5页面的终端适配

解决:

手机淘宝的flexible的设计和实现


 

手机淘宝,从2014年中开始全面推行flexible设计。flexible是responsive响应式设计的低端形态和基础。

最直观感受就是,在超宽屏幕上,网页显示不会两边留白。

以前的PC时代的流体布局,其实就是一种flexible design,只不过,流体的表述角度是实现,flexible的表述角度是结果。

 

首先,需要了解三个关键概念

ppi,pixel per inch,每英寸像素数 显示世界每英寸的像素数,决定了屏幕的显示质量
dpr,device pixel ratio,设备像素比率 物理像素与逻辑像素px的对应关系
resolution,分辨率 屏幕区域的宽高所占像素数

场景一:resolution,分辨率适配

问题:

一张banner图片,当你面对不同的屏幕时,会出现什么行为?而你希望它的行为是什么?

分析:

我们需要考虑到,多数网页都是纵向滚动,在不同的屏幕尺寸下,banner图片的行为应该是铺满屏幕宽度以及保持宽高比(放大缩小时把持比例)

解决:

使用百分比宽度,即width: 100%;

接着,需要固定宽高比,我们有两种思路来实现:一是利用img标签的特性,只设置宽度,等图片加载完,这种方法会导致大量的重排,并且非固定高度会导致懒加载等功能难以实现,所以果断放弃;二是使用before伪元素的margin撑开高度,这种方法是比较干净的纯css实现,但是不具备任何复用性而且要求特定html结构,所以同样放弃。

所以,剩下最适合的方法:使用相对单位,rem,使用js给html设置一个跟屏幕宽度成正比的font-size,然后把元素高度都以rem作为单位

 

遗留问题:

占用了rem单位、不是纯css方案

 

场景二:ppi适配

问题:

一段文字,当针对不同的屏幕,会是怎样的行为?你希望它的行为是什么?

分析:

我们一般希望在不同手机上看到的文字尺寸是相同的,即不希望文字在Retina屏尺寸变小,而希望在大屏上看到更多文字;

另外现在绝大多数字体都是自带点阵尺寸,通常为16px和24px,我们不希望出现13px或者15px这样的奇葩尺寸;

所以,字体不适合使用rem(在我们的希望前提下),而应该使用px

解决:

考虑到Retina,我们利用media query来指定不同的字体;考虑到dpr判定的兼容性,我们用宽度替换来代替

1 .a {
2     font-size:12px
3 }
4 @media (min-width: 401px){
5     .a {
6         font-size:24px
7     }

备注:

有一些标题性文字,我们希望随着屏幕宽而增大的,所以我们仍然使用rem作为单位。

一般超过35px(个人直观感受)的文字,已经不用太考虑点阵信息了,靠字体的矢量信息也能渲染的很好。

 

场景三:dpr匹配

设备像素比率,物理像素和逻辑像素px的对应关系

问题:

一个区块,设计稿上有1像素边框,当针对不同的屏幕会出现什么行为?你希望它是什么行为?

分析:

一般情况下我们希望在任何屏幕上这条线仍然是1物理像素

解决:

因为这类问题不是使用px就能解决的,比如,在Retina屏下,假如你写了viewport的设置,

你将永远无法写出1px宽度的东西,另外,inline的SVG等元素,也会按照逻辑像素来渲染,导致整个页面的清洗度会大打折扣。

所以,手机淘宝用JavaScript来动态写meta标签

 1 var metaEl = doc.createElement('meta');
 2 var scale = isRetina ? 0.5:1;
 3 metaEl.setAttribute('name', 'viewport');
 4 metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
 5 if (docEl.firstElementChild) {
 6     document.documentElement.firstElementChild.appendChild(metaEl);
 7 } else {
 8     var wrap = doc.createElement('div');
 9     wrap.appendChild(metaEl);
10     documen.write(wrap.innerHTML);
11 }

 

结语

手机淘宝的flexible方案,其实就是综合使用rem和px两种单位——JavaScript设置scale和html字体的

 

3、百分比

①rem

②rpx(微信小程序)

🌂%

 

4、flex

flex布局(微信小程序)

<view class="flex-wrp" style="flex-direction: row;">

  <view class="flex-item"></view>

</view>

 

 

 

posted @ 2018-07-12 11:46  hoanfir  阅读(246)  评论(0编辑  收藏  举报