解决移动端软键盘弹起底部固定布局被顶上去问题和屏幕背景被压缩问题

news/2024/10/17 16:23:02/

1:解决移动端软键盘弹起底部固定布局被顶上去问题

在前端页面布局中经常会把一些按钮通过fixed或absolute固定到底部,但如果页面上有input或textarea被点击获取焦点时,在移动端上软键盘弹起时就会把这些固定到底部的布局顶上去,有时会十分影响美观,下面是在Vue项目中如何通过隐藏的方式实现不被顶上去的

实现步骤

1. 在mounted中添加对resize屏幕变化监听并获取到屏幕原始高度
2. 在watch中添加对data中定义的屏幕高度的监听

-----------2.1:小于原始高度底部布局就隐藏,否则就显示
3. 在beforeDestroy中删除对resize屏幕变化的监听

完整代码

<template><div class="wrapper"><input type="text" class="input"><span class="btn" @click="btnClick" v-show="isShow">跳转下一步</span></div>
</template><script>export default {name: "Demo",data() {return {originalHeight: 0, //原始高度screenHeight: 0, //实时高度isShow: true,}},mounted() {//首次进入的原始高度this.originalHeight = document.documentElement.clientHeight;window.addEventListener('resize', this.watchResize);},beforeDestroy() {window.removeEventListener("resize", this.watchResize);},watch: {screenHeight(newHeight) { //监听屏幕高度变化this.isShow = this.originalHeight <= newHeight;}},methods: {watchResize() {//实时变化的窗口高度this.screenHeight = document.documentElement.clientHeight;},btnClick() {this.$router.push({path: "/home2"})}}}
</script><style scoped lang="less">.wrapper {position: relative;width: 100%;height: 100%;background: #eee;.input {display: inline-block;height: 60px;margin: 10px;border: 2px solid #00ff00;}.btn {position: fixed;left: 50%;bottom: 3%;margin-left: -150px;width: 300px;height: 40px;text-align: center;line-height: 40px;background: chocolate;}}
</style>

注意事项

1:在项目中如果使用window.onresize的方式对屏幕进行监听时,则这种监听是全局的监听,如果不注销则对其他页面屏幕的变化也会进行监听,所以必须在beforeDestroy中进行注销

    mounted() {window.onresize = () => {this.screenHeight = document.documentElement.clientHeight;};},beforeDestroy() {window.onresize = () => {}},

2:通过addEventListener方式对resize进行监听,通过手机验证如果不注销也不会影响其他页面,但是最好我们都写上

2:解决安卓手机上调出软键盘,屏幕背景图被压缩的问题

在Vue项目的App.vue类中添加如下代码:

	<script>export default {name: "app",created() {var height= document.documentElement.clientHeight; //获取当前可视区域的高度window.onload = function(){ //在页面整体加载完毕时document.getElementById('app').style.height= height + 'px'//给根布局设置高度}}}</script>

vue代码:

    <div class="wrapper" id = "demo"><input type="text" class="input"></div>.wrapper {position: relative;width: 100%;height: 100%;background: url("../public/static/images/demo.png") no-repeat center;background-size: cover;}

这样设置后,当软键盘弹起时,如果未遮挡获取焦点的元素,则背景图不会动,如果软键盘遮挡了获取焦点的元素,则背景图和图上的元素都会整体往上移动,而不会对背景图进行压缩。

注意事项

1: 有时候我们想直接在vue代码中直接控制最外层标签的高度不就可以吗,这样也不用全局设置了,如

	created() {this.originalHeight = document.documentElement.clientHeight;window.onload = function () { //加不加window.onload都是不可以的document.getElementById('demo').style.width = '100%'; //不会生效,而宽度由内部标签撑开document.getElementById('demo').style.height = this.originalHeight + 'px'; //不会生效,而高度由内部标签撑开document.getElementById('demo').style.background = "url('static/images/demo.png') no-repeat center";document.getElementById('demo').style.backgroundImage = "cover";}},

样式为:

    .wrapper {position: relative;}

实践证明这样是不可以的,虽然originalHeight获取到的是可视区的大小,但是把高度设置给最外层标签后并不会生效,而是最外层标签的高度和宽度都是由其内部标签高度和宽度决定的。如图加不加window.onload都是不可以的。

2: 我们能不能在代码中设置id为app标签的高度呢?如

	created() { //注意这里设置高度不加 window.onload  (加上就不可以了)this.originalHeight = document.documentElement.clientHeight;document.getElementById('app').style.height = this.originalHeight + 'px';},
	vue代码:(其实和上面一样)<div class="wrapper" id = "demo"><input type="text" class="input"></div>.wrapper {position: relative;width: 100%;height: 100%;background: url("../public/static/images/demo.png") no-repeat center;background-size: cover;}

这种方式是可以的,但这种方式设置后也是全局的,也就是对所有页面都会生效,如果你偏要只在当前页面有效的话,那可以在适当的位置再重置根布局高度,如:

document.getElementById('app').style.height = 'auto';

http://www.ppmy.cn/news/479520.html

相关文章

css背景颜色占全部屏幕,css怎样让背景充满整个屏幕

炫酷时钟 body{height: 100%;color: #51555c; background: url("./img/bg1.png") no-repeat; /* 背景图垂直、水平均居中 */ background-position: center center; /* 背景图不平铺 */ background-repeat: no-repeat; /* 当内容高度大于图片高度时,背景图像的位置相…

html5 video 背景透明,你能将HTML5 video显示为全屏幕背景吗?

我可能有点迟&#xff0c;以回答这个问题&#xff0c;但这对于寻找答案的新人很有用。 上面的答案很好&#xff0c;但要获得完美的视频背景&#xff0c;您必须检查宽高比&#xff0c;因为在调整屏幕大小或在不同的屏幕尺寸上使用屏幕时&#xff0c;视频可能会剪切或画布四周变形…

计算机如何更改用户名的背景,Win10系统下如何更改登录屏幕背景?

在Win10系统中&#xff0c;有两个屏幕&#xff0c;一个是登录屏幕&#xff0c;另一个是锁定屏幕。这两个屏幕很容易理解。 登录屏幕和锁定屏幕之间的区别 登录屏幕&#xff1a;它还表示登录屏幕。当您第一次重新启动计算机时&#xff0c;您将进入一个具有用户名的屏幕&#xff…

【Vue】13.解决安卓手机上调出软键盘,屏幕背景被压缩的问题

在移动项目开发中遇到了一个这样的问题&#xff0c;我这里用的flex布局&#xff0c;因为flex布局是根据页面宽高度进行变化的&#xff0c;因此&#xff0c;当底部弹出手机软键盘的时候&#xff0c;因页面高度变化导致页面因而变化。 解决办法&#xff1a; 我们只需要在app这个…

14-2利用遗传算法求解BP神经网络初始化权值和阈值的最优问题(附matlab程序)

1.简述 核心问题&#xff1a; BP网络是前向网络的核心部分&#xff0c;是神经网络中的最精华、最完美的部分&#xff0c;由于其简单的结构&#xff0c;可调整的参数多&#xff0c;训练算法也多&#xff0c;而且可操作性好&#xff0c;BP神经网络获得了非常广泛的应用&#xff0…

MySQL面试题--聚簇索引,非聚簇索引,回表查询

目录 概念 聚集索引选取规则: 面试回答 大纲 回答 概念 分类 含义 特点 聚集索引(Clustered Index) 将数据存储与索引放到了一块&#xff0c;索引结构的叶子节点保存了行数据 必须有,而且只有一个 二级索引(Secondary Index) 将数据与索引分开存储&#xff0c;索引…

【运维知识进阶篇】zabbix5.0稳定版详解3(监控Nginx+PHP服务状态信息)

这篇文章继续给大家介绍zabbix监控&#xff0c;监控Nginx、PHP等服务&#xff0c;其实非常简单&#xff0c;难点在于如何去取这个值&#xff0c;包括监控业务&#xff0c;难点在于思路是否清晰&#xff0c;思维是否活跃&#xff0c;如何去进行判断是否有这个业务&#xff0c;并…

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框&#xff0c; 请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13108 效果图如下&#xff1a; # cc-serviceDialog 自定义服务说明弹窗 自下而上 底部弹窗 #### 使用方法 使用方法 <!-- 服务…