为了实现小程序底部固定悬浮的评论输入框,实现过程中,键盘弹起有很多交互问题,解决过程记录一下。

先上效果图:

以下为实现代码:

布局:

<view class='commentsInputLayout' wx:if="{{isVideoInfoShow}}" style="bottom:{{keyboardHeight}}px">

<input value='{{commentsContent}}' type='text' maxlength='100' class='commentsInput' placeholder='请输入评论内容(100字以内)' placeholder-class='phcolor' bindinput='inputCommentsContentListening' bindfocus="inputCommentsFocus" bindblur="inputCommentsBlur"></input>

<text class='commentsBtn' bindtap='clickComments'>评论</text>

</view>

css:

.commentsInputLayout {

width: 100%;

height: 100rpx;

position: fixed;

bottom: 0rpx;

left: 0rpx;

right: 0rpx;

z-index: 20;

display: -webkit-flex;

display: flex;

flex-direction: row;

align-items: center;

justify-content: center;

background-color: #fff;

/* 使之可以滚动 *//* overflow-y: scroll; *//* 增加该属性,可以增加弹性,是滑动更加顺畅 */

-webkit-overflow-scrolling: touch;

}

/** border-top必须设置,如不设置在部分机型上会出现定位不准问题*/

.commentsInput {

width: auto;

height: 100rpx;

line-height: 100rpx;

position: relative;

flex: 1;

padding-left: 30rpx;

padding-right: 30rpx;

font-size: 32rpx;

word-break: break-all;

word-wrap: break-word;

color: #333;

border-top: solid #f4f4f4 0.01rpx;

background-color: #f4f4f4;

z-index: 21;

}

/** border-top必须设置,如不设置在部分机型上会出现定位不准问题*/

.commentsBtn {

height: 100rpx;

line-height: 100rpx;

position: relative;

font-size: 32rpx;

color: #fff;

border-top: solid #2b3e61 0.01rpx;

padding-left: 30rpx;

padding-right: 30rpx;

background-color: #2b3e61;

z-index: 21;

}

js中的实现(关键):

/**

* 页面的初始数据

*/

data: {

windowHeight: 0,//记录界面高度

containerHeight: 0,//记录未固定整体滚动界面的高度

containerBottomHeight: 0,//记录未固定整体滚动界面距离底部高度

keyboardHeight: 0,//键盘高度

isIphone: false//是否为苹果手机,因苹果手机效果与Android有冲突,所以需要特殊处理

}

/**

* 生命周期函数--监听页面加载

*/

onLoad: function(options) {

var that = this

//获取屏幕高度以及设备信息(是否为苹果手机)

wx.getSystemInfo({

success: function(res) {

that.data.windowHeight = res.windowHeight

that.data.isIphone = res.model.indexOf("iphone") >= 0 || res.model.indexOf("iPhone") >= 0

// console.error(res)

}

});

}

/**

* 生命周期函数--监听页面初次渲染完成

*/

onReady: function() {

var that = this

setTimeout(() => {

//界面初始化渲染需要初始化获取整体界面的高度以及距离信息

that.refreshContainerHeight()

}, 800);

}

/**

* 刷新整体界面高度、距离等信息,如列表有上划加载数据,需要在数据加载过后调用此方法进行高度以及间距的刷新

*/

refreshContainerHeight: function() {

var that = this

var query = wx.createSelectorQuery();

query.select('.container').boundingClientRect()

query.exec((res) => {

//container为整体界面的class的样式名称

that.data.containerHeight = res[0].height;

that.data.containerBottomHeight = res[0].bottom

})

}

/**

* 界面滚动监听

*/

onPageScroll: function(e) {

var that = this

// 界面滚动刷新整体界面高度以及间距

that.refreshContainerHeight()

}

/**

* 评论框焦点获取监听

*/

inputCommentsFocus: function(e) {

var that = this

if (!that.data.isIphone) {

var keyboardHeight = e.detail.height

var windowHeight = that.data.windowHeight

var containerHeight = that.data.containerHeight

var containerBottomHeight = that.data.containerBottomHeight

//整体内容高度大于屏幕高度,才动态计算输入框移动的位置;

if (containerHeight > windowHeight) {

if ((containerBottomHeight - windowHeight) > keyboardHeight) {

//距离底部高度与屏幕高度的差值大于键盘高度,则评论布局上移键盘高度;

that.setData({

keyboardHeight: e.detail.height

})

} else {

//距离底部高度与屏幕高度的差值小于键盘高度,则评论布局上移距离底部高度与屏幕高度的差值;

var newHeight = containerBottomHeight - windowHeight

that.setData({

keyboardHeight: newHeight

})

}

} else {

that.setData({

keyboardHeight: 0

})

}

} else {

that.setData({

keyboardHeight: 0

})

}

},

/**

* 评论框焦点失去监听

*/

inputCommentsBlur: function(e) {

var that = this

that.setData({

keyboardHeight: 0

})

}

注意1:需要整体界面内容放在scroll-view中,如不加会影响滑动效果;

<view class='container'>

<scroll-view scroll-y="{{true}}">

//此处放界面显示的内容

</scroll-view>

</view>

//固定悬浮底部的输入框,如输入框覆盖部分内容,适当给内容View设置manger-bottom解决;

<view class='commentsInputLayout' wx:if="{{isVideoInfoShow}}" style="bottom:{{keyboardHeight}}px">

<input value='{{commentsContent}}' type='text' maxlength='100' class='commentsInput' placeholder='请输入评论内容(100字以内)' placeholder-class='phcolor' bindinput='inputCommentsContentListening' bindfocus="inputCommentsFocus" bindblur="inputCommentsBlur"></input>

<text class='commentsBtn' bindtap='clickComments'>评论</text>

</view>

注意2:关键点在于这个地方,style="bottom:{{keyboardHeight}}px"此处根据界面高度、界面布局内容高度、滑动情况等综合情况去动态设置输入框布局的位置;

还存在的问题:华为手机上,键盘弹起速度比较慢并且键盘布局下是透明的,所以界面被顶起以后会有一瞬间看到前一个界面的内容,此问题还需解决研究优化解决。

小程序固定底部悬浮输入框,跟随键盘移动解决方案相关推荐

  1. 解决uni-app微信小程序底部input输入框,键盘弹起时页面整体上移问题

    一.存在的问题:          微信小程序聊天界面,当input 框获取焦点时会自动调起手机键盘,当键盘弹起时,会导致页面整体上移,页面头信息会消失不见. 二.需要实现的效果 键盘弹出时, 底部的 ...

  2. Taro小程序,底部输入框获取键盘高度动态设置bottom有延迟解决

    Taro小程序,底部输入框获取键盘高度动态设置bottom有延迟0.5s左右 业务场景: Taro+TaroUI+微信小程序 底部固定了一个输入框,当聚焦时输入框自然要上推页面才合理.但不能设置adj ...

  3. native固定吸顶 react_React Native固定底部TextInput,解决键盘遮挡、列表滚动问题

    效果图 timer.gif 做类似于微信聊天输入框,可能会遇到下面三个小困扰,记录一下. 目录 # 1.React Native固定底部TextInput # 2.键盘遮挡问题 # 3.列表滚动问题 ...

  4. c语言弹出文本框,微信小程序弹出文本输入框

    你应该用 点击详情.了解更多! 详情 史蒂芬孙 2018-12-19 00:54 0评论 0赞同 在微信平台下开发小程序,接口输出的数据应该一致,如果是ios不一致,也应该由基础库去实现 详情 Sac ...

  5. 微信小程序基础之input输入框控件

    今天主要详写一下微信小程序中的Input输入框控件,输入框在程序中是最常见的,登录,注册,获取搜索框中的内容等等都需要,同时,还需要设置不同样式的输入框,今天的代码中都要相应的使用. input输入框 ...

  6. 解决小程序自定义底部菜单切换闪动

    解决小程序自定义底部菜单切换闪动 业务上可能会有一个需求使用自定义底部菜单相信会有很多人遇到过这个需求 但是自定义底部菜单会有一个问题,在点击切换页面的时候底部菜单会重新加载,导致页面闪动,比较影响用 ...

  7. 微信小程序iPhoneX 底部虚拟Home键区域适配方案

    微信小程序iPhoneX 底部虚拟Home键区域适配方案 为什么要适配? 先看下iPhoneX和之前的iPhone的区别,如下图 可以看出主要是顶部和底部多了一些区域,如果页面内容进入该区域,有可能会 ...

  8. 在微信小程序中做自己的数字键盘

    在微信小程序中做自己的数字键盘 为什么要自制键盘? 使用系统键盘带来的不便 理想的自制键盘效果 怎样自制键盘? 键盘的效果 为什么要自制键盘? 我最近在开发一款微信小程序,现在需要用户输入一个数字. ...

  9. html自定义js程序,JS中微信小程序自定义底部弹出框

    实现微信小程序底部弹出框效果,代码分为html,css和js两部分,具体代码详情大家参考下本文. html CSS .commodity_screen { width: 100%; height: 1 ...

最新文章

  1. 云计算与虚拟化以及IaaS, PaaS和SaaS
  2. 推荐:学习自然语言处理(NLP)的学习方法和资料合集
  3. ajax点评wnv冠军,对话wNv高层探知焦点 剑指世界冠军铸就王者路
  4. iPhone12详细拆解报告出炉!(附主要器件清单)
  5. 机器学习之特征工程-特征选择
  6. 正则表达式30分钟入门教程--deerchao
  7. Output argument fuse (and maybe others) not assigned during call to
  8. c语言删除行尾的空格,新人提问:如何将输出时每行最后一个空格删除
  9. vue 事件调用 传参_高效开发小程序,Vue 和微信小程序的区别你该了解一下
  10. CORS Filter
  11. arcgis 去除影像黑色边框(nodata)
  12. Chromium浏览器修改网页显示字体
  13. 通用权限管理系统项目简单介绍
  14. SYSLINUX 6.03不支持64bit的ext4
  15. 使用Google reCAPTCHA进行人机验证
  16. UE4.26水系统和浮力系统
  17. java读取文件夹下所有文件并替换文件每一行中指定的字符串
  18. csgo 放置机器人_csgo怎么在确定位置放置一个bot?
  19. 面试时想拿 13K,HR 说你只值 8K,该怎么回答?
  20. Vue - 列表拖曳排序 / 鼠标拖动改变顺序排列高效简洁组件(支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无 BUG)

热门文章

  1. 考研思维导图(考研数学二/考研计算机数据结构/考研政治)
  2. ubuntu19.04下绑定USB读卡器/U盘每次开机后设备号绑定不变
  3. python字符串替换replace,Python字符串替换
  4. 2013-03-05 By dapps  苹果应用商店AppStore审核中文指南(译本)
  5. 程序员脱单海滩烧烤party
  6. object-fit : CSS 图片自适应
  7. 日系车集体溃败新能源,不止中国市场!
  8. 晚上睡觉前除了晚安,还能说什么?
  9. redis中遍历List、set集合
  10. [Leetcode] 304. Range Sum Query 2D - Immutable 解题报告