h5键盘弹起底部菜单(按钮)被顶起-vue自定义指令解决

这篇具有很好参考价值的文章主要介绍了h5键盘弹起底部菜单(按钮)被顶起-vue自定义指令解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        开发H5中测试过程中发现在安卓手机上,input/textarea 获取焦点 软键盘弹出 会让absolute/fixed或者使用flex局部 固定在底部的元素(固定底部栏)顶起来问题;在搜索后发现安卓上在键盘弹起的时候浏览器 body height 100% 其实只有键盘以上范围,这里决解方法有很多可以在键盘弹出前获取到当前屏幕高度,将body height 设置为获取到的屏幕高度;我这边我是使用了input/textarea 的focus/blur事件,及配合resize事件来设置固定底部栏。
        我们这边是使用 vue3 为基础开发, 由于有input/textarea的地方都需要做控制,所以我这边最后决定使用vue 自定义指令方式 来做,实现如下:
自定义指令详情 请参考官方文档 vue 自定义指令 官方文档

自定义指令 mounted:

import type { Directive, DirectiveBinding } from 'vue'

// 自定义指令
const keyboardExpansion: Directive = {
    /**
     el:指令绑定到的元素。这可以用于直接操作 DOM。
     binding:一个对象,包含以下属性。
        value:传递给指令的值。例如在 v-my-directive="1 + 1" 中,值是 2。
        oldValue:之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。
        arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 "foo"。
        modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。
        instance:使用该指令的组件实例。
        dir:指令的定义对象。
    **/
    mounted (el: Element, binding: DirectiveBinding<any>) {
       // 添加处理逻辑
       // 查找 目标元素
       // 绑定事件
    }
}

查找input/textarea:

import type { Directive, DirectiveBinding } from 'vue'

// 自定义指令
const keyboardExpansion: Directive = {
    /**
     el:指令绑定到的元素。这可以用于直接操作 DOM。
     binding:一个对象,包含以下属性。
        value:传递给指令的值。例如在 v-my-directive="1 + 1" 中,值是 2。
        oldValue:之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。
        arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 "foo"。
        modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。
        instance:使用该指令的组件实例。
        dir:指令的定义对象。
    **/
    mounted (el: Element, binding: DirectiveBinding<any>) {
        // 查找 目标元素
        // 这里 inputElement 指的是 input/textarea
        const inputElement: Element | null = ['INPUT', 'TEXTAREA'].includes(el.tagName)
        ? el
        : el.querySelector('input') || el.querySelector('textarea')
       // 绑定事件
        inputElement?.addEventListener('blur',() => {
            // 失去焦点 展示 逻辑
            // 这里可以配合 pinia/vuex 来做操作(推荐),也可以直接操纵dom(不建议)
        })

        inputElement?.addEventListener('focus', () => {
            // 获取焦点 隐藏 逻辑
            // 这里可以配合 pinia/vuex 来做操作(推荐),也可以直接操纵dom(不建议)
        })
    }
}

上面代码之后 发现在 安卓下,软键盘是可以展开/收起,同时input/textarea 还是有焦点,在这种情况下 上面的代码是符合不了条件的,会发现当我们点击软键盘收起的时候,我们底部固定栏没有展示出来问题,所以在这里我们就得添加是resize事件监听视口变化:
 

import type { Directive, DirectiveBinding } from 'vue'

// 存储高度
let originHeight = 0

// 视口变化 监听函数
const hanlderResize = (): void => {
  const resizeHeight =
    document.documentElement.clientHeight || document.body.clientHeight
  if (originHeight < resizeHeight) {
    // 安卓机下 用户收起键盘 同时input还有焦点
    // 执行失去焦点逻辑
  } else {
    // 安卓机下 用户展开键盘 同时input还有焦点
    // 执行获取焦点逻辑
  }
  originHeight = resizeHeight
}


// 自定义指令
const keyboardExpansion: Directive = {
    /**
     el:指令绑定到的元素。这可以用于直接操作 DOM。
     binding:一个对象,包含以下属性。
        value:传递给指令的值。例如在 v-my-directive="1 + 1" 中,值是 2。
        oldValue:之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。
        arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 "foo"。
        modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。
        instance:使用该指令的组件实例。
        dir:指令的定义对象。
    **/
    mounted (el: Element, binding: DirectiveBinding<any>) {
        // 查找 目标元素
        // 这里 inputElement 指的是 input/textarea
        const inputElement: Element | null = ['INPUT', 'TEXTAREA'].includes(el.tagName)
        ? el
        : el.querySelector('input') || el.querySelector('textarea')
       // 绑定事件
        inputElement?.addEventListener('blur',() => {
            // 失去焦点 展示 逻辑
            // 这里可以配合 pinia/vuex 来做操作(推荐),也可以直接操纵dom(不建议)
        })

        inputElement?.addEventListener('focus', () => {
            // 获取焦点 隐藏 逻辑
            // 这里可以配合 pinia/vuex 来做操作(推荐),也可以直接操纵dom(不建议)
        })

        // 判断 安卓机情况下 添加视口监听
        if ((/android/i).test(navigator.userAgent)) {
            originHeight = document.documentElement.clientHeight || document.body.clientHeight
            window.addEventListener('resize', hanlderResize, false)
        }
    },
    unmounted() {
        if ((/android/i).test(navigator.userAgent)) {
            // 指令元素 销毁前remove上面绑定的事件
          window.removeEventListener('resize', hanlderResize, false)
        }
    }
}

添加上之后 我们就会发现现在是可以符合我们的条件的,当键盘展示时隐藏底部固定栏,收起键盘时展示底部固定栏。

下面是完整代码:文章来源地址https://www.toymoban.com/news/detail-528731.html

import type { Directive, DirectiveBinding } from 'vue'
import { useTestStore } from '@/store/index'

// 存储高度
let originHeight = 0

// 视口变化 监听函数
const hanlderResize = (): void => {
  const resizeHeight =
    document.documentElement.clientHeight || document.body.clientHeight
  if (originHeight < resizeHeight) {
    // 安卓机下 用户收起键盘 同时input还有焦点
    // 执行失去焦点逻辑
    hanlderblur()
  } else {
    // 安卓机下 用户展开键盘 同时input还有焦点
    // 执行获取焦点逻辑
    handlerfocus()
  }
  originHeight = resizeHeight
}


// pinia 存储
const testStore = useTestStore()

// 失去焦点 展示 底部按钮
const hanlderblur = (): void => {
  testStore.setFooterMenuType(true)
}

// 获取焦点 隐藏 底部按钮
const handlerfocus = (): void => {
  testStore.setFooterMenuType(false)
}


// 自定义指令
const keyboardExpansion: Directive = {
    /**
     el:指令绑定到的元素。这可以用于直接操作 DOM。
     binding:一个对象,包含以下属性。
        value:传递给指令的值。例如在 v-my-directive="1 + 1" 中,值是 2。
        oldValue:之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。
        arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 "foo"。
        modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。
        instance:使用该指令的组件实例。
        dir:指令的定义对象。
    **/
    mounted (el: Element, binding: DirectiveBinding<any>) {
        // 查找 目标元素
        // 这里 inputElement 指的是 input/textarea
        const inputElement: Element | null = ['INPUT', 'TEXTAREA'].includes(el.tagName)
        ? el
        : el.querySelector('input') || el.querySelector('textarea')
       // 绑定事件
        inputElement?.addEventListener('blur', hanlderblur)

        inputElement?.addEventListener('focus', handlerfocus)

        // 判断 安卓机情况下 添加视口监听
        if ((/android/i).test(navigator.userAgent)) {
            originHeight = document.documentElement.clientHeight || document.body.clientHeight
            window.addEventListener('resize', hanlderResize, false)
        }
    },
    unmounted() {
        if ((/android/i).test(navigator.userAgent)) {
            // 指令元素 销毁前remove上面绑定的事件
          window.removeEventListener('resize', hanlderResize, false)
        }
    }
}

到了这里,关于h5键盘弹起底部菜单(按钮)被顶起-vue自定义指令解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小程序底部input输入框,键盘弹起时页面整体上移问题解决

    存在问题: 小程序中,当input输入框位于页面底部时,输入框聚焦后键盘弹起,页面会整体上移,将输入框所在位置定位到键盘上方(图2) 解决思路: 键盘弹起时,页面其他元素不动不动,底部输入框跟随键盘上弹(图3) 效果图对比: 1、input设置属性 :adjust-position=“fal

    2024年02月11日
    浏览(34)
  • H5界面键盘弹起,整个界面上移

    说下基本的问题,就是点击选择门店,会从下面弹出一个弹框,出现门店列表,然后列表上方会有一个搜索框,搜索门店,当点击搜索框时会弹起键盘,导致整个弹框上移,可能会导致搜索框跳出整个界面,如下图所示,如果字体或整个界面过大,搜索框就会跳出可视区域

    2024年02月07日
    浏览(29)
  • h5键盘弹起遮挡输入框的处理

    一、前言: 混合开发中遇到一个问题,有些型号的安卓机和ios机型,输入框唤起键盘后,输入框会被键盘遮挡,需要手动滑动才能漏出来,影响用户体验 二、解决办法: 1.ios和android手机唤起的windows事件不一样,要分别处理 2.document.body.scrollTop无效,可以用document.documentElemen

    2024年02月15日
    浏览(33)
  • 解决uni-app微信小程序底部输入框,键盘弹起时页面整体上移问题

    做了一个记录页面(类似单方聊天页),输入框在底部;当弹出键盘时,页面整体上移,页面头信息会消失不见 比如一个记录页面,需要在键盘弹出时: 底部的输入框跟随键盘上弹 页面头固定在顶部不动 聊天信息区域(即内容区)调整高度,该区域局部滚动 底部输入框f

    2024年02月13日
    浏览(93)
  • 解决uni-app微信小程序底部input输入框,键盘弹起时页面整体上移问题

    一.存在的问题:           微信小程序聊天界面,当input 框获取焦点时会自动调起手机键盘,当键盘弹起时,会导致页面整体上移,页面头信息会消失不见。 二.需要实现的效果 键盘弹出时, 底部的输入框跟随键盘上弹 ; 页面头固定在顶部不动; 3.聊天信息区域(即内

    2024年02月11日
    浏览(43)
  • 解决 uni-app 微信小程序 input 输入框在底部时,键盘弹起页面整体上移问题

    设置使键盘弹起使页面不上移 设置输入框所在盒子为绝对定位 键盘弹起时获取键盘高度 设置输入框所在盒子的 bottom 的键盘高度

    2024年02月05日
    浏览(42)
  • uniapp(全端兼容) - 实现点击输入框时完美顶起键盘,获取键盘高度动态计算顶起距离,解决软键盘弹出时输入框被覆盖问题,uniapp微信小程序/移动端h5网页/安卓苹果app(示例代码,一键复制

    在uniapp小程序/h5网页网站/安卓苹果app/nvue等(全平台完美兼容)开发中,完美解决input输入框激活时软键盘从底部弹出遮挡问题,采用获取键盘高度动态计算每个平台下的弹出高度,彻底消除各平台端的弹出距离不一致、有差异的问题! 还能彻底解决软键盘顶不起来输入框的

    2024年03月14日
    浏览(135)
  • Android原生键盘弹起,H5页面被压缩的两种解决方案

    移动H5项目中,会出现input框获得焦点键盘弹出把页面元素顶上去压缩到一起,影响页面布局. 方案一:监听页面变化,动态的展示和隐藏底部被顶上来的内容 这种方法经调试还不算十分完美 方案二:监听页面变化,键盘弹起时将变化之前的高度赋值给压缩后的页面         这种

    2024年02月16日
    浏览(30)
  • 解决uni-app微信小程序input,textarea输入框在底部时,键盘弹起页面整体上移问题

    问题是这样的input ,textarea获取焦点时会自动调起手机键盘,设置 :adjust-position=“true”,和不设置都会导致键盘弹起时页面整体上移 问题分析 input 获取焦点时会自动调起手机键盘,设置 :adjust-position=“true”,会导致键盘弹起时页面整体上移 思路: 设置使键盘弹起使页面不

    2024年02月11日
    浏览(48)
  • Vue自定义指令实现按钮级的权限控制

    提示:原文参考链接*且听风吟 提示:钩子函数: 自定义指令有五个生命周期(也叫钩子函数),分别是: bind,inserted,update,componentUpdated,unbind 。 bind :只调用一次,指令第一次绑定到元素时调用。用这个钩子函数可以定义一个绑定时执行一次的初始化设置。( bind 时父节点

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包