viewportvisualviewpor,viewportlayoutviewportjavascript
环境 |
微信
|
qq空间 |
qq空间
|
微博
|
浏览器
|
导航栏 |
无
|
无 | 有 |
有
|
有
|
调试工具 |
|
|
|
|
|
在前端开发以前,视觉MM会给咱们一个psd文件,称之为视觉稿。css
对于移动端开发而言,为了作到页面高清的效果,视觉稿的规范每每会遵循如下两点:html
问题:
1. 对于dpr=2的手机,为何画布大小×2,就能够解决高清问题?前端
字体: 中文字体默认,英文使用Helvetica 。即 body{font-family:Helvetica;}java
系统/字体
|
中文
|
英文
|
数字
|
ios系统 |
HelveticaNeue
|
||
android 系统
|
Droidsansfallback
|
Droid Sans
|
Droid Sans
|
winphone 系统
|
Dengxian(方正等线体)
|
Segoe
|
Segoe
|
目前Flexible会将视觉稿分红100份
(主要为了之后能更好的兼容vh
和vw
),而每一份被称为一个单位a
。同时1rem
单位被认定为10a
。针对咱们这份视觉稿能够计算出:android
1a = 7.5px1rem = 75px
那么咱们这个示例的稿子就分红了10a
,也就是整个宽度为10rem
,<html>
对应的font-size
为75px
:ios
在实际生产当中,若是每一次计算px
转换rem
,或许会以为很是麻烦,或许直接影响你们平时的开发效率。为了能让你们更快进行转换,咱们团队内的同窗各施所长,为px
转换rem
写了各式各样的小工具。git
CSSREM是一个CSS的px
值转rem
值的Sublime Text3自动完成插件。这个插件是由@正霖编写。先来看看插件的效果:github
有关于CSSREM如何安装、配置教程能够点击这里查阅。web
除了使用编辑器的插件以外,还可使用CSS的处理器来帮助你们处理。好比说Sass、LESS以及PostCSS这样的处理器。咱们简单来看两个示例。
使用Sass的同窗,可使用Sass的函数、混合宏这些功能来实现:
@function px2em($px, $base-font-size:16px) { @if (unitless($px)) { @warn"Assuming #{$px} to be in pixels, attempting to convert it into pixels for you"; @return px2em($px + 0px); //That may fail. } @elseif (unit($px) == em) { @return$px; } @return ($px / $base-font-size) * 1em; }
除了使用Sass函数外,还可使用Sass的混合宏:
@mixin px2rem($property,$px-values,$baseline-px:16px,$support-for-ie:false){ //Conver the baseline into rems $baseline-rem: $baseline-px / 1rem * 1; //Print the first line in pixel values@if$support-for-ie { #{$property}: $px-values; } //if there is only one (numeric) value, return the property/value line for it. @if type-of($px-values) == "number"{ #{$property}: $px-values / $baseline-rem; } @else { //Create an empty list that we can dumpvalues into $rem-values:(); @each$value in $px-values{ // If the value is zero ornot a number, return it @if$value == 0or type-of($value) != "number"{ $rem-values: append($rem-values, $value / $baseline-rem); } } // Return the property and its list of converted values #{$property}: $rem-values; } }
有关于更多的介绍,能够点击这里进行了解。
除了Sass这样的CSS处理器这外,咱们团队的@颂奇同窗还开发了一款npm
的工具px2rem。安装好px2rem以后,能够在项目中直接使用。也可使用PostCSS。使用PostCSS插件postcss-px2rem:
var gulp = require('gulp'); var postcss = require('gulp-postcss'); var px2rem = require('postcss-px2rem'); gulp.task('default', function() { var processors = [px2rem({remUnit: 75})]; return gulp.src('./src/*.css') .pipe(postcss(processors)) .pipe(gulp.dest('./dest')); });
除了在Gulp中配置外,还可使用其余的配置方式,详细的介绍能够点击这里进行了解。
配置完成以后,在实际使用时,你只要像下面这样使用:
.selector{ width:150px;height:64px;/*px*/font-size:28px;/*px*/border:1px solid #ddd;/*no*/}
px2rem
处理以后将会变成:
.selector{ width:2rem;border:1px solid #ddd;}[data-dpr="1"].selector{ height:32px;font-size:14px;}[data-dpr="2"].selector{ height:64px;font-size:28px;}[data-dpr="3"].selector{ height:96px;font-size:42px;}
在整个开发中有了这些工具以后,彻底不用担忧px
值转rem
值影响开发效率。
rem
前面你们都见证了如何使用rem
来完成H5适配。那么文本又将如何处理适配。是否是也经过rem
来作自动适配。
显然,咱们在iPhone3G和iPhone4的Retina屏下面,但愿看到的文本字号是相同的。也就是说,咱们不但愿文本在Retina屏幕下变小,另外,咱们但愿在大屏手机上看到更多文本,以及,如今绝大多数的字体文件都自带一些点阵尺寸,一般是16px
和24px
,因此咱们不但愿出现13px
和15px
这样的奇葩尺寸。
如此一来,就决定了在制做H5的页面中,rem
并不适合用到段落文本上。因此在Flexible整个适配方案中,考虑文本仍是使用px
做为单位。只不过使用[data-dpr]
属性来区分不一样dpr
下的文本字号大小。
div { width: 1rem; height: 0.4rem; font-size: 12px; // 默认写上dpr为1的fontSize } [data-dpr="2"] div { font-size: 24px; } [data-dpr="3"] div { font-size: 36px; }
为了能更好的利于开发,在实际开发中,咱们能够定制一个font-dpr()
这样的Sass混合宏:
@mixin font-dpr($font-size){ font-size: $font-size; [data-dpr="2"] & { font-size: $font-size * 2;}[data-dpr="3"] & { font-size: $font-size * 3;} }
有了这样的混合宏以后,在开发中能够直接这样使用:
@include font-dpr(16px);
固然这只是针对于描述性的文本,好比说段落文本。但有的时候文本的字号也须要分场景的,好比在项目中有一个slogan,业务方但愿这个slogan能根据不一样的终端适配。针对这样的场景,彻底可使用rem
给slogan作计量单位。
原本想把这个页面的用到的CSS(或SCSS)贴出来,但考虑篇幅过长,并且这么简单的页面,我想你们也能垂手可得搞定。因此就省略了。权当是给你们留的一个做业吧,感兴趣的能够试试Flexible可否帮你快速完成H5页面终端适配。