移动端最强适配(rem适配之px2rem)&& 移动端结合Vuex实现简单loading加载效果

一、rem之px2rem适配

前言:相信许多小伙伴上手移动端时面对各式各样的适配方案,挑选出一个自己觉得简便、实用、高效的适配方案是件很纠结的事情。 深有体会...

经过多个移动端项目从最初的 viewport --> 百分比 --> rem --> rem的升级版px2rem可谓是一把鼻涕一把泪啊 ,在px2rem之前总觉得之前的不够完美或者麻烦;

进入正题: 首先 px2rem 也是基于 rem  适配的,但是他的好用之处在于灵活、简便、高效不用我们自己去换算、px2rem-loader  会帮我们换算转换成rem适配各种机型;

1、安装 px2rem-loader  (webpack构建的项目)

npm i px2rem-loader --save-dev

2、(build/utils.js文件)配置 px2rem-loader

// utils.js
const cssLoader = {
  loader: ‘css-loader‘,
  options: {
    sourceMap: options.sourceMap
  }
}

/*  px2rem */
const px2remLoader = {
  loader: ‘px2rem-loader‘,
  options: {
    remUnit: 75 // 设计稿宽度/10  remUnit的值自定义多少都无所谓,最终都会转换成相应的rem 设计稿参照iphone的话推荐75 或者100
  }
};

/*  添加到loaders数组中 */
function generateLoaders(loader, loaderOptions) {
    const loaders = [cssLoader, px2remLoader]
}

用法: 标注图即量即所得;设计稿量多少就可以写多少了;最终显示时 px2remLoader会转换成相应的 rem

代码: font-size: 40px;      浏览器控制台: font-size: 0.533333rem;   即 40/75  因为上面写的是75复制代码

完全不用自己去转换了!爽多了

小坑:当 border 或者 height 为1px时  你会发现最终转换下页面看不到了 ;解决如下

border: 1px solid #e6e6e6; /*no*/    后面加个注释  /*no*/ 目的是告诉 px2remLoader 这个用做转换复制代码

二、结合Vuex自定义loading组件

这里只说如何实现,具体的vuex怎么使用注册请看以往博文 www.cnblogs.com/ljx20180807…

loading.vue

<template>
  <!--loading-->
  <div class="comp-loading">
    <div class="comp-loading-box">
      <img src="@/assets/img/loading.png"/>
      <p>Loading...</p>
    </div>
  </div>
</template>

<style lang="stylus" rel="stylesheet/stylus" scoped>
.comp-loading {
  &-box {
    z-index: 10000;
    position: fixed;
    top: 40%;
    left: 50%;
    width: 160px;
    margin-left: -80px;
    padding: 30px 0;
    border-radius: 10px;
    background-color: rgba(0,0,0,.7);
    img {
      display: block;
      width: 60px;
      height: 60px;
      margin: 0 auto;
      animation: comp-loading-spin 1200ms infinite linear;
    }
    p {
      font-size: 26px;
      color: #fff;
      text-align: center;
      line-height: 26px;
      padding-top: 14px;
    }
  }
}
@keyframes comp-loading-spin {
  0%   { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
</style>

App.vue

<template>
  <!-- App.vue -->
  <div id="app">
    <!--loading-->
    <Loading v-show="showHttpLoading"></Loading>
    <router-view v-wechat-title="$route.meta.title"></router-view>
  </div>
</template>

<script>
  import Loading from ‘./components/loading‘
  import error from ‘./services/error‘
  export default {
    name: ‘App‘,
    data () {
      return {
        showHttpLoading: false
      }
    },
    components: {
      Loading
    },
    watch: {
      // 监听 showHttpLoading 触发loading效果
      ‘$store.state.showHttpLoading‘ (val) {
        // set loading
        this.showHttpLoading = val
      }
    }
  }
</script>

在哪里调用呢;我项目是在所有请求的时候和路由跳转的时候调用;请求成功则关闭loading;具体效果可根据你公司需求确认

// config.js
import Vue from ‘vue‘
import axios from ‘axios‘
import store from ‘../store‘
import router from ‘../router/index‘

import { Toast } from ‘cube-ui‘

Vue.use(Toast)

const init = function () {
  // 请求拦截器
  axios.interceptors.request.use(function (config) {
    // 触发loading
    store.commit(‘UPDATE_SHOW_HTTP_LOADING‘, true)
    .......
  }, function (err) {
    // 抛出错误
    store.commit(‘UPDATE_SHOW_HTTP_LOADING‘, false)
    .....
  })

  // 响应拦截器 Add a response interceptor
  axios.interceptors.response.use(function (response) {
    // 请求成功关闭loading
    store.commit(‘UPDATE_SHOW_HTTP_LOADING‘, false)
    .........
  }, function (error) {
    store.commit(‘UPDATE_SHOW_HTTP_LOADING‘, false)
    .......
  })

  // 前置守卫  只为触发loading效果觉得不需要则去掉
  router.beforeEach((to, from, next) => {
    if (to.matched && to.matched.length && to.matched[0].path) {
      // 已授权情况   触发loading
      store.commit(‘UPDATE_SHOW_HTTP_LOADING‘, true)
      next()
    }
  })

  // 后置守卫  只为关闭loading  不用loading则去掉
  router.afterEach((to, from) => {
    // 关闭loading
    store.commit(‘UPDATE_SHOW_HTTP_LOADING‘, false)
  })

注意的是需要在main.js 里引入config.js 并初始化去 config.init()

结语: 以上就是今天要分享的内容了,有问题欢迎留言

原文地址:https://www.cnblogs.com/ljx20180807/p/10319776.html

时间: 2024-08-01 03:04:24

移动端最强适配(rem适配之px2rem)&& 移动端结合Vuex实现简单loading加载效果的相关文章

实现移动端上拉加载效果

毕设终于结束了,做了一个webApp,从中学习到了很多,页面有用到上拉加载的效果.今天就整理了一下. 上拉加载的实现思路其实很简单: 1.移动端触发touchmove事件(上拉) 2.判断最后一个元素是否已出现在底部 3.若出现,则js添加元素到页面末尾 思路图: 接下来开始编写style样式: html,body{ margin: 0px; width: 100%; height: 100%; } li{ list-style: none; } #personkit_article_ul{ w

原生js移动端touch事件实现上拉加载更多

大家都知道jQuery里没有touch事件,所以在移动端使用原生js实现上拉加载效果还是很不错的,闲话不多说,代码如下: 1 //获取要操作的元素 2 var objSection = document.getElementsByTagName("div")[0]; 3 //给元素绑定监听事件 个人习惯把监听事件写在一块 4 objSection.addEventListener("touchstart", touchStart, false); 5 objSect

移动端使用rem适配及相关问题

移动端适配方案,说多也很多.可以使用百分比布局,但百分比与em都是基于父元素进行计算的,在实际应用中不是很方便.使用rem不仅可以设置字体大小,块大小也可以设置.而且可以良好的适配各种终端,所以这方案很受欢迎. rem定义及浏览器支持情况 rem(font size of the root element)是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位.看到rem一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位.它们之间其

移动端适配(3)---rem适配

rem适配 <meta name="viewport"  content="width=device-width,user-scalable=no"/> <script> (function(){ var html=document.documentElement; var hWidth=html.getBoundingClientRect().width; html.style.fontSize=hWidth/16+"px&quo

webapp思路和rem适配极其viewport

webapp在制作时候,页面上要加入viewport标签,用来进行适配; viewport的meta标签,指的是在移动端显示的时候,viewport是多大?移动端的浏览器是屏幕宽,viewport一般(手机浏览器)默认的是960px左右,就把页面压缩到 960px显示,所以是比手机屏幕宽的哟.等比放小,所以,为了显示的好看,要设定viewport为屏幕宽,就是:如此标签 <meta name="viewport" content="width=device-width,

0082 rem适配方案:less+rem+媒体查询、flexible.js+rem

1.让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备. 2.使用媒体查询根据不同设备按比例设置html的字体大小,然后页面元素使用rem做尺寸单位,当html字体大小变化,元素尺寸也会发生变化,从而达到等比缩放的适配. 技术方案: 1.less+rem+媒体查询 2.flexible.js+rem 总结: 两种方案现在都存在,方案2 更简单,现阶段无需了解里面的js代码. rem实际开发适配方案1 ①假设设计稿是750px ②假设我们把整个屏幕划分为15等份(划分标准

移动APP中rem适配

将js中的代码引入自己html页面中,页面内的所有有关尺寸大小的设定都可以用rem来代替,如用rem代替px的使用,可以做到屏幕大内容按比例放大,是所有内容哦,若果你项目中所有内容都使用rem. <!doctype html><html><head><meta charset="utf-8"><title>移动APP中rem适配-jq22.com</title><script src="http:/

rem适配

//REM适配new function() { var _self = this; _self.width = 640; // 设置默认最大宽度 _self.fontSize = 100; // 默认字体大小 _self.widthProportion = function() { var p = (document.body && document.body.clientWidth || document.getElementsByTagName("html")[0]

em与rem之间的区别以及移动设备中的rem适配方案

em与rem之间的区别: 共同点: 它们都是像素单位 它们都是相对单位 不同点: em大小是基于父元素的字体大小 rem大小是基于根元素(html)的字体的大小 实例: <!DOCTYPE html> <html lang="en" style="font-size: 50px"> <head> <meta charset="UTF-8"> <title>Document</tit