小程序获取窗口宽高和dom元素

微信小程序中获取DOM数据及操作
文章介绍了如何在微信小程序中通过wx.getSystemInfoSync获取窗口数据,以及使用wx.createSelectorQuery来操作和获取DOM元素信息,包括select方法选择元素,boundingClientRect获取元素属性,以及exec函数处理结果。由于小程序不能直接操作DOM,文中提到了解决矩形查询可能返回null的策略,即使用定时器异步获取。

一、获取手机窗口数据

  1. wx.getSystemInfoSync().windowWidth // 获取当前窗口的宽度
  2. wx.getSystemInfoSync().windowHeight // 获取当前窗口的高度
  3. wx.getSystemInfoSync().model // 获取当前采用的设备
  4. wx.getSystemInfoSync().pixelRatio
  5. wx.getSystemInfoSync().language // 获取当前所采用的的语言
  6. wx.getSystemInfoSync().version // 获取当前设备的版本

二、获取dom元素

var query = wx.createSelectorQuery();  // 创建节点选择器
query.select('.list').boundingClientRect(res=>{
    console.log(res)  // 获取class为list的节点
});
query.selectViewport().scrollOffset();
query.exec((res) => {
    var listHeight = res[0].height; // 获取list高度
});

// 注意:res[0]为当前节点的详细数据;res[1]为显示区域的竖直滚动位置;query.exec((res) => {})中的回调函数是最后执行的,若要获取高度等信息进行操作的话,要在回调函数中进行。

================================= 华丽的分割线 =============================

由于最近开发小程序遇到了相关dom操作的问题,所以在此做下详细介绍:

下面内容引自【传送门】

由于微信官方禁止小程序操作dom元素,因而无法像前端一样操作小程序DOM,好在官方提供了API ,

这个api叫做 wx.createSelectorQuery(),  官方定义:返回一个 SelectorQuery 对象实例。

这个api的select()方法用于查找元素,类似jq的元素选择器

然后有 boundingClientRect(function(res){}) 则返回指定元素的DOM属性,res代表元素本身,(百度了 boundingClientRect :边界中心)

再之后的exec(function(rect){})则是设置元素属性,rect在这里指的是所有匹配到结果的集合,通过调用that/this.setdata({})可以更改元素dom值,请注意!rect是一个数组集合,想要设置某一个元素,需要给该数组加指定元素的下标!

看下面代码:

onReady: function () {
    var that = this
    const query = wx.createSelectorQuery();
    query.select('.cont1').boundingClientRect(function (res) {
//这里返回元素自身的DOM属性
          console.log(res);

    }).exec(function(rect){
        that.setData({
          swiperHeight: rect[0].height + 0
        })
        // rect返回一个数组,需要使用下标0才能找到
        // console.log(s[0].height)
    });
  },

网上听大佬说偶尔会有rect返回为null的意外,昨晚翻遍百度,终于找到了一个解决方法,感谢那位大佬(传送门)

/*原理是使用定时器异步获取dom*/
  setTimeout(function () {
     var query = wx.createSelectorQuery();
       query.select('.cont1').boundingClientRect();
      query.exec(function (rect) {
        if (rect  === null) return;
       that.setData({
          swiperHeight: rect .height + 10  
        })
        
      });
    }, 500) 

以上,有问题欢迎指出!

<think>我们正在处理一个关于Vue 3的问题:如何获取元素高度并设置另一个元素高度。 根据提供的引用,我们可以总结出几种方法,并注意在Vue 3中可能遇到的问题(如获取高度不准确)以及解决方案。 步骤: 1. 获取元素高度:可以使用ref属性来获取DOM元素,然后通过offsetHeight获取高度。 2. 设置元素高度:可以通过绑定样式(如:style)将获取到的高度应用到另一个元素上。 注意:在Vue 3中,由于生命周期响应式系统的变化,我们需要注意在正确的时机获取元素高度(例如在onMounted或nextTick中),并且可能因为渲染问题导致获取高度不准确,这时可能需要使用一些技巧(如延迟获取)。 根据引用[3][5],我们可以使用$refs(在选项式API中)或ref(在组合式API中)来获取元素。在组合式API中,我们使用ref函数创建响应式引用,然后在模板中绑定同名的ref属性。 另外,引用[5]提到在onMounted中获取元素高度可能不准确,因为元素可能还未完全渲染,所以可以使用nextTick或设置定时器等待页面完全加载。 我们将提供两种方式:组合式API选项式API。 组合式API(使用setup语法糖)示例:</think>在 Vue 3 中获取设置元素高度,可通过以下步骤实现: ### 一、获取元素高度(组合式 API) ```vue <script setup> import { ref, onMounted, nextTick } from 'vue' // 1. 创建元素引用 const sourceEl = ref(null) const targetEl = ref(null) const heightValue = ref(0) // 2. 在挂载后获取高度 onMounted(() => { nextTick(() => { // 确保渲染完成 setTimeout(() => { if (sourceEl.value) { // 获取元素高度(包含边框内边距) heightValue.value = sourceEl.value.offsetHeight console.log("元素高度:", heightValue.value) // 设置目标元素高度(示例) if (targetEl.value) { targetEl.value.style.height = `${heightValue.value}px` } } }, 100) // 延迟确保渲染完成[^5] }) }) </script> <template> <!-- 3. 绑定ref到元素 --> <div ref="sourceEl">需要测量高度元素</div> <div ref="targetEl">需要设置高度元素</div> </template> ``` ### 二、关键说明 1. **获取高度方法**: - `offsetHeight`:包含元素高度 + 内边距 + 边框(不包含外边距) - `clientHeight`:包含元素高度 + 内边距(不包含边框) - 根据需求选择合适属性 2. **高度不准确问题处理**: - 使用 `nextTick` 确保 DOM 更新完成 - 添加 `setTimeout` 延迟(50-100ms)避免渲染未完成[^5] - 监听 `window.onresize` 响应窗口变化: ```js window.addEventListener('resize', () => { heightValue.value = sourceEl.value.offsetHeight }) ``` 3. **设置元素高度方式**: - 直接操作样式:`targetEl.value.style.height = '200px'` - 动态绑定样式: ```vue <div :style="{ height: heightValue + 'px' }"></div> ``` ### 三、完整应用场景 ```vue <script setup> import { ref, onMounted } from 'vue' const headerRef = ref(null) const contentHeight = ref(0) onMounted(() => { setTimeout(() => { contentHeight.value = headerRef.value.offsetHeight }, 100) }) </script> <template> <header ref="headerRef">动态高度头部</header> <main :style="{ marginTop: contentHeight + 'px' }"> 内容区域(自动适应头部高度) </main> </template> ``` ### 注意事项 1. **SSR 兼容**:在服务端渲染中,需在 `onMounted` 内操作 DOM 2. **响应式更新**:当元素高度动态变化时,需监听 `resize` 事件或使用 `ResizeObserver` 3. **性能优化**:频繁操作时建议使用防抖函数 > 若遇到获取高度为0的情况,通常是因为元素未渲染完成,通过 `nextTick` + 延迟可解决[^5]。对于表格等复杂组件,建议使用浏览器原生 `ResizeObserver` 监听尺寸变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值