Vue window.onresize监听窗口变化

示例:在webapp页面的底部,有时候我们会使用 position: absolute;bottom: 0; 实现一些需求,如tabbar,固定到底部的一些操作按钮。
问题:当页面有输入框的时候,底部的定位元素会被输入法顶到上面?
解决办法:
使用window.onresize监听窗口变化,动态修改有定位的元素css,当窗口发生变化时,让定位元素隐藏。

用法:

  1. 在store.js里定义:
    screenHeight——用于存放全局的视口高度
    changeScreenHeight ——用于动态改变视口的高度
import Vuex from 'vuex'
Vue.use(Vuex)

const store = new Vuex.Store({
  strict: true,
  state: {
    screenHeight: document.documentElement.clientHeight,
  },
  mutations: {
    changeScreenHeight (state, val) {
      state.screenHeight = val
    }
  }
})
export default store
  1. 在App.vue里挂载window.onresize,也可以使用(例:watch里)
<template>
  <div class="app">

    <div class="app-body">
      <router-view></router-view>
    </div>

    <router-view name="tabbar" :style="{ display: tabbarDisplay}"></router-view>
  </div>
</template>

<script>
import { mapMutations } from 'vuex'
export default {
  name: 'App',

  data () {
    return {
      tabbarDisplay: 'block'
    }
  },

  watch: {
    /**
    * 侦听页面可视高度的变化,将底部tabbar display:block
    */
    '$store.state.screenHeight' () {
      // 使用视口高度变量
      if (this.$router.currentRoute.name === 'insured' || this.$router.currentRoute.name === 'order') {
        this.tabbarDisplay = this.tabbarDisplay === 'block' ? 'none' : 'block'
      }
    }
  },

  methods: {
    ...mapMutations(['changeScreenHeight'])
  },

  mounted () {
    window.onresize = () => {
      this.changeScreenHeight(document.documentElement.clientHeight)
    }
  }
}
</script>
  1. 在其它子页面监听视口变化,动态操作
    直接引入就可以使用,因为window.onresize是全局注册的。
<template>
  <div class="regist">
    <div class="regist-header"></div>

    <div class="regist-body">

    <div class="regist-foot" ref="foot" style="display:block;">
        一些定位的操作按钮
    </div>
  </div>
</template>

<script>
import { mapState } from 'vuex'
export default {
  watch: {
    screenHeight (newVal, oldVal) {
      if (Math.abs(oldVal - newVal) > 60) {
        this.$refs.foot.style.display = this.$refs.foot.style.cssText === 'display: block;' ? 'none' : 'block'
      }
    }
  },

  computed: {
    ...mapState(['screenHeight'])
  }
}
</script>

注意:

  1. 在项目中 window.onresize只能挂载一次,在多个页面中同时挂载 window.onresize时,只有其中一个 window.onresize会起作用。
  2. mutations是唯一更改store的地方,更改store里的screenHeight,必须在mutations里定义函数,在需要更改store的地方调用执行。
  3. 引入store以后,直接就可以使用,App.vue页面挂载的onresize监听是全局的。

参考:
https://blog.csdn.net/xuaner8786/article/details/81565219

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

推荐阅读更多精彩内容

  • vue去哪网跟学笔记 记录学习点滴 1. 初始化项目 1.1 手机显示配适 minimum-scale=1.0,m...
    noobakong阅读 2,173评论 0 16
  • 一:什么是闭包?闭包的用处? (1)闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就 是将函数内部和函数外...
    xuguibin阅读 9,193评论 1 52
  • Vuex Vuex是vue官方的一款状态管理工具,什么是状态呢?我们在前端开发中有一个概念:数据驱动,页面中任意的...
    一条IT阅读 275评论 0 2
  • Vuex Vuex是vue官方的一款状态管理工具,什么是状态呢?我们在前端开发中有一个概念:数据驱动,页面中任意的...
    一条IT阅读 1,158评论 0 2
  • 渲染函数和jsx 在vue中我们可以不用template来指定组件的模板,而是用render函数来创建虚拟dom结...
    6e5e50574d74阅读 685评论 0 0