【SVG】前端-不依靠第三方包怎么画连线???

如何用SVG实现连线功能

在Web开发中,我们经常会遇到需要在页面上绘制图形或者实现一些图形交互的场景。SVG(Scalable Vector Graphics)作为一种用于描述二维图形的XML标记语言,在这方面提供了极大的便利。本文将以一个具体的例子——如何使用SVG来实现连线功能,来介绍SVG的使用方法。

基本概念

在开始之前,我们先简单了解一下SVG的一些基本概念。SVG允许我们以XML格式定义图形,这意味着你可以直接在HTML文档中嵌入SVG代码。SVG图形是矢量的,这意味着它们可以在不失真的情况下被放大。
示例项目
假设我们有一个需求,需要在一个页面上展示两组方块,然后根据一定的规则用线将它们连接起来。这个场景在实际开发中很常见,比如在展示工作流、组织结构图等场景。

项目结构

我们的项目使用Vue.js框架,并且在一个.vue文件中定义了我们的组件。这个组件的模板部分包含了两组方块和一个用于绘制连线的SVG容器。

<template><div class="container"><div class="left"><div v-for="(block, index) in leftBlocks" :key="index" class="block">{{ block }}</div></div><div v-if="ready" ref="svg" class="arrows"><svg v-if="draw" style="width: 100%;height: 100%;"><path v-for="(link, index) in links" :key="index" :d="drawArrow(link)":stroke="link.type === 'dashed' ? 'blue' : 'black'" stroke-width="2" fill="none":stroke-dasharray="link.type === 'dashed' ? '5,5' : ''" /></svg></div><div class="right"><div v-for="(block, index) in rightBlocks" :key="index" class="block">{{ block }}</div></div></div>
</template>

数据和方法

在组件的script部分,我们定义了一些数据和方法。leftBlocks和rightBlocks分别存储左右两组方块的数据。links数组存储了连接信息,包括起点、终点和线条类型(实线或虚线)。
在这里插入图片描述

export default {data() {return {ready: false,draw: false,leftBlocks: ['A', 'B', 'C'],rightBlocks: ['X', 'Y', 'Z'],links: [{ from: 0, to: 1, type: 'solid' },{ from: 1, to: 2, type: 'dashed' }]};},mounted() {this.$nextTick(() => {this.ready = true;this.$nextTick(()=>{this.draw=true;});});},methods: {drawArrow(link) {// 绘制箭头的逻辑}}
};

绘制连线

drawArrow方法是本示例的核心。它根据传入的连接信息计算出起点和终点的坐标,然后生成一个SVG的path元素的d属性值,这个属性值描述了一条从起点到终点,然后再到箭头两个端点的路径。

drawArrow(link) {const svgBox = this.$refs.svg;// 假设左侧方块中心为起点,右侧方块中心为终点const startX = 0; // 左侧方块中心X坐标const startY = 20 + 60 * link.from; // 计算起点Y坐标const endX = svgBox.clientWidth; // 右侧方块中心X坐标,考虑到SVG容器的位置const endY = 40 + 100 * link.to; // 计算终点Y坐标// 箭头头部的大小和角度const arrowLength = 10; // 箭头长度// const arrowWidth = 5; // 箭头宽度// 计算箭头头部的两个点const angle = Math.atan2(endY - startY, endX - startX);const arrowEnd1X = endX - arrowLength * Math.cos(angle - Math.PI / 6);const arrowEnd1Y = endY - arrowLength * Math.sin(angle - Math.PI / 6);const arrowEnd2X = endX - arrowLength * Math.cos(angle + Math.PI / 6);const arrowEnd2Y = endY - arrowLength * Math.sin(angle + Math.PI / 6);// 绘制线条和箭头头部return `M${startX},${startY} L${endX},${endY} M${endX},${endY} L${arrowEnd1X},${arrowEnd1Y} M${endX},${endY} L${arrowEnd2X},${arrowEnd2Y}`;}

实现效果

通过上述代码,我们可以在页面上绘制出从左侧方块指向右侧方块的连线,并且根据links数组中定义的连接信息,自动调整连线的起点、终点和类型(实线或虚线)。SVG的 元素非常强大,它不仅可以用来绘制直线,还可以绘制曲线、圆形等复杂的图形。

结论

SVG提供了一种非常灵活和强大的方式来在Web页面上绘制和操作图形。通过简单的XML标记,我们可以实现复杂的视觉效果,而且由于SVG图形是矢量的,它们在任何分辨率下都能保持清晰。本文通过一个实现连线功能的示例,展示了如何使用SVG来增强Web应用的交互性和视觉效果。希望这篇文章能够帮助你在未来的项目中更好地利用SVG。

扩展阅读

SVG教程
通过结合这些资源,你可以进一步深入了解SVG,从而在你的Web开发项目中创造出更加丰富和动态的用户体验。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML案例-1.标签练习

效果 源码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…

金蝶云星空,怎么做BI数据可视化分析?

金蝶云星空是一个流程管理方面的软件&#xff0c;如果想要做BI数据可视化分析&#xff0c;还就需要一套BI方案&#xff0c;即一套奥威BI软件金蝶云星空BI方案。 奥威BI软件&#xff0c;负责提供平台和技术&#xff1b;金蝶云星空BI方案&#xff0c;则提供标准化的数据分析模型…

4款实用性前端动画特效分享(附在线演示)

分享4款非常不错的项目动画特效 其中有jQuery特效、canvas特效、CSS动画等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 全屏图片视差旋转切换特效 基于anime.js制作全屏响应式的图片元素布局&#xff0c;通过左…

【直流无刷笔记1】

入门科普完整版 优势&#xff1a;转速只取决于上桥臂的占空比 反馈测量方法 无刷测速 无刷测电流

TSN交换机有望成为下一代工业网络通信核心设备

TSN即Time-Sensitive Networking&#xff0c;中文名为时间敏感网络&#xff0c;是从传统以太网网络中衍生出来的一种技术&#xff0c;是指在非确定性以太网中实现确定性最小时间延时的协议族。TSN为标准以太网增加了确定性和可靠性&#xff0c;可实现对以太网网络功能的扩展&am…

多人聊天室 (epoll - Linux网络编程)

文章目录 零、效果展示一、服务器代码二、客户端代码三、知识点1.bind() 四、改进方向五、跟练视频 零、效果展示 一个服务器作为中转站&#xff0c;多个客户端之间可以相互通信。至少需要启动两个客户端。 三个客户端互相通信 一、服务器代码 chatServer.cpp #include <…

【Android】AOSP 架构

Android 官网对 AOSP 结构图进行了更新&#xff0c;如下所示&#xff1a; Android 应用&#xff08;Android Apps&#xff09; 完全使用 Android API 开发的应用。在某些情况下&#xff0c;设备制造商可能希望预安装 Android 应用以支持设备的核心功能。 特权应用&#xff08…

交换机/路由器的存储介质-思科

交换机/路由器的存储介质-思科 本文主要介绍网络设备的存储介质组成。 RAM(random-accessmemory&#xff0c;随机访问存储器) RAM中内容断电丢失&#xff0c;主要用于运行操作系统、运行配置文件、IP 路由表:、ARP 缓存、数据包缓存区。 ROM(read-only memory&#xff0c;只…

php7.3.4连接sqlserver(windows平台)

前言 有个项目需要手上laravel连接客户的sqlserver数据库读取数据&#xff0c;故在本地开发的lnmp环境中&#xff0c;php需要增加扩展 过程 从微软官网下载sqlsrv扩展,注意注意php版本&#xff0c;下载地址 解压的文件会有nts和ts两个版本&#xff0c;本地打开phpinfo查看 将…

Linux内核--基本概念/基本结构和组件

提示&#xff1a;本系列文章重点学习Linux内核 Linux内核--基本概念/基本结构和组件 简介一、基础概念1.六项工作内容2.根文件系统&#xff08;Root File System&#xff09;&#xff1a;3.交叉编译&#xff08;Cross-Compilation&#xff09;&#xff1a;4.设备树&#xff08;…

Oracle登录错误ERROR: ORA-01031: insufficient privileges解决办法

这个问题困扰了我三个星期&#xff0c;我在网上找的解决办法&#xff1a; 1.控制面板->管理工具->计算机管理->系统工具->本地用户和组->ORA_DBA组。 但我电脑上根本找不到。 2.在oracle安装目录下找到oradba.exe运行。 最开始我都不到这个oradba.exe文件在哪…

软件设计师:12 - 下午题历年真题

章节章节01-计算机组成原理与体系结构07 - 法律法规与标准化与多媒体基础02 - 操作系统基本原理08 - 设计模式03 - 数据库系统09 - 软件工程04 - 计算机网络10 - 面向对象05 - 数据结构与算法11 - 结构化开发与UML06 - 程序设计语言与语言处理程序基础12 - 下午题历年真题End -…