返回

移动端万能悬浮窗组件:轻松封装,一键展开与移动

前端

解锁移动端便捷操作:打造可移动悬浮组件

在移动端应用开发中,悬浮组件以其便捷、高效的操作体验备受青睐。本文将一步步指导你封装一个可移动的悬浮框组件,再利用它进阶封装出一个可展开、可移动的扇形悬浮按钮组件。无论是H5、小程序还是APP端,这篇文章都能为你提供全面的指引,打造三端通用的悬浮组件。

封装可移动悬浮框组件

首先,让我们从一个简单的可移动悬浮框组件开始。

代码示例:suspension-box.vue

<template>
  <div class="suspension-box" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend">
    <slot></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      startX: 0,
      startY: 0,
      moving: false
    }
  },
  methods: {
    touchstart(e) {
      this.startX = e.touches[0].clientX
      this.startY = e.touches[0].clientY
      this.moving = true
    },
    touchmove(e) {
      if (!this.moving) return
      const dx = e.touches[0].clientX - this.startX
      const dy = e.touches[0].clientY - this.startY
      this.$el.style.left = `${this.$el.offsetLeft + dx}px`
      this.$el.style.top = `${this.$el.offsetTop + dy}px`
    },
    touchend(e) {
      this.moving = false
    }
  }
}
</script>

<style scoped>
.suspension-box {
  position: absolute;
  left: 0;
  top: 0;
  width: 100px;
  height: 100px;
  background-color: #f0f0f0;
  border-radius: 50%;
  z-index: 999;
  cursor: move;
}
</style>

在上述代码中,我们通过触摸事件监听器来实现组件的移动功能,并使用 z-index 属性确保悬浮框始终处于最上层。

进阶封装可展开、可移动的扇形悬浮按钮组件

有了可移动悬浮框组件的基础,我们进一步将其封装成一个可展开、可移动的扇形悬浮按钮组件。

代码示例:suspension-fan.vue

<template>
  <div class="suspension-fan">
    <transition name="suspension-fan-show">
      <div class="suspension-fan-btn" v-show="show" @click="toggle">
        <slot></slot>
      </div>
    </transition>
    <transition name="suspension-fan-hide">
      <div class="suspension-fan-panel" v-show="show">
        <slot name="panel"></slot>
      </div>
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: false
    }
  },
  methods: {
    toggle() {
      this.show = !this.show
    }
  }
}
</script>

<style scoped>
.suspension-fan {
  position: absolute;
  left: 0;
  bottom: 100px;
  width: 100%;
  height: 100px;
}
.suspension-fan-btn {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  width: 60px;
  height: 60px;
  background-color: #f0f0f0;
  border-radius: 50%;
  z-index: 999;
  cursor: pointer;
}
.suspension-fan-panel {
  position: absolute;
  left: 0;
  bottom: 100px;
  width: 100%;
  height: 300px;
  background-color: #ffffff;
  box-shadow: 0 0 10px #000000;
  z-index: 998;
}
</style>

在扇形悬浮按钮组件中,我们通过使用 <transition> 组件实现了按钮的展开和收起动画效果。点击按钮时,show 数据会发生变化,触发 <transition> 组件的过渡效果。

在App中使用组件

App.vue 中,我们使用 <suspension-box><suspension-fan> 组件来构建我们的应用。

代码示例:App.vue

<template>
  <div>
    <suspension-box>
      <suspension-fan>
        <template #panel>
          <div>这是一个面板</div>
        </template>
      </suspension-fan>
    </suspension-box>
  </div>
</template>

<script>
import SuspensionBox from './components/suspension-box.vue'
import SuspensionFan from './components/suspension-fan.vue'

export default {
  components: {
    SuspensionBox,
    SuspensionFan
  }
}
</script>

通过这种方式,我们可以轻松地在我们的应用中使用可移动的悬浮框和扇形悬浮按钮组件。

常见问题解答

1. 如何在不同平台(H5、小程序、APP)中使用这些组件?

答:这些组件采用 uni-app 框架开发,可以在 H5、小程序和 APP 等多端运行。

2. 组件的移动功能是否会受到设备屏幕大小的影响?

答:组件的移动范围限制在设备屏幕内,不会超出屏幕边界。

3. 如何在扇形悬浮按钮组件中自定义面板内容?

答:可以通过在 <suspension-fan> 组件中使用 <template #panel> 来定义自定义面板内容。

4. 如何调整组件的样式?

答:可以在 <style scoped> 块中修改组件的 CSS 样式。

5. 如何控制组件的初始位置?

答:可以通过修改 lefttop 样式属性来设置组件的初始位置。