Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前端基础

  • 应用框架

  • 工程能力

  • 应用基础

  • 专业领域

    • 服务端

    • 跨端技术

    • Web IDE

    • 中后台

    • 动效渲染

    • 可视化

      • 业务场景

        • D2C

        • 搭建

          • web通用撤销重做技术
          • 前端可视化之伸缩拖动旋转
            • 前言
            • 定义
            • 拖拽
            • 旋转
            • 伸缩
          • 大屏可视化之组件层级设置
          • 思维导图组件开发
      • 图像处理

      • 图表

    • 埋点监控

    • 多媒体

    • 桌面技术

    • 游戏互动

    • 编辑器

    • 虚拟化与容器化

    • 设计系统

  • 业务场景

  • 大前端
  • 专业领域
  • 可视化
  • 业务场景
  • 搭建
gahing
2019-09-16
目录

前端可视化之伸缩拖动旋转草稿

# 前言

在前端可视化可视化领域,对组件的伸缩、拖动、旋转操作是常有的功能

本文将以一个 div 作为组件讲述如何实现这些功能

# 定义

组件采用div的方式,主要原因是开发快,方便定制,canvas或svg较难上手

而其他的控制按钮采用的是 canvas

大致结构如下:

控件的数据结构为

{
  left,
  top,
  width,
  height
}
1
2
3
4
5
6

# 拖拽

为何先讲拖拽,因为这个操作是独立的,不需要考虑其他两个操作

# 旋转

伸缩后面再讲,是因为计算坐标差的时候会受到旋转的影响

对组件设置transform:rotate(30deg)后,将按组件中点顺时针旋转30°

注意,不是按左上角坐标点旋转。

那么这个旋转角度要怎么计算呢?

# 伸缩

已知当前旋转角度为 deg,对应的弧度为 rad = deg * Math.PI/180, 对八个位置的伸缩处理如下

  1. left位置,偏移量为 x (往左伸缩则x值<0,否则值>0))

width 的值为 width -= x';其中 x' = x * Math.cos(rad)
同时由于中心点也要变更,
left 的值为 left += x' * Math.cos(rad)
top 的值为 top += x' * Math.sin(rad)

  1. 组件上下边中部的拉伸按钮,在垂直方向上移动的距离差为 y,

则实际组件需要被拉伸的宽度应该为 y'=y/(Math.cos(rad)) 同时由于中心点也要变更,left变更量为y'*Math.cos(rad),top变更量为y'*Math.sin(rad)

  1. 组件左右边中部的拉伸按钮,在水平方向上移动的距离差为 x,

则实际组件需要被拉伸的长度应该为 x'=x*(Math.cos(rad)

  1. 组件四周的拉伸按钮,在水平方向上移动的距离差为 x,在垂直方向上移动的距离差为 y,

则实际组件需要被拉伸的宽度应该为 y'=y/(Math.cos(rad),长度应该为 x'=(y * Math.tan(rad)+x)*Math.cos(rad)

编辑 (opens new window)
上次更新: 2025/06/11, 23:06:59
web通用撤销重做技术
大屏可视化之组件层级设置

← web通用撤销重做技术 大屏可视化之组件层级设置→

最近更新
01
我的 2024 总结
12-31
02
浅谈代码质量与量化指标
08-27
03
快速理解 JS 装饰器
08-26
更多文章>
Theme by Vdoing | Copyright © 2016-2025 Gahing | 闽ICP备19024221号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式