微信小程序从入坑到放弃二十二:完美兼容安卓和ios手机的底部评论框
摘要:
不管是在普通的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:if
或 wx:show
或 visible
来控制弹层的显示与隐藏!!!也别问为哈,有兴趣的看官准备几个苹果手机,微信跨几个版本自行体验即可。保证把你坑哭到不要不要的!!![:调皮]
组件说完了,再来说下如何调用。此处以首页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手机的底部评论框相关推荐
- 微信小程序从入坑到放弃二十九:一个小场景搞懂冒泡事件bindtap和catchtap的区别
摘要: 在微信小程序中,bindtap事件会产生冒泡,若不加以拦截,会一直冒泡到顶端.在某些情况下,一次点击会触发若干点击事件.为了防止冒泡,使用catchtap即可解决问题.在有全屏半透明背景的弹出 ...
- 微信小程序继续入坑指南
微信小程序继续入坑指南 wxml 类似于html 感觉和ejs灰常的相似 数据绑定 js Page({data: {message: "hello world"} }) wxml ...
- 【微信小程序】从入门到放弃
前言 关于微信小程序是什么,能做什么的问题,草民在此不在罗列了,随着小程序的天天刷屏,想必您也是来吃一些干货,本篇博文和大家走进微信小程序的从入门到放弃~ 微信小程序开放功能 草民看过很多的文档,微信 ...
- 微信小程序初步入坑指南
微信小程序初步入坑小指南 安装工具 developers.weixin.qq.com/miniprogram- 打开链接下载小程序云开发 app.json 为json格式的文件,为一个配置文件,属于全 ...
- 微信小程序--放入个性化手绘地图具体步骤(腾讯地图)
微信小程序–放入个性化手绘地图具体步骤(腾讯地图) 前言:小程序中想要实现个性化手绘地图需要通过H5嵌入的模式进行实现. 1.首先需要一个腾讯地图的账号(微信登录即可),然后选择个性化地图进入(htt ...
- 两百条微信小程序开发跳坑指南(不定时更新)
2019独角兽企业重金招聘Python工程师标准>>> 微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合 跳坑<二百一 ...
- 前端《Vue.js从入门到项目实战》PDF课件+《微信小程序实战入门第2版》PDF代码调试
JS进行开发,正如一切的编程语言都立足于电元信号的正负极,即01码,可为什么软件都不采用二进制编码来 进行开发呢?这里面牵扯到一个成本的问题,这正是影响项目领导者进行决策的关键因素.Vue项目与原生J ...
- 微信小程序云开发实战:网上商城(二)
微信小程序云开发实战:网上商城(二) 主页面 入口页面 云函数与云数据库 代码实现 云端实现 小程序端实现 选择UI组件库 WeUI Vant 整合UI组件库 以扩展包的方式引入weui 接下来 主页 ...
- (微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好
转载地址:(微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好 转载请注明出处 作者:Happy王子乐 个人网站(整理 ...
最新文章
- Windows Server 2008防火墙问题及Sql Server2005用户登录问题
- java 随机数 分布_java – 随机数的分布
- 数学--数论--POJ281(线性同余方程)
- 使用dbUnit,JSON,HSQLDB和JUnit规则进行数据库单元测试
- 2018最佳GAN论文回顾(上)
- 实战:基于RabbitMQ的TTL以及死信队列,实现延迟付款,手动补偿案例
- 【通信】基于matlab量子密钥分发密钥率仿真【含Matlab源码 1662期】
- 软件测试入门基础自卸
- 直方图均衡化作用及实现
- 【教程】如何查看自己的外网ip是不是公网ip
- Java 金额转换帮助类(元转分)
- pytorch nn.AdaptiveAvgPool2d(1)
- NBT:扩增子及其他测序的最少信息标准和测序规范(MIMARKS)
- Entire Space Multi-Task Model: An Effective Approach for Estimating Post-CVR (ESSM)
- MySQL数据库知识大全
- java int过长_java - 为什么长,不是int否则限制时间超过 - SO中文参考 - www.soinside.com...
- 反射、装箱拆箱、ArrayList与Array的区别 - 天生舞男 - 博客园
- [zz]美团点评智能支付核心交易系统的可用性实践
- C++ 引用与引用作为函数的参数
- 一些适合程序员玩的游戏
热门文章
- C++ 工程实践:避免使用虚函数作为库的接口
- 多平台epub阅读器推荐
- 在全民直播的背景下,金融机构做直播带货是必须的吗?
- Windows电脑键盘快捷键大全【最全的快捷键】
- java 当前时间戳_通过各种方法 获取当前系统时间、时间戳
- 把金额类型转换成大写和英文
- java判断任意两数的最小公倍数和最大公约数
- excel多个窗口独立显示_【技巧】35个Excel表格的基本操作技巧!年前最后一次更新!...
- 【深度学习入门:基于Python的理论与实现】书本学习笔记 第三章 神经网络
- 统计大写的辅音字母 C语言