博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue2.0 flexible.js + rem 进行自适应开发
阅读量:6234 次
发布时间:2019-06-22

本文共 10241 字,大约阅读时间需要 34 分钟。

1.在页面中引入flexible.js

base.js

/** * flexible.js 阿里前端自适应解决方案 */;(function(win, lib) {  var doc = win.document;  var docEl = doc.documentElement;  var metaEl = doc.querySelector('meta[name="viewport"]');  var flexibleEl = doc.querySelector('meta[name="flexible"]');  var dpr = 0;  var scale = 0;  var tid;  var flexible = lib.flexible || (lib.flexible = {});  if (metaEl) {    console.warn('将根据已有的meta标签来设置缩放比例');    var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);    if (match) {      scale = parseFloat(match[1]);      dpr = parseInt(1 / scale);    }  } else if (flexibleEl) {    var content = flexibleEl.getAttribute('content');    if (content) {      var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);      var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);      if (initialDpr) {        dpr = parseFloat(initialDpr[1]);        scale = parseFloat((1 / dpr).toFixed(2));      }      if (maximumDpr) {        dpr = parseFloat(maximumDpr[1]);        scale = parseFloat((1 / dpr).toFixed(2));      }    }  }  if (!dpr && !scale) {    var isAndroid = win.navigator.appVersion.match(/android/gi);    var isIPhone = win.navigator.appVersion.match(/iphone/gi);    var devicePixelRatio = win.devicePixelRatio;    if (isIPhone) {      docEl.setAttribute('data-os', 'ios');      // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案      if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {        dpr = 3;      } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){        dpr = 2;      } else {        dpr = 1;      }    } else {      // 其他设备下,仍旧使用1倍的方案      dpr = 1;    }    scale = 1 / dpr;  }  docEl.setAttribute('data-dpr', dpr);  if (!metaEl) {    metaEl = doc.createElement('meta');    metaEl.setAttribute('name', 'viewport');    metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');    if (docEl.firstElementChild) {      docEl.firstElementChild.appendChild(metaEl);    } else {      var wrap = doc.createElement('div');      wrap.appendChild(metaEl);      doc.write(wrap.innerHTML);    }  }  function refreshRem(){    var width = docEl.getBoundingClientRect().width;    if (width / dpr > 540) {      width = 540 * dpr;    }    var rem = width / 10;    docEl.style.fontSize = rem + 'px';    flexible.rem = win.rem = rem;  }  win.addEventListener('resize', function() {    clearTimeout(tid);    tid = setTimeout(refreshRem, 300);  }, false);  win.addEventListener('pageshow', function(e) {    if (e.persisted) {      clearTimeout(tid);      tid = setTimeout(refreshRem, 300);    }  }, false);  if (doc.readyState === 'complete') {    doc.body.style.fontSize = 14 * dpr + 'px';  } else {    doc.addEventListener('DOMContentLoaded', function(e) {      doc.body.style.fontSize = 14 * dpr + 'px';    }, false);  }  refreshRem();  flexible.dpr = win.dpr = dpr;  flexible.refreshRem = refreshRem;  flexible.rem2px = function(d) {    var val = parseFloat(d) * this.rem;    if (typeof d === 'string' && d.match(/rem$/)) {      val += 'px';    }    return val;  }  flexible.px2rem = function(d) {    var val = parseFloat(d) / this.rem;    if (typeof d === 'string' && d.match(/px$/)) {      val += 'rem';    }    return val;  }})(window, window['lib'] || (window['lib'] = {}));

util.js 工具类

/** * 获取当前元素所有最终使用的CSS属性值 */export function getStyle(el,style){  return parseInt(window.getComputedStyle(el, false)[style])}/** * 获取 设备像素比 */export function getDeviceRatio(){	var isAndroid = window.navigator.appVersion.match(/android/gi);  var isIPhone = window.navigator.appVersion.match(/iphone/gi);  var devicePixelRatio = window.devicePixelRatio;  var dpr;  if (isIPhone) {    // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案    if (devicePixelRatio >= 3) {      dpr = 3;    } else if (devicePixelRatio >= 2){      dpr = 2;    } else {      dpr = 1;    }  } else {    // 其他设备下,仍旧使用1倍的方案    dpr = 1;  }  return dpr}

  

2.安装 node-sass

npm install --save node-sass --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/dist --sass-binary-site=http://npm.taobao.org/mirrors/node-sass

安装 sass-loader

npm install sass-loader --save

 

3.重置全局样式

_normalize.scss

@charset "utf-8";html{  color: #000;  background: #fff;  overflow-y: scroll;  -webkit-text-size-adjust: 100%;  -ms-text-size-adjust: 100%; }html * {  outline: none;  -webkit-text-size-adjust: none;  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);}html,body {  font-family: sans-serif;  height: 100%;  width:100%;  // overflow:hidden;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td,hr,button,article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {  margin: 0;  padding: 0;}input,select,textarea {  font-size: 100%;}table {  border-collapse: collapse;  border-spacing: 0;}fieldset,img {  border: 0;}abbr,acronym {  border: 0;  font-variant: normal;}del {  text-decoration: line-through;}address,caption,cite,code,dfn,em,th,i,var {  font-style: normal;  font-weight: 500;}ol,ul {  list-style: none;}caption,th {  text-align: left;}h1,h2,h3,h4,h5,h6 {  font-size: 100%;  font-weight: 500;}q:before,q:after {  content: '';}sub,sup {  font-size: 75%;  line-height: 0;  position: relative;  vertical-align: baseline;}sup {  top: -0.5em;}sub {  bottom: -0.25em;}a:hover {  text-decoration: underline;}ins,a,a:active,a:visited,a:link{  text-decoration: none;}.clearfix{  &:after{    display: table;    clear: both;    content: "";    visibility: hidden;;    height: 0;  }}body{  height:100%;  font-family: "Microsoft YaHei";}

 等同于 reset.css

/** * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/) * http://cssreset.com */html, body, div, span, applet, object, iframe,h1, h2, h3, h4, h5, h6, p, blockquote, pre,a, abbr, acronym, address, big, cite, code,del, dfn, em, img, ins, kbd, q, s, samp,small, strike, strong, sub, sup, tt, var,b, u, i, center,dl, dt, dd, ol, ul, li,fieldset, form, label, legend,table, caption, tbody, tfoot, thead, tr, th, td,article, aside, canvas, details, embed,figure, figcaption, footer, header,menu, nav, output, ruby, section, summary,time, mark, audio, video, input {  margin: 0;  padding: 0;  border: 0;  font-size: 100%;  font-weight: normal;  vertical-align: baseline;}/* HTML5 display-role reset for older browsers */article, aside, details, figcaption, figure,footer, header, menu, nav, section {  display: block;}body {  line-height: 1;}blockquote, q {  quotes: none;}blockquote:before, blockquote:after,q:before, q:after {  content: none;}table {  border-collapse: collapse;  border-spacing: 0;}/* custom */a {  color: #7e8c8d;  text-decoration: none;  -webkit-backface-visibility: hidden;}li {  list-style: none;}::-webkit-scrollbar {  width: 5px;  height: 5px;}::-webkit-scrollbar-track-piece {  background-color: rgba(0, 0, 0, 0.2);  -webkit-border-radius: 6px;}::-webkit-scrollbar-thumb:vertical {  height: 5px;  background-color: rgba(125, 125, 125, 0.7);  -webkit-border-radius: 6px;}::-webkit-scrollbar-thumb:horizontal {  width: 5px;  background-color: rgba(125, 125, 125, 0.7);  -webkit-border-radius: 6px;}html, body {  width: 100%;}body {  -webkit-text-size-adjust: none;  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);}

  

4.常用 mixin 函数

_mixins.scss

/** * 字体 */@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;  }  //下版注意加上line-hegiht:100%}/** * 行高 */@mixin lin-dpr ($height) {  line-height: $height;  [data-dpr='2'] & {    line-height: $height * 2;  }  [data-dpr='3'] & {    line-height: $height * 3;  }}/** * 高度 */@mixin height-dpr($height) {  height: $height;  [data-dpr='2'] & {    height: $height * 2;  }  [data-dpr='3'] & {    height: $height * 3;  }}/** * 背景图 */@mixin img-dpr($url,$name,$type:".png"){  background-image: url($url+"2x/"+ $name+"@2x"+$type);  [data-dpr="3"] &{    background-image: url($url+"3x/"+ $name+"@3x"+$type);  }}/** * 设置宽、高 */@mixin setSize($width,$height){  width:$width;  height:$height;}/** * 禁止改变元素的浏览器默认风格 */@mixin hideAppearance{  -webkit-appearance: none;  -moz-appearance: none;  appearance:none;}/** * 解决1px问题 */@mixin border-1px($color) {  position: relative;  &:after {    display: block;    position: absolute;    left: 0;    bottom: 0;    width: 100%;    border-top: 1px solid $color;    content: ' ';  }}/** * 判断在不同 dpr 下的显示情况 */@media (-webkit-min-device-pixel-ratio: 1.5),(min-device-pixel-ratio: 1.5) {  .border-1px {    &::after {      -webkit-transform: scaleY(0.7);      transform: scaleY(0.7);    }  }}@media (-webkit-min-device-pixel-ratio: 2),(min-device-pixel-ratio: 2) {  .border-1px {    &::after {      -webkit-transform: scaleY(0.5);      transform: scaleY(0.5);    }  }}

  

5.px 转 rem 函数

_functions.scss

//将px转换成rem$defaut-font-size: 64px; // 设计图为 640@function px2rem($px) {  @return $px/$defaut-font-size * 1rem;}

 

6.引用

为了方便依赖所有的公共样式,创建一个 app.scss ,引入其他的公共scss,当应用到其他 css 时,直接引入app即可(@import "./app")

app.scss  

// 为了方便依赖所有的公共样式,创建一个 app.scss@import "./functions";@import "./mixins";

App.vue 中 引入 重置 css样式的 _normalize.scss

 

7.常用语法

(1)导入

@import  引入 .scss 文件

例如:

@import '../base/css/base.scss';

(2)变量

普通变量

$fontSize: 12px;body{  font-size:$fontSize;}

默认变量

sass的默认变量仅需要在值后面加上!default即可。

$baseLineHeight:1.5 !default;body{  line-height: $baseLineHeight; }

(3)mixin 混合

@include  引入 mixin

例如:

/** * 字体 */@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(20px); // font-size:20px;

(4)function 函数

例如:

//将px转换成rem$defaut-font-size: 64px; // 设计图为 640@function px2rem($px) {  @return $px/$defaut-font-size * 1rem;}

引用

margin-top: px2rem(20px);

(5)继承

h1{  border: 4px solid #ff9aa9;}.speaker{  @extend h1;  border-width: 2px;}

(6)判断  @if

sass

$lte7: true;$type: monster;.ib{    display:inline-block;    @if $lte7 {        *display:inline;        *zoom:1;    }}p {  @if $type == ocean {    color: blue;  } @else if $type == matador {    color: red;  } @else if $type == monster {    color: green;  } @else {    color: black;  }}

css

.ib{    display:inline-block;    *display:inline;    *zoom:1;}p {  color: green; }

参考:https://www.w3cplus.com/sassguide/syntax.html

.

转载地址:http://sczia.baihongyu.com/

你可能感兴趣的文章
Knockout应用开发指南 第一章:入门
查看>>
C# 6.0新特性
查看>>
二叉树(9)----打印二叉树中第K层的第M个节点,非递归算法
查看>>
MySQL数据库的几种常见高可用方案
查看>>
feign client传递对象
查看>>
java数组复制的几种常见用法
查看>>
去哪网实习总结:JavaWeb中文传參乱码问题的解决(JavaWeb)
查看>>
PHP-7
查看>>
数据库设计
查看>>
mysql & java & spring transaction isolation level
查看>>
最大熵源码解读
查看>>
[RxJS] Use `lift` to Connect a `source` to a `subscriber` in RxJS
查看>>
一文让你熟练掌握Linux的ncat(nc)命令
查看>>
在Ubuntu主机下实现与Windows虚拟机共享文件夹
查看>>
以Debug模式启动JBoss
查看>>
Socket传输文件时进行校验(简单解决TCP粘包问题)
查看>>
JUnit + Mockito 单元测试(二)
查看>>
面试题目集锦--二叉树
查看>>
类图(Class diagram)—UML图(二)
查看>>
系统清理小工具
查看>>