前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >移动端H5 input输入完成后页面底部留白问题

移动端H5 input输入完成后页面底部留白问题

作者头像
w候人兮猗
发布于 2020-07-01 07:37:35
发布于 2020-07-01 07:37:35
89800
代码可运行
举报
运行总次数:0
代码可运行

Contents

说明

最近在用vue写几个H5页面在微信上展示,遇到一个在弹窗上input输入完成之后点击键盘的完成,页面底部留出一片空白的问题

出现原因分析
  • 当键盘抬起时,window.scrollY会从0变到键盘的高度,所以解决办法就是当input失去焦点的时候,将window.scrollY重新设置为0
解决
  • 给所有的input``textarea组件设置获取焦点和设置焦点事件,失去焦点的时候将“window.scrollY`设置为0
  • 因为的是vue所以结合vue来写代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <input class="m-input" :value="value" @input="$emit('input', $event.target.value)" @focus="inputFocus()" @focusout="inputFocusOut">
</template>

<script>
  export default {
    name: "MInput",
    props:['value'],
    data(){
      return{
        timer:null
      }
    },
    methods:{
      inputFocus(){
        if(this.timer){
          clearTimeout(this.timer)
        }
      },
      inputFocusOut(){
        this.timer = setTimeout(() => {
          window.scrollTo(0,0)
        },10)
      }
    },
    destroyed(){
      if(this.timer){
        clearTimeout(this.timer)
      }
    }
  }
</script>
  • 获取焦点事件,判断定时器是否存在如果存在的话清除掉(上一个input设置的定时器)
  • 失去焦点事件,将window.scrollY设置为0,并且给一个10的定时器,减少页面失去焦点的突兀感(为了顺滑一点点)
  • destroyed vue组件中如果使用了定时器,一定要记得在组件销毁的生命周期里将清时期清除掉,防止全局定时器过多,容易爆栈
补充:解决方案2
  • 在input上分别增加focusblur的方法,基本可以解决键盘回落后留白问题;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
handleFocus(event) {
    let e = event.currentTarget;
    setTimeout(() => {
        e.scrollIntoView({
            block: 'start',
            behavior: 'smooth'
        });
    }, 300);
}
handleblur() {
    let e = event.currentTarget;
    setTimeout(() => {
        e.scrollIntoView({
            block: 'end',
            behavior: 'smooth'
        });
    }, 300);
     window.scrollTo(0, 0);
}
补充:解决方案3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //解决键盘弹出后挡表单的问题
    window.addEventListener('resize', function() {
      if(
        document.activeElement.tagName === 'INPUT' ||
        document.activeElement.tagName === 'TEXTAREA'
      ) {
        window.setTimeout(function() {
          if('scrollIntoView' in document.activeElement) {
            document.activeElement.scrollIntoView();
          } else {
            document.activeElement.scrollIntoViewIfNeeded();
          }
        }, 0);
      }
    });
补充:页面来回弹跳
  • 问题:失焦时的scrollTop=0造成的页面弹跳。本来iOS是做了这方面的优化,在软键盘弹出和收起时页面会smooth的平滑,由于我加了scrollIntoView破坏了原生的优化导致弹跳了
  • 解决:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
handleFocus(event) {
    clearTimeout(this.timer);
}
handleblur() {
    this.timer = setTimeout(() => {
        document.body.scrollTop = 0;
        window.pageXOffset = 0;
        document.documentElement.scrollTop = 0;
    }, 100);
}
最后
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年5月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《Go语言程序设计》读书笔记(七)基于共享变量的并发
上面的例子里Unlock会在return语句读取完balance的值之后执行,所以Balance函数是并发安全的。
KevinYan
2020/01/13
3770
GoLang内存模型
Go语言的内存模型规定了一个goroutine可以看到另外一个goroutine修改同一个变量的值的条件,这类似java内存模型中内存可见性问题(Java内存可见性问题可以参考拙作:Java并发编程之美一书)。
加多
2019/03/12
8700
Go基于共享变量的并发原理及实例 【Go语言圣经笔记】
前一章我们介绍了一些使用goroutine和channel这样直接而自然的方式来实现并发的方法。然而这样做我们实际上回避了在写并发代码时必须处理的一些重要而且细微的问题(笔者注:一谈到并发,就需要处理对共享变量等公共资源的访问问题,不合理的访问问题会造成一系列诸如丢失修改、读脏数据、重复读等常见并发问题)。
Steve Wang
2021/12/06
1K0
golang happens before内存模型
happens-before是一个术语,并不仅仅是Go语言才有的。假设A和B表示一个多线程的程序执行的两个操作。如果A happens-before B,那么A操作对内存的影响 将对执行B的线程(且执行B之前)可见。 内存模型描述的是 “在一个 groutine 中对变量进行读操作能够侦测到在其他 gorountine 中对改变量的写操作” 的条件。
golangLeetcode
2022/08/03
4870
Go语言同步(Synchronization)
Go语言同步(Synchronization) 1. 初始化 程序的初始化在一个独立的goroutine中执行。在初始化过程中创建的goroutine将在 第一个用于初始化goroutine执行完成后启动。 如果包p导入了包q,包q的init 初始化函数将在包p的初始化之前执行。 程序的入口函数 main.main 则是在所有的 init 函数执行完成 之后启动。 在任意init函数中新创建的goroutines,将在所有的init 函数完成后执行。 2. Goroutine的创建 用于启动goroutin
李海彬
2018/03/23
6500
条件变量Cond实现
下面是wikipedia对条件变量的定义,大体是说条件变量总的来说是等待特定条件的线程的容器。
数据小冰
2022/08/15
5800
条件变量Cond实现
Go 语言并发编程之互斥锁 sync.Mutex
Go 标准库 sync 提供互斥锁 Mutex。它的零值是未锁定的 Mutex,即未被任何 goroutine 所持有,它在被首次使用后,不可以复制。
frank.
2024/11/19
900
Go 语言并发编程之互斥锁 sync.Mutex
Golang 并发编程之同步原语
当提到并发编程、多线程编程时,我们往往都离不开『锁』这一概念,Go 语言作为一个原生支持用户态进程 Goroutine 的语言,也一定会为开发者提供这一功能,锁的主要作用就是保证多个线程或者 Goroutine 在访问同一片内存时不会出现混乱的问题,锁其实是一种并发编程中的同步原语(Synchronization Primitives)。
KevinYan
2020/05/20
1.2K0
go: 同步原语详解
同步原语是计算机科学中用于实现进程或线程之间同步的机制。它提供了一种方法来控制多个进程或线程的执行顺序,确保它们以一致的方式访问共享资源。
运维开发王义杰
2024/02/26
2810
go: 同步原语详解
Go语言并发常见问题:A-Study-of-Real-World-Data-Races-in-Golang
data race的检测可以通过go build中加入-race来进行。详情见此文所举的例子
千灵域
2022/06/17
6190
Go语言并发常见问题:A-Study-of-Real-World-Data-Races-in-Golang
并发编程,为什么选Go?
导语 | 代码的稳健、可读和高效是我们每一个coder的共同追求。本文将结合Go语言特性,为书写高效的代码,力争从并发方面给出相关建议。让我们一起学习Go高性能编程的技法吧~ 在上篇《再不Go就来不及了!Go高性能编程技法解读》中我们结合Go语言特性,为书写高效的代码,从常用数据结构、内存管理两个方面给出相关建议,本篇将深入并发这部分进行阐述。 一、并发编程 (一)关于锁 无锁化 加锁是为了避免在并发环境下,同时访问共享资源产生的安全问题。那么,在并发环境下,是否必须加锁?答案是否定的。并非所有的并发都需要
腾讯云开发者
2022/03/30
6670
Golang 基础:底层并发原语 Mutex RWMutex Cond WaitGroup Once等使用和基本实现
上一篇 《原生并发 goroutine channel 和 select 常见使用场景》 介绍了基于 CSP 模型的并发方式。
张拭心 shixinzhang
2022/05/10
4010
Golang 基础:底层并发原语 Mutex RWMutex Cond WaitGroup Once等使用和基本实现
2022-07-10:以下go语言代码输出什么?A:A,B;B:A,C:A,fatal error;D:fatal error...
2022-07-10:以下go语言代码输出什么?A:A,B;B:A,C:A,fatal error;D:fatal error...
福大大架构师每日一题
2022/07/10
2900
2022-07-10:以下go语言代码输出什么?A:A,B;B:A,C:A,fatal error;D:fatal error...
go进阶(1) -深入理解goroutine并发运行机制
并发指的是同时进行多个任务的程序,Web处理请求,读写处理操作,I/O操作都可以充分利用并发增长处理速度,随着网络的普及,并发操作逐渐不可或缺 
黄规速
2023/02/27
4.2K0
go进阶(1) -深入理解goroutine并发运行机制
浅谈Go并发原语
在操作系统中,往往设计一些完成特定功能的、不可中断的过程,这些不可中断的过程称为原语。
闫同学
2024/02/12
3770
GO 语言处理并发的时候我们是选择sync还是channel
以前写 C 的时候,我们一般是都通过共享内存来通信,对于并发去操作某一块数据时,为了保证数据安全,控制线程间同步,我们们会去使用互斥锁,加锁解锁来进行处理
阿兵云原生
2023/10/24
2340
GO 语言处理并发的时候我们是选择sync还是channel
互斥锁与读写锁:如何使用锁完成Go程同步?
这张图容易让人产生误解,容易让人误以为goroutine1获取的锁,只有goroutine1能释放,其实不是这样的。“秦失其鹿,天下共逐之”。在这张图中,goroutine1与goroutine2竞争的是一种互斥锁。goroutine1成功获取锁以后,锁变成锁定状态,此时goroutine2也可以解锁。
LIYI
2021/01/26
1.1K0
Go Mutex:保护并发访问共享资源的利器
Go 语言以 高并发 著称,其并发操作是重要特性之一。虽然并发可以提高程序性能和效率,但同时也可能带来 竞态条件 和 死锁 等问题。为了避免这些问题,Go 提供了许多 并发原语,例如 Mutex、RWMutex、WaitGroup、Channel 等,用于实现同步、协调和通信等操作。
陈明勇
2023/04/24
5730
Go Mutex:保护并发访问共享资源的利器
Go 并发编程之 Mutex
友情提示:此篇文章大约需要阅读 18分钟0秒,不足之处请多指教,感谢你的阅读。 订阅本站
Meng小羽
2020/11/23
6220
Go 并发编程之 Mutex
【Golang】并发
go 程(goroutine)是 go 并发的核心,它比线程要更小, 由 go Runtime 管理,运行 goroutine 只需要很少的栈空间,因此可以实现很大的并发量,在 go 中,开启一个 goroutine 只需要使用 go 关键字即可:
JuneBao
2022/10/26
4380
推荐阅读
相关推荐
《Go语言程序设计》读书笔记(七)基于共享变量的并发
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文