media-query-observer.md 3.5 KB
Newer Older
Q
qiang 已提交
1 2 3 4 5 6 7 8 9 10 11
MediaQueryObserver 对象,用于监听页面 media query 状态的变化,如界面的宽高是不是在某个指定的范围内。

### uni.createMediaQueryObserver([this])
创建并返回一个 ``MediaQueryObserver`` 对象实例。

**this说明:**

自定义组件实例。**小程序端不支持此参数,传入仅为抹平写法差异**

**平台兼容性**

F
update  
fasttian 已提交
12
|app|微信小程序|H5|支付宝小程序|qq小程序|百度小程序|字节小程序|飞书小程序|360小程序|快应用|
F
update  
fasttian 已提交
13 14
|:-|:-|:-|:-|:-|:-|:-|:-|:-|:-|
|2.8.12+,app-vue|基础库 2.11.1+|√|√|√|√|√|x|√|x|
Q
qiang 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

注意:支付宝小程序、qq小程序、百度小程序、字节小程序,暂不支持监听屏幕动态改变,即只执行一次媒体查询。

### MediaQueryObserver 对象的方法列表

>tips: 和 UI 相关的 api 在组件 mounted 后执行

|方法|说明|
|:-|:-|:-|
|MediaQueryObserver.observe(Object descriptor, function callback)|开始监听页面 media query 变化情况|
|MediaQueryObserver.disconnect()|停止监听,回调函数将不再触发|

**Object descriptor**

|属性名|类型|默认值|必填|说明|
|:-|:-|:-|:-|:-|
31 32
|minWidth|number||否|页面最小宽度( px 为单位)|
|maxWidth|number||否|页面最大宽度( px 为单位)|
Q
qiang 已提交
33
|width|number||否|页面宽度( px 为单位)|
34 35
|minHeight|number||否|页面最小高度( px 为单位)|
|maxHeight|number||否|页面最大高度( px 为单位)|
Q
qiang 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48
|height|number||否|页面高度( px 为单位)|
|orientation|string||否|屏幕方向( landscape 或 portrait )|

**observe 回调函数包含一个参数**

|参数|类型|说明|
|:-|:-|:-|
|matches|boolean|页面的当前状态是否满足所指定的 media query|

### 代码示例

以下示例代码,推荐使用HBuilderX,新建uni-app项目,可直接体验完整示例。

D
DCloud_LXH 已提交
49
```vue
Q
qiang 已提交
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
<template>
    <view class="content">
        <view class="">
            要求页面最小宽度 375px, 且页面宽度最大 500px,是否匹配: {{matches}}
        </view>
        <view>
            要求屏幕方向为纵向,是否匹配: {{landscape}}
        </view>
    </view>
</template>

<script>
    let landscapeOb
    export default {
        data() {
            return {
                matches: false,
                landscape: false,
                mediaQueryOb: null
            }
        },
        onLoad() {

        },
        
        // 和 UI 相关的 api 在组件 mountd 后执行
        mounted() {
            this.testMediaQueryObserver()
            this.landscapeObserver()
        },

        methods: {
            testMediaQueryObserver() {
                this.mediaQueryOb = uni.createMediaQueryObserver(this)

                this.mediaQueryOb.observe({
                    minWidth: 375,  //页面最小宽度 375px
                    maxWidth: 500  //页面宽度最大 500px
                }, matches => {
                    this.matches = matches;
                })
            },
            landscapeObserver() {
                landscapeOb = uni.createMediaQueryObserver(this)
                landscapeOb.observe({
                    orientation: 'landscape'  //屏幕方向为纵向
                }, matches => {
                        this.landscape = matches
                })
            },
            destroyed () {
                this.mediaQueryOb.disconnect()  //组件销毁时停止监听
                landscapeOb.disconnect()
            }
        }
    }
</script>

<style>
    .content {
        text-align: center;
        height: 400upx;
    }
</style>
```