以前做移动端项目布局都是rem来做的,但rem需要在页面中引入js,根据设备的宽度来修改根节点标签的font-size样式属性(相对长度单位。相对于根元素(即html元素)font-size计算值的倍数)才能配使用!
js代码:
(function(doc, win) {
var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
recalc = function() {
var clientWidth = docEl.clientWidth;
if(!clientWidth) {
return false;
}
// 750 是按照PSD设计稿以iphone6、7、8来设定的!
docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
};
if(!doc.addEventListener) {
return false;
}
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);
上面的缩放是以750的宽度来设定的(一般情况下UI在设计移动端APP、Web、小程序等都是以iphone6的尺寸为例的)
所以当我们在写css样式时就要缩小倍数来使用rem了,比如在宽度为750px的PSD设计稿的中某个标题的文字大小是16px时,此是在css样式中就要写成:font-size: 0.16rem;某个图片的宽是320px,高是240px,圆角是8px时在css样式中就要写成:img{ width:32rem; height:24rem; border-radius: 0.08rem;} 这样去写以后,就可以在不同大小宽高的移动设备是自适应了,这样写虽然可以,但还是有缺陷的。
先来看看网上对视口的解释:在桌面端,视口指的是在桌面端,指的是浏览器的可视区域;而在移动端,它涉及3个视口:Layout Viewport(布局视口),Visual Viewport(视觉视口),Ideal Viewport(理想视口)。
视口单位中的“视口”,桌面端指的是浏览器的可视区域;移动端指的就是Viewport中的Layout Viewport。
CSS3规范,视口单位主要包括以下4个:
vw: 1vw = 视口宽度的1%
vh: 1vh = 视口高度的1%
vmin 选取vw和vh中最小的那个
vmax 选取vw和vh中最大的那个
vw 与 vh:相对于视口的高度和宽度,而不是父元素的(CSS百分比是相对于包含它的最近的父元素的高度和宽度)。
1vw 等于1/100的视口宽度。
1vh 等于1/100的视口高度,
比如:浏览器高度950px,宽度为1920px, 1 vh = 950px/100 = 9.5 px,1vw = 1920px/100 =19.2 px。
vmax相对于视口的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax。
vmin相对于视口的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin。
比如:浏览器视口尺寸为370px,那么 1vw = 370px * 1% = 6.5px(浏览器会四舍五入向上取7)
单位依赖于
% 元素的祖先元素
vh / vw 视口的尺寸
浏览器兼容性:
1、桌面 PC
Chrome:自 26 版起就完美支持(2013年2月)
Firefox:自 19 版起就完美支持(2013年1月)
Safari:自 6.1 版起就完美支持(2013年10月)
Opera:自 15 版起就完美支持(2013年7月)
IE:自 IE10 起(包括 Edge)到现在还只是部分支持(不支持 vmax,同时 vm 代替 vmin)
2、移动设备
Android:自 4.4 版起就完美支持(2013年12月)
iOS:自 iOS8 版起就完美支持(2014年9月)
在工作中情况下仅使用vw作为CSS单位,vh可在某些页面要求宽和高都为100%时{width:100%; height:100%(注:这里需要html,body的宽高都是100%才有效哦!!)},时去代替100%使用,如上面的{width:100%; height:100%}用vw, vh改写为:{width: 100vw; height: 100vh;}
由于项目需要(移动端项目),今天用vue-cli3来做,在vue-cli3中使用 sass 和 vw/wh来做布局,
vue-cli 3提供了两种方式集成sass/scss:
$ vue create vuedemo
? Please pick a preset: (Use arrow keys)
> default (babel, eslint)
Manually select features
移动上下键选择“Manually select features”:表示手动选择创建项目的特性。
显示如下:
? Check the features needed for your project: (Press to select, to t
oggle all, to invert selection)
>( ) TypeScript
( ) Progressive Web App (PWA) Support
( ) Router
( ) Vuex
(*) CSS Pre-processors
( ) Linter / Formatter
( ) Unit Testing
( ) E2E Testing
移动上下键在CSS Pre-processors,按提示点击空格键选择CSS-processors。
显示如下:
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): (Use arrow keys)
> SCSS/SASS
LESS
Stylus
选择第一个SCSS/SASS作为我们的CSS预处理器。
完成后项目会帮我们安装sass-loader node-sass。
如果在创建项目没有选择CSS 预处理器,我们也可以手动安装sass-loader node-sass来集成scss。
npm install -D sass-loader node-sass
至此我们只需要在style指定lang为scss即可:
在实际工作中,有的一常用的初始化样式、颜色、字体等都是整个项目是要用到的,如果每个页面都去引用一次就在繁琐了,所以我们可以把常用的必用的放在一个全局的scss样式方件中,一次引用,全局使用!
vue service clie会自动使用我们安装的sass-loader作为scss内容的加载器。
创建scss样式文件:(我是放在vue根目录中的src目录下的public目录下【可以自定义】)
global.scss内容如下:
$color: #2656ec;
@function vw($px) {
//这里是以移动端PSD设计稿 宽为750px,高为1334px为例,所以这里 除以750,以便在使用时,不用去计算倍数, PSD设计稿中的尺寸是多少,我们样式就是多少!!!
@return ($px / 750) * 100vw;
}
vue cli是基于webpack构建项目,如果想对sass-loader传递一些配置项,可以在vue.config.js配置。在项目的根目录下如果没有找到vue.config.js,手动创建即可。如下:
Vue官方实例:https://cli.vuejs.org/zh/guide/css.html#css-modules
// vue.config.js内容如下:
module.exports = {
//解决打包后index.html文件找不到js/css资源问题
baseUrl: './',
//配置sass(css编译工具)
css: {
loaderOptions: {
sass: {
/*
@/ 表示 src/ 的别名, 如要有多个scss可以在 ; 后面在 @import "@/其他.scss";
注:
1、我这个global.scss文件是在src目录下的public目录中(可以自定义)。
2、引入的文件要以.scss为后缀名,不能是sass!!!不然会报错!!!
*/
data: `@import "@/public/global.scss";`
}
}
},
configureWebpack: {
//解决在本地开发联调API是跨域问题
devServer: {
proxy: {
'/Api': {
target:'https://www.easy-mock.com/mock/5d48e8d73dbe173654aeece6/api',
ws: true,
changeOrigin: true,
pathRewrite: {
'^/Api': ''
}
}
}
}
}
};