【我不熟悉的javascript】display:none/v-show=“false“的元素,使用getBoundingClientRect获取的各项值都为0

Element.getBoundingClientRect() 方法返回一个 DOMRect 对象,其提供了元素的大小及其相对于视口的位置。

先看代码,使用getBoundingClientRect,获取一个display:none的元素的边界

<template>
	<div id="hello" class="box">hello word</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
	mounted() {
		const ele = document.getElementById('hello')
		const rect = ele?.getBoundingClientRect()
		console.table(rect)
	},
})
</script>
<style>
.box {
	display: none;
}
</style>

此时打印出来的各项结果是0,去掉display:none就没有问题了。

同理我们在vue中使用了v-show的情况下,如果值为false,也会出现这种情况,以后需要注意喽!! 

如果使用 opacity和visibility来隐藏元素,则不会有这种情况

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以在 `<el-form>` 标签上绑定 `@input` 事件,当表单数据发生改变时,触发该事件,然后在事件处理函数中计算出水印的样式,并将样式绑定到 `<span>` 标签上。具体实现代码如下: ``` <template> <main-content :ifDetail="true"> <div class="two-side"> <div class="main-left"> <el-form :model="form" :rules="rules" ref="form" label-width="120px" @input="handleInput"> <!-- 表单项省略 --> </el-form> </div> <div class="main-right" id="show"> <div class="watermark"> <span :style="watermarkStyle" ref="showText" style="word-break:break-all;display: inline-block">{{ form.text }}</span> </div> </div> </div> </main-content> </template> <script> export default { data() { return { form: { accountName: '', rotate: 0, text: '', fontSize: 16, alignment: 1, textPosition: 1 }, options: [ { label: '左上', value: 1 }, { label: '居中', value: 2 }, { label: '右下', value: 3 } ], textPositionOptions: [ { label: '正常', value: 1 }, { label: '斜体', value: 2 } ] } }, computed: { watermarkStyle() { const { rotate, fontSize, alignment, textPosition } = this.form const deg = rotate + (textPosition === 2 ? -45 : 0) const translateX = alignment === 1 ? '-10%' : alignment === 2 ? '-50%' : '90%' const translateY = alignment === 1 ? '-10%' : alignment === 2 ? '-50%' : '90%' const transform = `rotate(${deg}deg)` const style = { position: 'absolute', top: 0, left: 0, bottom: 0, right: 0, fontSize: `${fontSize}px`, transform: transform, '-webkit-transform': transform, '-ms-transform': transform, '-moz-transform': transform, '-o-transform': transform, opacity: '0.2', 'pointer-events': 'none', 'text-align': 'center', 'z-index': 9999, transformOrigin: '50% 50%', '-webkit-transform-origin': '50% 50%', '-ms-transform-origin': '50% 50%', '-moz-transform-origin': '50% 50%', '-o-transform-origin': '50% 50%', color: '#000', 'word-break': 'break-all', 'white-space': 'pre-wrap', 'max-height': '100%', 'max-width': '100%', overflow: 'hidden', 'text-overflow': 'ellipsis', '-webkit-text-fill-color': 'transparent', '-webkit-background-clip': 'text', 'background-clip': 'text', '-webkit-user-select': 'none', '-moz-user-select': 'none', '-ms-user-select': 'none', userSelect: 'none', '-webkit-line-clamp': '1', display: 'flex', 'align-items': 'center', 'justify-content': 'center', 'transform-style': 'preserve-3d' } if (textPosition === 2) { style.padding = '0.5rem' style.background = 'linear-gradient(to right bottom, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.2) 45%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.2) 55%, rgba(255, 255, 255, 0.2) 100%)' } style.transform += ` translate(${translateX}, ${translateY})` style['-webkit-transform'] += ` translate(${translateX}, ${translateY})` style['-moz-transform'] += ` translate(${translateX}, ${translateY})` style['-ms-transform'] += ` translate(${translateX}, ${translateY})` style['-o-transform'] += ` translate(${translateX}, ${translateY})` return style } }, methods: { handleInput() { this.$nextTick(() => { const { width, height } = this.$refs.show.getBoundingClientRect() const { offsetWidth, offsetHeight } = this.$refs.showText if (width === 0 || height === 0 || offsetWidth === 0 || offsetHeight === 0) { return } const scaleX = width / offsetWidth const scaleY = height / offsetHeight const scale = Math.min(scaleX, scaleY) this.$refs.showText.style.transform += `scale(${scale})` this.$refs.showText.style['-webkit-transform'] += `scale(${scale})` this.$refs.showText.style['-moz-transform'] += `scale(${scale})` this.$refs.showText.style['-ms-transform'] += `scale(${scale})` this.$refs.showText.style['-o-transform'] += `scale(${scale})` }) } } } </script> ``` 代码中的 `watermarkStyle` 计算属性用于计算水印的样式,`handleInput` 方法用于在计算出水印样式后,将水印按照比例缩小并居中显示。注意,为了保证水印样式的正确性,需要在表单项加载完成之后计算水印样式,因此需要在 `handleInput` 方法中使用 `$nextTick` 方法等待表单项加载完成再进行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值