YAAT-Yat Another ActionTab开发(1)—— 拖拉拽组件

boyanx1个月前技术教程12

前段时间使用了一下ActionTab感觉这个产品,小编也想向这个产品学习学习,自己开发一个工具箱。就当是学习总结之用了,有兴趣的小伙伴可以私信小编获取代码,后续等功能界面稍微成型了再放到github上开源(现在有些拿不出手)~~~

今天想实现的样子

我感觉便利贴应该算是ActionTab上比较方便的功能,因此我们也从便利贴功能组件开始。

便利贴功能需要做到两点:可拖拉拽;可缩放;用户可输入。效果如下:

拖拉拽组件

  • 拖拉拽组件很早之前也看过一些实现方法,HTML元素本身就是有个draggable的属性的,不过实现起来都比较麻烦,为什么不站在巨人的肩膀上呢?行吧,那就站在巨人的肩膀上吧。。。
  • 我们选择的可拖拉拽的组件叫:vue3-draggable-resizable,安装命令如下:
npm i vue3-draggable-resizable
  • 这个组件的使用也非常简单,以下是这个组件的大致用法。
// JS代码
import "vue3-draggable-resizable/dist/Vue3DraggableResizable.css";
import Vue3DraggableResizable from "vue3-draggable-resizable";

// 模板代码
<Vue3DraggableResizable
    :initW="props.config.w"
    :initH="props.config.h"
    v-model:x="props.config.x"
    v-model:y="props.config.y"
    v-model:w="props.config.w"
    v-model:h="props.config.h"
    :draggable="true"
    :resizable="true"
    @activated="print('activated')"
    @deactivated="print('deactivated')"
    @drag-start="print('drag-start')"
    @drag-end="console.log"
    @resize-start="(e) => emits('resizeStart', e)"
    @resizing="(e) => emits('resizing', e)"
    @resize-end="(e) => emits('resizeEnd', e)"
    class="drag-item">
    // 内容区
  </Vue3DraggableResizable>

实现原理

  • 通过上面的Vue3DraggableResizable+textarea实现便利贴可拖拽、可缩放功能。
  • textarea元素无法实现根据Vue3DraggableResizable的缩放自动调整宽度和高度,因此需要需要监听Vue3DraggableResizable的缩放事件从而计算出textarea的高度(宽度固定)。
const resizeTextArea = () => {
  const targetParent = textareaRef.value?.closest(".drag-item");
  if (targetParent == null) {
    return;
  }

  const parentHeight = targetParent?.clientHeight;
  if (!parentHeight) {
    return;
  }
  const textareaHeight = parentHeight - props.config.headerHeight - 10 - 5;
  textareaRef.value!.style.height = `${textareaHeight}px`;
};
// 稍微增加个防抖功能,降低调用次数
const debouncedResizeTextArea = _.debounce(resizeTextArea, 10);

// 事件监听
@resize-start="debouncedResizeTextArea"
@resizing="debouncedResizeTextArea"
@resize-end="debouncedResizeTextArea"
  • 其中的props.config.headerHeight - 10 - 5;当前可拖拽组件的头高度以及textarea自己的margin和padding。

其他

  • 这块功能简单,最大的成本反而是在调样式上。
  • 下一步小编将会把用户的便利签数据存储到浏览器的indexDB上(小编会选择用pinia获得响应式能力,同时借助小编之前的一篇pinia持久化的文章将数据持久化到indexdb中),再往后我们可以将便签数据存储到后端(需要借助服务端的代码).
  • 测试地址,有啥建议也一定请给小编留言:
http://yaat.junxian.me/index.html#/


相关文章

HTML前端常用标签(复习)(web前端标签大全)

1. HTML 初识HTML 指的是超文本标记语言 (Hyper Text Markup Language)是用来描述网页的一种语言。HTML 不是一种编程语言,而是一种标记语言 (markup la...

HTML基础知识自学必知教程 6~CSS的选择器

下面是承接上文的知识点简介:6.表单对于功能性的表单,HTML仅仅是产生表单的表面样子,为后台提供数据。创建所有表单 <form></form>创建一个滚动菜单,size设置在...

css技巧之重置样式的那些事(css重写样式)

在前端开发中,为了统一各个浏览器的样式统一,我们要将各个浏览器的默认样式进行重新设置。这个过程就叫做css样式重置。根据实际项目大家都有一套自己的样式。下面我们来看看需要特别说明的一些事:1、text...

微信小程序文本输入<input/> 详解

在微信小程序开发中,input 用来实现文本输入,如输入用户名密码等等1 基本使用<input class="input" name="userName" pla...

行内元素与块级元素,以及区别(行内元素和块级元素有什么区别?)

行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...

快速了解JavaScript富文本编辑(js 富文本编辑器插件)

富文本编辑器(Rich Text Editor)是在网页上使用的一种所见即所得的文本编辑器,是 Web 应用开发中很常见的需求。富文本实现在 HTML 文档上共有 2 中方式实现富文本编辑器。一种是使...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。