Skip to content

变形盒子

可调整大小的盒子组件允许用户通过拖拽移动位置以及通过拖拽边缘或角落来调整其尺寸,适合用于动态布局或自定义面板。

基础用法

使用插槽插入自定义内容,通过拖拽手柄来调整盒子的大小,通过鼠标拖拽盒子的任意位置可以移动盒子到指定的位置。

<template>
  <div class="container">
    <LResize>
      <div class="content">基础用法</div>
    </LResize>
  </div>
</template>

<style scoped>
.container {
  width: 100%;
  height: 300px;
  position: relative;
}
.content {
  color: #fff;
  background-color: #409eff;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

自定义尺寸和位置

用户可以通过 Props 自定义盒子的最小和最大尺寸,以及初始尺寸和位置。

<template>
  <div class="container">
    <LResize
      :minWidth="100"
      :minHeight="100"
      :maxWidth="400"
      :maxHeight="300"
      :initialWidth="300"
      :initialHeight="200"
      :initialTop="50"
      :initialLeft="50"
    >
      <div class="content">自定义尺寸和位置</div>
    </LResize>
  </div>
</template>

<style scoped>
.container {
  width: 100%;
  height: 400px;
  position: relative;
}
.content {
  color: #fff;
  background-color: #409eff;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

显示尺寸和位置

可以通过 showDimensionshowPosition 属性来控制是否显示盒子的实时尺寸和位置信息。

<template>
  <div class="container">
    <LResize :showDimension="true" :showPosition="true" :initialWidth="366" :initialHeight="251">
      <div class="content">
        <img
          style="width: 100%; height: 100%"
          src="https://api.lostelk.cn/files/776/serve?size=large"
          alt="示例图片"
        />
      </div>
    </LResize>
  </div>
</template>

<style scoped>
.container {
  width: 100%;
  height: 400px;
  position: relative;
}
.content {
  color: #fff;
  background-color: #409eff;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

监听盒子更新事件

当盒子的尺寸或位置发生变化时,可以通过监听 boxUpdated 事件来获取最新的状态信息。

<template>
  <div class="container">
    <LResize
      @boxUpdated="handleBoxUpdated"
      :initialWidth="200"
      :initialHeight="200"
      :initialTop="100"
      :initialLeft="100"
      :minWidth="200"
      :minHeight="200"
    >
      <div class="content">
        <div>Width: {{ boxState.width }}</div>
        <div>Height: {{ boxState.height }}</div>
        <div>Top: {{ boxState.top }}</div>
        <div>Left: {{ boxState.left }}</div>
      </div>
    </LResize>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const boxState = ref({} as any)

const handleBoxUpdated = (newBoxState) => {
  boxState.value = newBoxState
}
</script>

<style scoped>
.container {
  position: relative;
  width: 100%;
  height: 400px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.content {
  color: #fff;
  background-color: #409eff;
  padding: 16px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}
</style>

API

Attributes

属性名说明类型默认值
minWidth盒子最小宽度number30
minHeight盒子最小高度number30
maxWidth盒子最大宽度numberInfinity
maxHeight盒子最大高度numberInfinity
initialWidth盒子初始宽度number200
initialHeight盒子初始高度number200
initialTop盒子初始顶部位置number100
initialLeft盒子初始左侧位置number100
cssUnit尺寸单位string'px'
showDimension是否显示尺寸信息booleanfalse
showPosition是否显示位置信息booleanfalse
zIndexz-index值number1

Events

事件名说明参数
boxUpdated当盒子尺寸或位置更新时触发BoxState

Slots

插槽名说明
default插入自定义内容

BoxState 参数

参数名类型说明
widthnumber盒子的宽度
heightnumber盒子的高度
topnumber盒子的顶部位置
leftnumber盒子的左侧位置
zIndexnumber盒子的 z-index 值

Exposes

方法名说明参数
updateBoxStyle更新盒子样式() => void
startDrag开始拖拽() => void
endDrag拖拽结束() => void
startResize开始调整大小() => void
endResize调整大小结束() => void