返回

打造灵活可拖动、自动收缩的Vue侧边组件按钮

前端

前言

在当今快节奏的数字世界中,用户体验变得至关重要。为了增强用户与网站或应用程序的互动,我们可以添加一些交互元素,例如悬浮可拖动的侧边组件按钮。这种按钮不仅美观实用,还能让用户自定义其位置和大小,从而提升整体用户体验。

创建Vue项目

首先,我们需要创建一个新的Vue项目。您可以使用Vue CLI或其他您熟悉的工具。在终端中输入以下命令:

vue create vue-draggable-sidebar

安装必要的依赖项

接下来,我们需要安装一些必要的依赖项。

npm install vue-draggable-resizable

创建组件

现在,让我们创建一个新的Vue组件。在src目录下创建一个名为Sidebar.vue的文件,并添加以下代码:

<template>
  <div
    class="sidebar"
    :style="{
      top: top + 'px',
      left: left + 'px',
      width: width + 'px',
      height: height + 'px'
    }"
  >
    <div class="handle" @mousedown="startDrag" @touchstart="startDrag">
      <i class="icon"></i>
    </div>
    <div class="content">
      <slot></slot>
    </div>
  </div>
</template>

<script>
import { ref } from 'vue'
import draggable from 'vue-draggable-resizable'

export default {
  name: 'Sidebar',
  components: { draggable },
  props: {
    top: {
      type: Number,
      default: 0
    },
    left: {
      type: Number,
      default: 0
    },
    width: {
      type: Number,
      default: 300
    },
    height: {
      type: Number,
      default: 300
    }
  },
  setup() {
    const top = ref(0)
    const left = ref(0)
    const width = ref(300)
    const height = ref(300)

    const startDrag = (e) => {
      e.stopPropagation()
      e.preventDefault()
      document.addEventListener('mousemove', onDrag)
      document.addEventListener('touchmove', onDrag)
      document.addEventListener('mouseup', stopDrag)
      document.addEventListener('touchend', stopDrag)
    }

    const onDrag = (e) => {
      e.stopPropagation()
      e.preventDefault()
      top.value = e.pageY - e.offsetY
      left.value = e.pageX - e.offsetX
    }

    const stopDrag = () => {
      document.removeEventListener('mousemove', onDrag)
      document.removeEventListener('touchmove', onDrag)
      document.removeEventListener('mouseup', stopDrag)
      document.removeEventListener('touchend', stopDrag)
    }

    return {
      top,
      left,
      width,
      height,
      startDrag
    }
  }
}
</script>

<style scoped>
.sidebar {
  position: absolute;
  z-index: 999;
  background: #fff;
  border: 1px solid #ccc;
  border-radius: 5px;
}

.handle {
  width: 20px;
  height: 20px;
  background: #333;
  border-radius: 50%;
  cursor: move;
}

.content {
  padding: 10px;
}

.icon {
  color: #fff;
  font-size: 16px;
}
</style>

使用组件

现在,我们可以在主组件中使用这个侧边组件按钮。在App.vue文件中添加以下代码:

<template>
  <div>
    <sidebar>
      <p>This is a sidebar.</p>
    </sidebar>
  </div>
</template>

<script>
import Sidebar from './Sidebar.vue'

export default {
  name: 'App',
  components: { Sidebar }
}
</script>

实现自动收缩功能

为了实现自动收缩功能,我们需要在Sidebar.vue组件中添加一些额外的代码。在<script>标签中添加以下代码:

watch: {
  top(newValue) {
    if (newValue < 0) {
      this.top = 0
    } else if (newValue + this.height > window.innerHeight) {
      this.top = window.innerHeight - this.height
    }
  },
  left(newValue) {
    if (newValue < 0) {
      this.left = 0
    } else if (newValue + this.width > window.innerWidth) {
      this.left = window.innerWidth - this.width
    }
  }
}

结语

通过本教程,我们成功地创建了一个悬浮可拖动且可自定义的Vue侧边组件按钮,并实现了自动收缩功能。这种按钮在实际的业务开发中非常实用,可以根据业务需要进行调整。希望本教程对您有所帮助,也期待您分享更多有价值的经验和技巧。