VUE的dart-sass,rem转换,tarbar 组件及移动端的兼容问题

1.VUE的dart-sass,rem转换,tarbar 组件:

安装dart-sass,rem转换:

dart-sass:


看下图因为使用history模式所以路由文件的模式被改变了★:路径地址就不带#号了 使用history模式发布到服务器后,刷新页面会出现白屏或者404怎么办?需要在服务端比如nginx或者Apache配置路径才可以,建议使用hash模式,因为hash模式不存在以上问题具体原因见:https://vue3js.cn/interview/vue/404.html#%E4%BA%8C%E3%80%81404%E9%97%AE%E9%A2%98


安装rem转换:

npm i amfe-flexible --save

把px转成rem的插件

只能在css文件里面写 <style>里面的

npm i postcss-px2rem --save

2、main.js引入

import rem from 'amfe-flexible'

为了全局使用rem 插件需要use一下

Vue.use(rem)

3、package.json中添加如下代码:

"remUnit":75表示 ui小姐姐给的图 是按照750px这个尺寸设计的

"postcss":{

    "plugins":{

      "autoprefixer":{},

      "postcss-px2rem":{

        "remUnit":75

      }

    }

  }

4、修改了 src路径不需要重启,但是修改了配置项 需要重新启动 npm run serve

5、需要在css中设置样式,在行内样式style里面写无效

.s1{

  /* 30px/75=0.4rem */

  font-size:30px;

}

6、html的根元素 font-size会根据屏幕的变化而变化 但是元素rem值不会

效果:页面的尺寸也会根据屏幕的变化而变化

tarbar组件:

<template>

  <div class="tabbar">

    <div

      class="item"

      v-for="(v, i) in list"

      :key="i"

      @click="handler(i)"

      :style="{ color: v.active ? 'red' : '' }"

    >

      <img :src="v.active?v.activeurl:v.imgurl" alt="" class="img"><br>

      {{ v.title }}

    </div>

  </div>

</template>

<script>

export default {

  name: "TabBar",

  props:["list"],

  methods: {

    handler: function (i) {

      this.list.forEach((r) => {

        r.active = false;

      });

      this.list[i].active = true;

    },

  },

};

</script>

<style scoped lang='scss'>

.tabbar {

  width: 100%;

  padding: 10px;

  height: 90px;

  background: #ccc;

  position: fixed;

  bottom: 0;

  left: 0;

  display: flex;

  .item {

    flex: 1;

    font-size: 22px;


    text-align: center;

    .img {

      width: 50px;

      height: 50px;

    }

  }

  /* 移动端的兼容问题因为移动端没有鼠标,只有手指 */

  /* .item:hover{

     cursor: pointer;

     background: red;

    } */

}

</style>

App.vue文件:

<template>

  <div class="app">

    <div class="box">

      <h1 class="s1">欢迎使用sass</h1>

    </div>

    <div class="box1">

      <div class="box2">

        <div class="box3"></div>

      </div>

    </div>

    <ul>

      <li v-for="(v, i) in 4" :key="i">{{ v }}</li>

    </ul>

    <tab-bar :list="list" />

  </div>

</template>

<script>

import TabBar from "./components/TabBar.vue";

export default {

  components: { TabBar },

  name: "App",

  data() {

    return {

      list: [],

    };

  },

  created() {

    setTimeout(() => {

      this.list = [

        {

          title: "首页",

          active: true,

          imgurl: require("@/assets/home.png"),

          activeurl: require("@/assets/home_active.png"),

        },

        {

          title: "分类",

          active: false,

          imgurl: require("@/assets/fenlei.png"),

          activeurl: require("@/assets/fenlei_active.png"),

        },

        {

          title: "搜索",

          active: false,

          imgurl: require("@/assets/search.png"),

          activeurl: require("@/assets/search_active.png"),

        },

        {

          title: "购物车",

          active: false,

          imgurl: require("@/assets/shopping.png"),

          activeurl: require("@/assets/shopping_active.png"),

        },

        {

          title: "我的",

          active: false,

          imgurl: require("@/assets/my.png"),

          activeurl: require("@/assets/my_active.png"),

        },

      ];

    }, 500);

  },

};

</script>

<style lang="scss">

* {

  margin: 0;

  padding: 0;

}

/* 特点:可以使用变量 可以嵌套 图片路径也可以使用变量*/

$colorRed: red;

$colorGreen: green;

$colorBlue: blue;

$k: 100px;

ul {

  width: $k;

  height: $k;

  background: $colorRed;

  li:nth-of-type(1) {

    /* 写减法的时候左右要加空格,否则会理解为杠- */

    width: $k - 20px;

    background: $colorGreen;

  }

  li:nth-of-type(2) {

    width: $k + 20px;

    background: $colorBlue;

  }

}

.box1 {

  width: $k * 2;

  height: $k * 2;

  background: $colorRed;

  .box2 {

    width: $k;

    height: $k;

    background: $colorGreen;

    .box3 {

      width: $k/2;

      height: $k/2;

      background: $colorBlue;

    }

  }

}

.box {

  width: 200px;

  height: 200px;

  border: 1px solid $colorRed;

  /* background: url("@{imgurl}logo.png") no-repeat; */

  h1 {

    color: $colorRed;

  }

}

.s1{

  /* 30px/75=0.4rem */

  font-size:30px;

}

</style>

效果图:


2.移动端的兼容问题:

技术栈

vue2.0 + vuex + vue-router + webpack + axios + scss + ES6/7

cookies跨域不能携带

cookies在跨域的时候,每次刷新,cookies的值都会发生变化。这个时候是已经设置了 

Access-Control-Allow-Origin:*

 ,然后再设置上

withCredentials:true

 ,最后再尝试一下,不仅cookies带不过来,之前还可以跨域的请求,现在都报错了。你对错误一无所知。

网上给了一些解释,意思是,你的前端与后端不在同一主域下(就是不在同一域名下)。而且刚刚设置的两个东西会造成冲突, 

withCredentials:true

 导致跨域的设置失效了。

既然都用了vue,那就配置一个代理吧

用 vue-cli 3.0 构建的vue项目与 vue-cli 2.0 构建的项目,在目录上会发生变化,配置文件也会改变。不过配置的时候,内容还是不会变化的。

vue-cli 2.0 下的配置

找到根目录,在 config 文件夹下的 index.js 内,加上以下代码。具体每一项表示的含义,可以去webpack的官网里找。这样设置之后,cookies的值也不会每次变化了。


module

.exports={

    dev:{

        proxyTable:{

'/xxx':{

                target:'http://192.168.1.1:8080',

                ws:true,

                changeOrigin:true

}

}

}

}

vue-cli 3.0 下的配置

与 vue-cli 2.0 的配置是一样的,唯一比较麻烦的是, vue-cli 3.0 隐藏了配置文件,项目看上去变得很简洁,所以找不到在哪里配置。

在根目录下新建文件 vue.config.js ,项目会默认读取这个文件。文件的详细配置可以在 github地址里仔细阅读。

打开新建好的 vue.config.js ,写上上面那段代码后,重启一下项目就好了。

重点

修改了这个配置,一定要重启应用,否则修改将不会生效。

另外,如果在开发中使用了跨域,在实际的生产中,webpack 的代理肯定就用不了了,需要使用 nginx 来做代理。

不想配置代理的看这里。但是,需要后端配合修改

这里以 axios 为例,使用的时候将 axios 当成 vue 的全局对象处理。代码如下:


axios.defaults.withCredentials=true;

axios.defaults.crossDomain=true;

Vue.prototype.$axios= axios;

因为需要跨域, withCredentials 和 crossDomain 都需要配置,后端的看一下别人家的博客吧。因为不是我写的,就不乱说了。

使用 axios 时,直接这么使用:

this.$axios({...})

苹果手机的样式兼容

作为艰辛的前端,只用得起OPPO R9s,无奈80%的用户都是苹果手机,和另一个小米Note的前端兄dei一起花了三天调试苹果的兼容问题。

问题什么时候会出现,完全没有意料到,iphone 7 与 7P 的显示就有不同,与 iphone 6 还有 iphone 8 也不一样。做这种调试,真的得所有的苹果机型都得有才行。谁让苹果手机这么耐用,除了被偷,和有钱,手机可以用到电池爆炸。

苹果手机的问题主要以下4种:

图片扭曲,甚至变形

在滚动的时候很卡顿

点击的时候会出现蓝色的遮罩层

被固定的头部还有底部,在上拉和下拉的时候都会被遮住

图片扭曲,甚至变形

出现这个问题,是高估了苹果手机在app里提供的内核的性能。查阅了一些资料,说的是苹果为app提供的内核,渲染效率还有兼容性都是非常低下的。苹果兼容问题,百度、谷歌一下,都是一大堆的抱怨。

我这里的问题是因为使用了vue 的 v-if 来渲染图片。场景是这样的,有5张图片,需要根据传入的参数来选择显示哪一张,点击下面的选项时,图片还可以跟着变化。然后神奇的一幕发生,图片各种扭曲,变形,甚至分裂。检查了一遍样式,没发现问题后,我把 v-show 替换了 v-if 然后就好了。然后开始怀疑人生,苹果手机,还是 7p ,渲染效率低的可怕啊。

滚动的时候卡顿

卡顿嘛,很正常,于是在 #app 下加上了一句 

-webkit-overflow-scrolling: touch;

 ,就不卡顿了。你以为问题解决了吗?

拿出安卓手机一试,分分钟想打人。

机智的小米Note兄dei,把这句话加了 body 标签上,同时加上了一句 overflow: auto 就好了。

点击的时候会出现蓝色的遮罩层

这个很简单,在 IOS 系统下, webkit 内核的问题,加上一句 

-webkit-tap-highlight-color: rgba(0, 0, 0, 0)

 就行了

被固定的头部还有底部,在上拉和下拉的时候都会被遮住

既然用户是苹果,别想着用 fixed 定位了。元素被固定住的时候,怎么拉都不行。只有通过布局的方式,让这个看起来更像固定定位

微信浏览器

用了 vue 就得明白,有的时候链接上的参数是有的,但是从微信点击“复制链接”和“在浏览器打开”的时候,参数就没了。是因为,浏览器仍然读取的是上一次的地址。在需要URL参数的时候,最好做一次刷新。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 1.props如果使用的是对象的形式,传过来的是对象或者是数组,默认值必须是一个方法 props:{ li...
    冲锋敢死曾小贤阅读 502评论 0 0
  • 1、移动端你们一般采用什么布局?移动端设计稿是多大的尺寸? ● 定宽布局 ● 一般移动端设计稿是640或者750的...
    小薇同学v阅读 13,959评论 1 15
  • Nuxt爬坑 第一节:nuxt.js相关概述 nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作S...
    阿_军阅读 1,001评论 0 0
  • 一、移动端适配 在移动端我们经常可以在head标签中看到这段代码: 通过meta标签对viewport的设置,定义...
    魂斗罗小黑阅读 724评论 0 0
  • 一、概念介绍 Vue.js和React.js分别是目前国内和国外最火的前端框架,框架跟类库/插件不同,框架是一套完...
    刘远舟阅读 1,045评论 0 0