resize-observer.uvue 3.6 KB
Newer Older
1 2 3
<template>
	<view>
		<text>点击蓝色或红色方块区域会修改元素宽高</text>
4
		<view v-show="boxDisplay" style="align-items: center; justify-content: center; margin: 10px;">
5 6 7 8
			<view style="width: 140px; height: 140px; background-color: blue; align-items: center; justify-content: center; padding: 5px;" id="outBox" @click="outBoxClick">
				<view style="width: 80px; height: 80px; background-color: red; padding: 5px;" id="innerBox" @click="innerBoxClick"></view>
			</view>
		</view>
9 10
		<button @click="revertBoxSize">还原修改前元素宽高</button>
		<button @click="toggleDisplay">{{boxDisplay? '隐藏元素': '显示元素'}}</button>
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
		<view>
			<text class="info-text">蓝色方块元素:</text>
			<view class="info-item">
			  <text class="info-text">{{outBoxSizeInfo}}</text>
			</view>
			<text class="info-text" style="margin-top: 20px;">红色方块元素:</text>
			<view class="info-item">
			  <text class="info-text">{{innerBoxSizeInfo}}</text>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				outBoxSizeInfo: "",
				innerBoxSizeInfo: "",
30 31
				offset: 2,
				boxDisplay: true,
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
				outBoxElement: null as UniElement | null,
				innerBoxElement: null as UniElement | null,
			}
		},
		onShow() {
			const resizeObserver = new UniResizeObserver((entries: Array<UniResizeObserverEntry>) => {
				entries.forEach(entry =>{
					if(entry.target == this.outBoxElement) {
						this.outBoxSizeInfo = this.analysisResizeObserverEntry(entry)
					} else if(entry.target == this.innerBoxElement) {
						this.innerBoxSizeInfo = this.analysisResizeObserverEntry(entry)
					}
				})
			})
			this.outBoxElement = uni.getElementById("outBox")
			resizeObserver.observe(this.outBoxElement)
			this.innerBoxElement = uni.getElementById("innerBox")
			resizeObserver.observe(this.innerBoxElement)
		},
		methods: {
			innerBoxClick() {
				this.innerBoxElement!.style.setProperty("width", this.innerBoxElement!.offsetWidth+this.offset)
				this.innerBoxElement!.style.setProperty("height", this.innerBoxElement!.offsetWidth+this.offset)
			},
			outBoxClick() {
				this.outBoxElement!.style.setProperty("width", this.outBoxElement!.offsetWidth+this.offset)
				this.outBoxElement!.style.setProperty("height", this.outBoxElement!.offsetWidth+this.offset)
			},
			revertBoxSize() {
				if(this.outBoxElement != null) {
					this.outBoxElement!.style.setProperty("width", "140px")
					this.outBoxElement!.style.setProperty("height", "140px")
				}
				if(this.innerBoxElement != null) {
					this.innerBoxElement!.style.setProperty("width", "80px")
					this.innerBoxElement!.style.setProperty("height", "80px")
				}
69 70 71
			},
			toggleDisplay() {
				this.boxDisplay = !this.boxDisplay
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
			},
			analysisResizeObserverEntry(entry: UniResizeObserverEntry): string {
				const contentBoxSize = entry.contentBoxSize[0]
				const borderBoxSize = entry.borderBoxSize[0]
				const devicePixelContentBoxSize = entry.devicePixelContentBoxSize[0]
				return "borderBoxSize: \n{blockSize:"+borderBoxSize.blockSize+", inlineSize:"+borderBoxSize.inlineSize+"}\n"+
					   "contentBoxSize: \n{blockSize:"+contentBoxSize.blockSize+", inlineSize:"+contentBoxSize.inlineSize+"}\n"+
					   "devicePixelContentBoxSize: \n{blockSize:"+devicePixelContentBoxSize.blockSize+", inlineSize:"+devicePixelContentBoxSize.inlineSize+"}\n"+
					   "contentRect: \n{x:"+entry.contentRect.x+", y:"+entry.contentRect.y+", width:"+entry.contentRect.width+", height:"+entry.contentRect.height+"}"
			}
		}
	}
</script>

<style>
 .info-item {
    flex-direction: row;
  }
  .info-text {
	  font-size: 14px;
  }
</style>