征服世界的卡比兽
发布于 2023-12-09 / 504 阅读 / 0 评论 / 0 点赞

移动端解决软键盘弹出时底部fixed定位被顶上去的问题

移动端解决软键盘弹出时底部fixed定位被顶上去的问题

移动端页面的底部菜单栏,通常会使用fixed定位在底部。在安卓手机上经常会出现软键盘弹出时,底部定位被顶上去,下面提供vue解决办法。

import Vue from "vue";

export const EventBus = new Vue();
const judgeDeviceType = function () {
  var ua = window.navigator.userAgent.toLocaleLowerCase();
  var isIOS = /iphone|ipad|ipod/.test(ua) || window.__wxjs_is_wkwebview;
  var isAndroid = /android/.test(ua);
  return {
    isIOS: isIOS,
    isAndroid: isAndroid,
  };
};

const isInputElement = function (e) {
  return e.target.nodeName == "INPUT" || e.target.nodeName == "TEXTAREA";
};

window.addEventListener(
  "focus",
  (e) => {
    if (isInputElement(e)) {
      EventBus.$emit("focus");
    }
  },
  true
);

window.addEventListener(
  "blur",
  (e) => {
    if (isInputElement(e)) {
      EventBus.$emit("blur");
    }
  },
  true
);

window.addEventListener("resize", () => {
  EventBus.$emit("resize");
});

Vue.directive("safe-area-inset-fixed", {
  bind: function (el) {
    const value = el.style.display;
    const DeviceType = judgeDeviceType();
    if (DeviceType.isIOS) {
      EventBus.$on("focus", () => {
        el.style.display = "none";
      });
      EventBus.$on("blur", () => {
        el.style.display = value;
      });
    } else {
      let docmHeight = window.innerHeight; //默认屏幕高度
      let realHeight = 0; //实时屏幕高度
      let showFooter = true; //显示底部fixed

      EventBus.$on("resize", () => {
        realHeight = window.innerHeight;
        if (docmHeight > realHeight) {
          showFooter = false;
        } else {
          showFooter = true;
        }

        el.style.display = showFooter ? value : "none";
        console.log("safe-area-inset-fixed", docmHeight, realHeight, "resize");
      });
    }
  },
  unbind() {
    const DeviceType = judgeDeviceType();
    if (DeviceType.isIOS) {
      EventBus.$off("focus");
      EventBus.$off("blur");
    } else {
      EventBus.$off("resize");
    }
  },
});