摘要:
不管是在普通的H5页面还是在微信小程序中,底部输入框一直是一大难题,因为键盘会在某些情况下遮挡信输入框一部分!值得庆幸的是:在微信小程序中,我们可以通过监听bindfocus来获取键盘的高度,动态算出输入框距离屏幕顶部的距离…

大纲

  • 一、需求
  • 二、黑暗和光明
  • 三、手写demo
    • 3.1、需求分析
    • 3.2、组件封装
    • 3.3、调用组件
  • 四、demo源码
  • 五、其他说明

一、需求

年前,公司的小程序中新增了一个用户评论的需求,效果图长这个样子。如图:小程序中有一个写评论的需求.png

二、黑暗和光明

搞过底部输入框的看官都知道,这玩意儿真的是太坑了!在普通的移动端H5页面中,想监听软键盘高度?想监听页面的resize变化?想法总是美好的,但实现起来,哼,别做梦了!特别是在苹果手机上,底部的输入框时不时会被系统软键盘遮挡!即使不被系统键盘挡住,在某些低版本的微信上,可能还会出现键盘不见了,输入框在半空中的尴尬场景(经测试跟css布局也有关系)! 关键是,前端目前的解决方案也挺鸡肋的!比较幸运的是:微信小程序中提供了监听软键盘高度的bindfocus方法,这样一来,我们就离成功更进了一步。

下面,艺灵就为看官们复现上述的demo,最终演示的demo效果如图:演示demo在微信开发者工具中的效果.png
当然了,如果只在微信开发者工具中截图是没有说服力的,必须要在苹果手机上跑代码才行。特意录制了一个小视频,戳下方图片即可播放。戳我播放底部评论框在苹果6手机中的效果.mp4

怎么样,看上面的演示效果还不错吧!下面开始步入今天的主题,看官们准备好了吗?

三、手写demo

3.1、需求分析

写代码前需要做下需求分析,通过在项目中的使用场景来看,这个评论框会出现在多处。比如:资讯下面、名片下面、商品下面… 所以,我们可以把评论框封装成一个通用的组件component,这样无论是修改还是调用都比较方便。

再进一步分析,默认展示的底部输入框在不同的地方样式不一样,但弹层中的输入框是一致的。所以,将弹层和输入框封装成一个组件是最好的选择。至于是资讯的评论还是商品的评论还是名片的评论,接口调用全在外层,组件内只管好自身,数据往外传即可。

好了,需求分析完毕,下面来看下我们的目录结构吧!

// 微信小程序中的目录结构
components /* 组件目录 */textarea-fixed-bottom /* 固定在底部的输入框组件目录 */index.js /* js文件,交互及逻辑都在这里(可以当成.js来理解) */index.json /* json文件,可配置标题、引用组件等 */index.wxml /* wxml模板文件,前台展示(可以当成.html来理解) */index.wxss /* wxss样式文件(可以当成.css来理解) */
pages /* pages目录 */index /* 首页目录 */index.js /* js文件 */index.json /* json文件 */index.wxml /* wxml模板文件 */index.wxss /* wxss样式文件 */

3.2、组件封装

刚刚已经把目录的结构定了,现在再来仔细的分析下这个弹层页面的交互吧。弹层页面的内容有:半透明背景层、输入框、提交按钮、字数这四样东西。wxss样式比较好实现但也有坑!最难搞的还是.js,下面继续分析下有哪些js事件。

  • bindfocus:输入框获取焦点,同时可监听软键盘高度
  • bindblur:输入框失去焦点,用于关闭弹层;
  • bindinput:监听输入框,用于时时显示字数;
  • bindconfirm:监听键盘上的完成按钮(此demo中禁用完成按钮的显示);
  • bindkeyboardheightchange:监听键盘高度发生变化(此demo中也未使用)
  • 输入框相关的js事件就没有了,但并不表示以上事件就能满足需求!比如:点击半透明背景时需要关闭弹层,点击非输入框区域时也需要关闭弹层,还有滑动屏幕时也需要关闭弹层[:笑哭]。此时,我们还需要再添加两个js事件,分别是:
  • catchtap:绑定并阻止事件冒泡;
  • catchtouchmove:阻止穿透滚动;

现在基本上差不多了,但没有完。我们还需要检测用户使用的是安卓机还是苹果机,毕竟官方的textarea是有个巨坑的!参见2018年的一篇文章《微信小程序从入坑到放弃之坑八:textarea在苹果手机中的大Bug》,由于文章写的比较早,不够详细,待明天再补发一篇。检测用户的机型可以使用wx.getSystemInfo这个API,然后判断platform的值即可。 由于js代码比较多,此处就不一一粘贴了,完整的及注释都在源码里面,此处就略过。

接下来看下最终的wxml模板页面吧。

// 组件的WXML源码
<view class="popup-evaluation__bg {{info.isShow === true ? 'is__show' : ''}}" catchtap="handleClose" catchtouchmove="handleEvaluationtouchmove"><view class="popup-evaluation-wrap" catchtap="handleEvaluationCatchTap" style="top:{{focusTop}};height:{{domHeight}}"><view class="popup-evaluation__body"><textarea name="evaluation" class="popup-evaluation__textatrea {{platform === 'ios' ? 'textatrea_ios_bug' : ''}}" maxlength="{{maxLength}}" focus="{{info.isShow}}" bindfocus="handleEvaluationFocus" bindinput="handleEvaluationInput" bindconfirm="handleEvaluationConfirm" bindblur="handleEvaluationBlur" show-confirm-bar="{{false}}" adjust-position="{{false}}" value="{{commentsText}}" fixed="{{true}}"> </textarea></view><view class="popup-evaluation__foot"><view class="popup-evaluation__length">{{commentsText.length}} / {{maxLength}}</view><button class="popup-evaluation__button button_theme_primary" type="primary" bindtap="handleEvaluationRelease">发表评论</button></view></view>
</view>

关于wxss样式,推荐fixed + 100vh(背景高度)+ absolute(评论框)的组合,具体的见在下面的源码。切记:最好不要使用wx:ifwx:showvisible 来控制弹层的显示与隐藏!!!也别问为哈,有兴趣的看官准备几个苹果手机,微信跨几个版本自行体验即可。保证把你坑哭到不要不要的!!![:调皮]

组件说完了,再来说下如何调用。此处以首页pages/index为例。

3.3、调用组件

首先要修改pages/index/index.json配置文件,源码如下:

// index/index.json
{"usingComponents": {"textareaFixedBottom": "/components/textarea-fixed-bottom/index"},"navigationBarTitleText": "底部评论框"
}

修改后,我们在/pages/index/index.wxml页面上调用textareaFixedBottom即可引入我们前面封装好的评论框组件,源码如下:

// index/index.wxml
<!-- 固定在底部的输入框 start -->
<view class="commentContent" bindtap="handleIsShowComment"><view>写评论...</view>
</view>
<!-- 弹层评论框 start -->
<textareaFixedBottom info="{{popupEvaluation}}" bind:myeventEvaluationRelease="handleEvaluationRelease" bind:myeventEvaluationClose="handleEvaluationClose"></textareaFixedBottom>
<!-- 弹层评论框 end -->
<!-- 固定在底部的输入框 end -->

再写下/pages/index/index.wxss就有点样子了。源码如下:

// index/index.wxss
/* 评论框 yiling 20200408 start */
.commentContent {position: fixed;bottom: 20rpx;left: 20rpx;right: 20rpx;font-size: 24rpx;border: 2rpx solid #f0f0f0;border-radius: 34rpx;padding: 20rpx;color: #999;line-height: 24rpx;
}
/* 评论框 yiling 20200408 end */

由于demo中不方便跟后端通信,所以此处在点击发表评论后,前端直接把数据展示在页面上。最终演示效果见视频:戳我观看兼容苹果手机的评论框模拟发表评论.mp4

怎么样,是不是很赞?喜欢就点个star吧!

四、demo源码

demo源码已上传到了github上,如果看官需要研究源码,可以点击下面的链接进行访问并下载。前往github仓库下载源码

源码中会有必要注释和本篇文章的所有示例。若有疑问可与艺灵联系,方式见下方二维码或右侧。

五、其他说明

原文首发于艺灵设计,转载请注明来源,谢谢。

微信小程序从入坑到放弃二十二:完美兼容安卓和ios手机的底部评论框相关推荐

  1. 微信小程序从入坑到放弃二十九:一个小场景搞懂冒泡事件bindtap和catchtap的区别

    摘要: 在微信小程序中,bindtap事件会产生冒泡,若不加以拦截,会一直冒泡到顶端.在某些情况下,一次点击会触发若干点击事件.为了防止冒泡,使用catchtap即可解决问题.在有全屏半透明背景的弹出 ...

  2. 微信小程序继续入坑指南

    微信小程序继续入坑指南 wxml 类似于html 感觉和ejs灰常的相似 数据绑定 js Page({data: {message: "hello world"} }) wxml ...

  3. 【微信小程序】从入门到放弃

    前言 关于微信小程序是什么,能做什么的问题,草民在此不在罗列了,随着小程序的天天刷屏,想必您也是来吃一些干货,本篇博文和大家走进微信小程序的从入门到放弃~ 微信小程序开放功能 草民看过很多的文档,微信 ...

  4. 微信小程序初步入坑指南

    微信小程序初步入坑小指南 安装工具 developers.weixin.qq.com/miniprogram- 打开链接下载小程序云开发 app.json 为json格式的文件,为一个配置文件,属于全 ...

  5. 微信小程序--放入个性化手绘地图具体步骤(腾讯地图)

    微信小程序–放入个性化手绘地图具体步骤(腾讯地图) 前言:小程序中想要实现个性化手绘地图需要通过H5嵌入的模式进行实现. 1.首先需要一个腾讯地图的账号(微信登录即可),然后选择个性化地图进入(htt ...

  6. 两百条微信小程序开发跳坑指南(不定时更新)

    2019独角兽企业重金招聘Python工程师标准>>> 微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合 跳坑<二百一 ...

  7. 前端《Vue.js从入门到项目实战》PDF课件+《微信小程序实战入门第2版》PDF代码调试

    JS进行开发,正如一切的编程语言都立足于电元信号的正负极,即01码,可为什么软件都不采用二进制编码来 进行开发呢?这里面牵扯到一个成本的问题,这正是影响项目领导者进行决策的关键因素.Vue项目与原生J ...

  8. 微信小程序云开发实战:网上商城(二)

    微信小程序云开发实战:网上商城(二) 主页面 入口页面 云函数与云数据库 代码实现 云端实现 小程序端实现 选择UI组件库 WeUI Vant 整合UI组件库 以扩展包的方式引入weui 接下来 主页 ...

  9. (微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好

    转载地址:(微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好 转载请注明出处 作者:Happy王子乐 个人网站(整理 ...

最新文章

  1. Windows Server 2008防火墙问题及Sql Server2005用户登录问题
  2. java 随机数 分布_java – 随机数的分布
  3. 数学--数论--POJ281(线性同余方程)
  4. 使用dbUnit,JSON,HSQLDB和JUnit规则进行数据库单元测试
  5. 2018最佳GAN论文回顾(上)
  6. 实战:基于RabbitMQ的TTL以及死信队列,实现延迟付款,手动补偿案例
  7. 【通信】基于matlab量子密钥分发密钥率仿真【含Matlab源码 1662期】
  8. 软件测试入门基础自卸
  9. 直方图均衡化作用及实现
  10. 【教程】如何查看自己的外网ip是不是公网ip
  11. Java 金额转换帮助类(元转分)
  12. pytorch nn.AdaptiveAvgPool2d(1)
  13. NBT:扩增子及其他测序的最少信息标准和测序规范(MIMARKS)
  14. Entire Space Multi-Task Model: An Effective Approach for Estimating Post-CVR (ESSM)
  15. MySQL数据库知识大全
  16. java int过长_java - 为什么长,不是int否则限制时间超过 - SO中文参考 - www.soinside.com...
  17. 反射、装箱拆箱、ArrayList与Array的区别 - 天生舞男 - 博客园
  18. [zz]美团点评智能支付核心交易系统的可用性实践
  19. C++ 引用与引用作为函数的参数
  20. 一些适合程序员玩的游戏

热门文章

  1. C++ 工程实践:避免使用虚函数作为库的接口
  2. 多平台epub阅读器推荐
  3. 在全民直播的背景下,金融机构做直播带货是必须的吗?
  4. Windows电脑键盘快捷键大全【最全的快捷键】
  5. java 当前时间戳_通过各种方法 获取当前系统时间、时间戳
  6. 把金额类型转换成大写和英文
  7. java判断任意两数的最小公倍数和最大公约数
  8. excel多个窗口独立显示_【技巧】35个Excel表格的基本操作技巧!年前最后一次更新!...
  9. 【深度学习入门:基于Python的理论与实现】书本学习笔记 第三章 神经网络
  10. 统计大写的辅音字母 C语言