【PPTist】网格线、对齐线、标尺

前言:本篇文章介绍辅助我们摆放元素位置的几个功能

一、网格线功能

网格线主要是用来辅助我们对齐元素的,右键可以选择使用哪种网格线,以及关闭和打开
在这里插入图片描述
显示效果就是图中的这种效果。但是强迫症有点难受,它底部没对齐啊啊啊
在这里插入图片描述
不行,我要把它改成对齐的!
猜测目前的网格线设置的是固定值。
然后咱们先全局搜索一下“网格线”,发现了这里的定义
src/store/main.ts

gridLineSize: number  // 网格线尺寸(0表示不显示网格线)

网格线这个组件是 src/views/Editor/Canvas/GridLines.vue,其中就两个方法,一个计算网格线颜色的,避免网格线颜色和底色太接近看不清;另一个是计算网格路径的。网格线使用过 path 标签渲染出来的,我们来看一下网格路径的计算方法

const { canvasScale, gridLineSize } = storeToRefs(useMainStore())
// 网格路径
const path = computed(() => {
  const maxX = VIEWPORT_SIZE
  const maxY = VIEWPORT_SIZE * viewportRatio.value

  let p = ''
  for (let i = 0; i <= Math.floor(maxY / gridLineSize.value); i++) {
    p += `M0 ${i * gridLineSize.value} L${maxX} ${i * gridLineSize.value} `
  }
  for (let i = 0; i <= Math.floor(maxX / gridLineSize.value); i++) {
    p += `M${i * gridLineSize.value} 0 L${i * gridLineSize.value} ${maxY} `
  }
  return p
})

以及页面中的这个网格线组件:
在这里插入图片描述
可以看到里面的线条数据,只有一个不是整数,所以 562.5 应该就是最后一行的纵坐标,不过最后一行应该也是50的倍数,所以应该是下边框上还有一条线
话说好像不能让底部对齐,因为网格得是正方形,好吧,那我还是忍忍吧。
然后还有一个相关的组件 src/views/Editor/Canvas/index.vue,里面有右键菜单。可以看到,设置网格线尺寸的方法是 mainStore.setGridLineSize(50)
这个方法在 src/store/main.ts

setGridLineSize(size: number) {
  this.gridLineSize = size
},

二、对齐线

对齐线就是这个
在这里插入图片描述

对齐线的定义在这里 src/views/Editor/Canvas/AlignmentLine.vue
控制对齐线的显示的属性有四个:
type: 'vertical' | 'horizontal' 控制方向
lefttop 控制位置
sizeStyle ,如果是竖向就有 height 值,如果是横向就有 width 值表示长度。

然后我们来看一下这个组件的父组件在哪里,以及是怎么从父组件获取 props
是在 src/views/Editor/Canvas/index.vue 文件中
其中的 .viewport-wrapper 是覆盖整个编辑区域的框框
在这里插入图片描述
其中的对齐线是通过 v-for 渲染的数组

<AlignmentLine 
  v-for="(line, index) in alignmentLines" 
  :key="index" 
  :type="line.type" 
  :axis="line.axis" 
  :length="line.length"
  :canvasScale="canvasScale"
/>

数据 alignmentLines 的修改依赖于两个方法

const { dragElement } = useDragElement(elementList, alignmentLines, canvasScale)
const { scaleElement, scaleMultiElement } = useScaleElement(elementList, alignmentLines, canvasScale)

看方法名就是拖拽和缩放元素的时候会更新
这个写法比较少见,没有通过一个方法返回 alignmentLines 更新后的值,而是在方法里面直接修改了 alignmentLines
然后我们会发现代码的组织性真的很好,这些钩子函数在另外的文件中维护,并且方法名很明确。

总而言之言而总之,这个方法好复杂,各种计算的。
简单看一下数据。
在这里插入图片描述
还有多条的情况
在这里插入图片描述

三、标尺

标尺就是这个
在这里插入图片描述
主要跟缩放行为有关,中间顶部 500 的位置和左侧 300 的位置是固定的。

在这里插入图片描述

还有如果选中一个元素的话,标尺的对应坐标会高亮
在这里插入图片描述

它的父组件跟上面的对齐线的父组件是同一个
src/views/Editor/Canvas/index.vue

<Ruler :viewportStyles="viewportStyles" :elementList="elementList" v-if="showRuler" />

showRuler 通过右键菜单控制标尺的开关。

const { dragViewport, viewportStyles } = useViewportSize(canvasRef)
const elementList = ref<PPTElement[]>([])
const setLocalElementList = () => {
  elementList.value = currentSlide.value ? JSON.parse(JSON.stringify(currentSlide.value.elements)) : []
}
watchEffect(setLocalElementList)
// 开关标尺
const toggleRuler = () => {
  mainStore.setRulerState(!showRuler.value)
}

标尺组件在这里 src/views/Editor/Canvas/Ruler.vue
根元素下有两个元素,一个是 .h,表示顶部的标尺; 一个是 .v,表示左侧的标尺
先看下动态添加的类名是啥意思:class="{ 'hide': markerSize < 36, 'omit': markerSize < 72 }"

const markerSize = computed(() => {
  return props.viewportStyles.width * canvasScale.value / 10
})

就是缩放值小于72的时候,中间的这个小齿齿会隐藏
在这里插入图片描述
缩放值小于 36 的时候,数字会隐藏
在这里插入图片描述
其中的高亮是这个元素

<div class="range" 
  v-if="elementListRange"
  :style="{
    left: elementListRange.minX * canvasScale + 'px',
    width: (elementListRange.maxX - elementListRange.minX) * canvasScale + 'px',
  }"
></div>
const { canvasScale, activeElementIdList } = storeToRefs(useMainStore())
watchEffect(() => {
  const els = props.elementList.filter(el => activeElementIdList.value.includes(el.id))
  if (!els.length) return elementListRange.value = null
  elementListRange.value = getElementListRange(els)
})

activeElementIdList 是公用的数据,通过 src/store/main.ts 中的下面的方法修改

// 设置选中元素列表
setActiveElementIdList(activeElementIdList: string[]) {
  if (activeElementIdList.length === 1) this.handleElementId = activeElementIdList[0]
  else this.handleElementId = ''
  this.activeElementIdList = activeElementIdList
},

然后各种地方都可能会用到,包括组合元素、鼠标选中、切换页面(清空)等等。

计算元素的范围 getElementListRange 也是一个公用的方法,在这个文件中 src/utils/element.ts,大致就是找选中的元素的所有的位置,取最边缘的位置,作为包含所有的选中元素的范围。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探究步进电机与输入脉冲的关系

深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容&#xff1a; 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观&#xff0c;我更建议…

E-commerce .net+React(一)——项目初始化

文章目录 项目地址一、创建.Net环境1.1环境配置1.1.1 使用vscode创建webapi1.1.2 Clean architecture结构创建1.1.3 将创建好结构的项目添加到git里1.1.4 EF Core配置1. 在infrastructure里安装EF所需环境2. 创建Product数据模型3. 创建EF Core的DbContext 数据库上下文4. 创建…

Spring Bean 管理学习

Spring 框架的核心之一是 IOC&#xff08;控制反转&#xff09;容器&#xff0c;Bean 的管理是其中的重要功能。本文将从 Bean 的获取、作用域和第三方 Bean 的管理三个方面进行学习和总结。 1. 获取 Bean 在 Spring 项目启动时&#xff0c;IoC 容器会将所有的 Bean 创建好并托…

Excel for Finance 07 `FV PV` 函数

Excel 的 FV 函数用于计算一笔投资在未来的价值&#xff0c;基于固定的利率和定期付款。这是一个金融函数&#xff0c;常用来分析储蓄计划、贷款、或投资的增长。 语法&#xff1a; FV(rate, nper, pmt, [pv], [type])参数说明&#xff1a; rate&#xff08;必需&#xff09;&…

Lecture 18

Floating Point Numbers 1. 整数的局限性&#xff1a; • 在计算机中&#xff0c;并非所有数字都能用整数形式表示。例如&#xff1a; • 非整数&#xff08;如小数&#xff09;&#xff1a;345.0256。 • 超出整数表示范围的数&#xff1a; 5.375 \times 10^{25} 。 2. 浮…

【LC】19. 删除链表的倒数第 N 个结点

题目描述&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff…

EasyExcel(读取操作和填充操作)

文章目录 1.准备Read.xlsx&#xff08;具有两个sheet&#xff09;2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …

五.Springboot通过AOP实现API接口的签名验证

文章目录 前言一、实现原理二、签名规则三、服务端实现4.1、创建自定义注解4.2、创建切面处理类4.3、对应工具类RequestUtil 四、测试4.1 签名失败测试&#xff1a;4.2 签名成功测试&#xff1a; 四、总结 前言 对外开放的接口&#xff0c;需要验证请求方发送过来的数据确实是…

记录jvm进程号

日常开发中&#xff0c;相信大家会经常用到这么一行命令&#xff1a; ps -ef | grep xxx.jar | grep -v grep | awk {print $2} | xargs -r kill -9 就是杀掉xxx相关的进程&#xff0c;然后启动&#xff0c;当然也还有其他的方式可以实现类似的功能&#xff0c;我就不列举了&…

STM32完全学习——使用定时器1精确延时

一、定时器的相关配置 首先一定要是递减定时器&#xff0c;递增的不太行&#xff0c;控制的不够准确&#xff0c;其次在大于10微秒的延时是非常准确的&#xff0c;小于的话&#xff0c;就没有那没准&#xff0c;但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…

简述css中z-index的作用?如何用定位使用?

z-index是一个css属性&#xff0c;用于控制元素的堆叠顺序&#xff0c; 如何使用定位用index 1、position&#xff1a;relative&#xff1b; z-index&#xff1b; 相对于自己来定位的&#xff0c;可以根据top&#xff0c;bottom&#xff0c;right&#xff0c;left&#xff…

被裁20240927 --- 嵌入式硬件开发 STM32篇

人很容易原谅别人的错误但很难原谅别人的正确 1. 文档、手册、指南、资源2. MCU 结构3. MCU 和 MPU 的区别4. 一些概念什么是看门狗 &#xff1f;什么是 DMA &#xff1f;什么是晶振 &#xff1f;什么是片内外设&#xff1f;软件协议、硬件协议、数据协议、通讯协议、通信协议u…

被邀请出版Cursor教程书籍是什么体验?

本文目的 本次文章和大家分享一下被邀请出版书籍的经历、准备工作&#xff1b;准备工作大部分文字内容由Cursor完成。同时如果有后续、未来书籍真的出版&#xff0c;我会持续进行分享&#xff0c;欢迎关注我~ 事情来由 前几天我被出版社编辑联系&#xff0c;询问我是否可以合…

全新免押租赁系统助力商品流通高效安全

内容概要 全新免押租赁系统的推出&#xff0c;可以说是一场商品流通领域的小革命。想象一下&#xff0c;不再为押金烦恼&#xff0c;用户只需通过一个简单的信用评估&#xff0c;就能快速租到所需商品&#xff0c;这种体验简直令人惊喜&#xff01;这个系统利用代扣支付技术&a…

upload-labs关卡记录9

还是上传一个一句话木马&#xff0c;提示文件类型不允许上传&#xff0c;随变改一改后缀名&#xff0c;发现就可以上传了&#xff0c;黑名单&#xff0c;这里经过尝试&#xff0c;常规的双写后缀&#xff0c;大小写&#xff0c;.htaccess&#xff0c;然后抓包&#xff0c;试试点…

高质量 Next.js 后台管理模板源码分享,开发者必备

高质量 Next.js后台管理模板源码分享&#xff0c;开发者必备 Taplox 是一个基于 Bootstrap 5 和 Next.js 构建的现代化后台管理模板和 UI 组件库。它不仅设计精美&#xff0c;还提供了一整套易用的工具&#xff0c;适合各种 Web 应用、管理系统和仪表盘项目。无论你是初学者还是…

路由器刷机TP-Link tp-link-WDR5660 路由器升级宽带速度

何在路由器上设置代理服务器&#xff1f; 如何在路由器上设置代理服务器&#xff1f; 让所有连接到该路由器的设备都能够享受代理服务器的好处是一个不错的选择&#xff0c;特别是当需要访问特定的网站或加速网络连接的时候。下面是一些您可以跟随的步骤&#xff0c;使用路由器…

【Linux/踩坑】Linux中启动eclipse或HDFS因JAVA_HOME设置报错

Linux中启动eclipse或hadoop因JAVA_HOME设置报错 eclipseHadoop eclipse 错误提示&#xff1a; A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. No Java virtual machine was found after searching the follo…

可信数据空间建设及应用参考指南(V1.0)

为贯彻国家数据局《可信数据空间发展行动计划&#xff08;2024-2028 年&#xff09;》&#xff0c;促进可信数据空间持续、快速和健康发展&#xff0c;相关行业专家组织编写《可信数据空间建设及应用参考指南&#xff08;V1.0&#xff09;》&#xff08;以下简称《参考指南》&a…

Hive刷分区MSCK

一、MSCK刷分区 我们平时通常是通过alter table add partition方式增加Hive的分区的&#xff0c;但有时候会通过HDFS put/cp命令或flink、flum程序往表目录下拷贝分区目录&#xff0c;如果目录多&#xff0c;需要执行多条alter语句&#xff0c;非常麻烦。Hive提供了一个"…