返回
全屏图片展示,自定义左遮罩
前端
2024-01-02 13:26:52
在 Vue 3 中,我们可以利用 Vue 的自定义组件功能,封装一个图片展示组件,该组件包括自定义左遮罩,并实现通过拖动左右两端改变组件宽度来实现图片在组件中被遮罩。
实现这种效果需要用到Vue 3 的 Ref API 来获取遮罩元素,并绑定拖动事件监听函数。然后,利用 CSS 的 transform
属性改变遮罩元素的宽度,实现图片的遮罩效果。
下面是该组件的实现代码:
<template>
<div class="image-viewer">
<div class="image-container">
<img :src="imageSrc" alt="Image" ref="image">
</div>
<div class="mask" ref="mask"></div>
</div>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const image = ref()
const mask = ref()
const startX = 0
const endX = 0
const handleMouseDown = (e) => {
startX = e.clientX
endX = startX
mask.value.style.width = `${endX}px`
}
const handleMouseMove = (e) => {
if (startX === 0 || endX === 0) return
endX = e.clientX
const width = endX - startX
mask.value.style.width = `${width}px`
}
const handleMouseUp = () => {
startX = 0
endX = 0
mask.value.style.width = '0px'
}
return {
image,
mask,
handleMouseDown,
handleMouseMove,
handleMouseUp
}
}
}
</script>
<style>
.image-viewer {
position: relative;
width: 100%;
height: 100%;
}
.image-container {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.image {
object-fit: contain;
}
.mask {
position: absolute;
top: 0;
left: 0;
width: 0;
height: 100%;
background-color: black;
}
</style>
通过在模板中使用 <div class="image-viewer">
定义组件的容器,其中包含 <div class="image-container">
来容纳图片,以及 <div class="mask">
定义遮罩层。
在脚本部分,我们使用了 Vue 3 的 ref
API 获取遮罩元素和图片元素的引用,并绑定了事件监听函数。当用户在遮罩层上按下、移动和释放时,遮罩层的宽度会随着用户的手势进行相应的变化,从而实现图片的遮罩效果。
通过使用 Vue 3 的自定义组件功能和 CSS 的 transform
属性,我们可以轻松实现自定义图片组件,并为其添加各种自定义功能和样式。