返回

全屏图片展示,自定义左遮罩

前端

在 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 属性,我们可以轻松实现自定义图片组件,并为其添加各种自定义功能和样式。