微信小程序实现动态获取元素宽高的方法分析


Posted in Javascript onDecember 10, 2018

本文实例讲述了微信小程序实现动态获取元素宽高的方法。分享给大家供大家参考,具体如下:

我以前一直以为微信小程序不能动态获取view元素的宽高。但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了。。。

那么,这个api接口怎么用呢?

首先,这个接口会返回一个对象实例。

var obj=wx.createSelectorQuery();

下面的就是返回的对象实例 obj 的所有内容。

微信小程序实现动态获取元素宽高的方法分析

返回的 obj 有五个方法:

1.  obj.in(component):没用过这个方法,多用于组件的选择器。

2.  obj.select(selector):获取指定的节点,selector是css选择器。返回一个 NodesRef 对象实例,可以用于获取节点信息。

3.  obj.selectAll(selector):获取指定的节点,selector是css选择器。返回一个 NodesRef 对象实例,可以用于获取节点信息。

上面这两个我感觉就是 js 中querySelector和querySelectorAll的区别。

4. obj.selectViewport():我没用过这个方法。官方说是选择显示区域,可用于获取显示区域的尺寸、滚动位置等信息。也是返回一个 NodesRef 对象实例,可以用于获取节点信息。

5. exec( function(res){} ):执行所有的请求,请求结果按请求次序构成数组,在callback的第一个参数中返回

上面返回的 NodesRef 对象实例就很重要了,它有三个方法:

1. boundingClientRect( function(rect){} ):就是这个方法,能够动态获取view元素的高度、宽度等属性。还有其它的请看官方文档

2. scrollOffset( function(res) {}):获取节点的水平、垂直滚动的位置等。节点必须是scroll-view或者viewport

3. fields(fields,function(){res} ):这个可以获取指定元素的自定义属性和class名,具体的请看官方文档的说明。

废话了这么多,真正的实例用法:

wx.createSelectorQuery().selectAll('.npl-intro').boundingClientRect(function (rect) {
  console.log(rect[0].height)
  console.log(rect[0].width)
}).exec()

如果觉得这样写有点长。可以分步写。也是一样的结果。

var obj=wx.createSelectorQuery();
obj.selectAll('.npl-intro').boundingClientRect(function (rect) {
  console.log(rect[0].height)
  console.log(rect[0].width)
})
obj.exec() ;

或者在exec中返回,如果出现上面的方式出现获取到的 rect 是 null 的话,可以考虑用下面这种,就不会出现问题。结果是一样的。

var obj=wx.createSelectorQuery();
obj.selectAll('.npl-intro').boundingClientRect();
obj.exec(function (rect) {
  console.log(rect[0].height)
  console.log(rect[0].width)
}) ;

当然,这方法可以写在onLoadonReadyonShow等这些生命周期的方法,也可以写在自定义的方法里。什么时候需要,什么时候就调用。

注意:如果要获取通过wx:ifsetData来实现显示与隐藏的元素,调用的这个方法的时候可能出现获取到的内容为null。我的解决办法是加个定时器:因为这个获取元素的方法是异步的,所以只有拖延点时间再去获取,不然有可能元素还未加载出来,就调用了这个方法,当然返回的结果就是null了。

//动态设置高度
setTimeout(function () {
  var query = wx.createSelectorQuery();
  query.select('.nd-btnBox').boundingClientRect();
  query.exec(function (rect) {
    if (rect[0] === null) return;
    that.setData({
      marginBM: rect[0].height + 10
    })
  });
}, 500)

官方 wx.createSelectorQuery() 接口

希望本文所述对大家微信小程序开发有所帮助。

Javascript 相关文章推荐
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
Jun 20 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
Nov 19 Javascript
深入了解JavaScript中的Symbol的使用方法
Jul 28 Javascript
node.js 动态执行脚本
Jun 02 Javascript
javascript实现非常简单的小数取整功能示例
Jun 13 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
Jul 27 Javascript
Vue中render方法的使用详解
Jan 26 Javascript
详解在React中跨组件分发状态的三种方法
Aug 09 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
Sep 11 Javascript
vue 中固定导航栏的实例代码
Nov 01 Javascript
vue video和vue-video-player实现视频铺满教程
Oct 30 Javascript
js动态添加带圆圈序号列表的实例代码
Feb 18 Javascript
PM2自动部署代码步骤流程总结
Dec 10 #Javascript
vue路由前进后退动画效果的实现代码
Dec 10 #Javascript
Vue.js子组件向父组件通信的方法实例代码详解
Dec 10 #Javascript
vue 基于element-ui 分页组件封装的实例代码
Dec 10 #Javascript
JavaScript对象拷贝与赋值操作实例分析
Dec 10 #Javascript
express 项目分层实践详解
Dec 10 #Javascript
JS选取DOM元素常见操作方法实例分析
Dec 10 #Javascript
You might like
PHP中session跨子域的三种实现方法
2016/07/25 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
YII框架关联查询操作示例
2019/04/29 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
简略的前端架构心得&&基于editor为例子的编码小技巧
2010/11/25 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
python制作填词游戏步骤详解
2019/05/05 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
Gap英国官网:Gap UK
2018/07/18 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
财务会计专业应届毕业生求职信
2013/10/18 职场文书
工地质量标语
2014/06/12 职场文书
鼓舞士气的口号
2014/06/16 职场文书
观看信仰心得体会
2014/09/04 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
员工年度工作总结2015
2015/05/18 职场文书
第二次离婚起诉书
2015/05/18 职场文书
常用的Python代码调试工具总结
2021/06/23 Python
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
Oracle锁表解决方法的详细记录
2022/06/05 Oracle