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

news2025/1/16 16:05:23

如何用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.coloradmin.cn/o/1519120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress网站启用cloudflare的CDN加速后,网站出现多重定向无法访问

这是一个使用Hostease的Linux虚拟主机的客户反馈的问题&#xff0c;Hostease的虚拟主机使用的也是cPanel面板&#xff0c;客户使用的是cPanel的softaculous安装的WordPress&#xff0c;但是在安装完成后&#xff0c;并且解析了域名之后&#xff0c;发现网站无法访问&#xff0c…

高校实验室科研仪器开放共享存在的问题及对策建议

随着科技的迅速发展和高校科研水平的提高&#xff0c;高校实验室科研仪器的开放共享已经成为推动科研进步和创新发展的重要手段。然而&#xff0c;在实际操作中&#xff0c;我们也面临着诸多问题和挑战。本文将分析高校实验室科研仪器开放共享存在的问题&#xff0c;并提出相应…

java复健-接口的开发及参数校验

遇到的问题以及解决方案 Q1. 开发接口的流程 A1&#xff1a; 明确需求阅读接口文档思路分析开发测试 Q2. 开发时用到的技术 A2&#xff1a; LomBok&#xff1a;Data&#xff0c;自动为我们的实体类创建构造方法&#xff0c;set&#xff08;&#xff09;&#xff0c;get&am…

8. C++对象模型

1. 普通类对象是什么布局&#xff1f; struct Base {Base() default;~Base() default;void Func() {}int a;int b; };int main() {Base a;return 0; }2. 带虚函数的类对象是什么布局&#xff1f; struct Base {Base() default;virtual ~Base() default;void FuncA() {}v…

Uni-app跟学笔记(五):uni-ui组件库的使用、项目打包(小程序、h5、APP)

文章目录 1&#xff09;uni-ui组件库的使用2&#xff09;项目打包1&#xff1a;微信小程序打包2&#xff1a;h5打包3&#xff1a;安卓打包 本博客为 uni-app 此门课的跟学笔记&#xff0c;目的是便于个人复习和对知识快速索引&#xff0c;源码素材可在均可在视频评论区找到 1&a…

Vue2 父子组件某一属性的双向绑定

原本&#xff1a;父组件使用props传值给孩子组件初始化&#xff0c;触发事件子组件使用$emit传值给父组件&#xff0c;很麻烦后来&#xff1a;使用computed和$event例子代码&#xff1a; <template><div class"box">grandpa <el-input v-model"…

‍❄️Unity 官方免费资源大放送!森林、沙漠、北极等 350+逼真的自然纹理 Megapack等你来拿

&#x1f333;350自然纹理 Megapack&#xff0c;免费获取&#xff01;&#x1f381; 你是否热爱游戏开发&#xff0c;却被昂贵的资源库所困扰&#xff1f;你是否渴望创造出令人惊叹的自然场景&#xff0c;却被有限的纹理素材所束缚&#xff1f;如果你的答案是肯定的&#xff0c…

01- Java概述

第1章 Java概述 1.1 Java语言发展历史&#xff08;记关键点&#xff09; Java诞生于SUN&#xff08;Stanford University Network&#xff09;&#xff0c;09年SUN被Oracle&#xff08;甲骨文&#xff09;收购。 Java之父是詹姆斯.高斯林(James Gosling)。 1996年发布JDK1.…

分布式思想

1、单体架构设计存在的问题 传统项目采用单体架构设计,虽然可以在一定的程度上解决企业问题,但是如果功能模块众多,并且将来需要二次开发.由于模块都是部署到同一台tomcat服务器中,如果其中某个模块代码出现了问题,将直接影响整个tomcat服务器运行. 这样的设计耦合性太高.不便…

【软件测试基础篇】第二节.黑盒测试中常见方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言⼀、等价类法&#xff08;解决穷举问题&#xff09;二、边界值法&#xff08;解决边界限制问题&#xff09;三、正交表法&#xff08;解决多条件依赖问题&#…

Docker学习之镜像管理(超详解析)

Docker镜像生命周期&#xff08;可以把docker镜像理解为虚拟机镜像&#xff09; 实验内容&#xff1a; 搜索官方仓库镜像 [rootlocalhost ~]# docker search busybox //以查找busybox为例 搜索说明&#xff1a;name镜像名称 description镜像说明 stars点赞数量 official…

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动 直接上图 &#xff1a; 主要是下面这段代码&#xff1a; "dataZoom": [{"type": "inside","show": false,"xAxisIndex": [0],"zoomOnMouseWheel&…

APP在应用商店该如何做好节日营销

38妇女节刚刚过去&#xff0c;不少商家吃上了一波节日红利。 你有没有注意到很多App在应用商店里改头换面&#xff0c;开展了很多以“三八节”为主题的营销活动&#xff0c;并且取得了不错的成绩。 可见季节性营销策划对产品的下载量和用户留存率还是很重要的。 那么我们如何…

synchronized底层原理 以及 公平锁和非公平锁的基本概念

一、公平锁和非公平锁的基本概念 公平锁&#xff1a; 简单讲就是当一个锁被释放的时候会执行唤醒&#xff0c;此时等待中的其他线程取排在最前面的线程获取被释放的锁并进入运行态。 非公平锁&#xff1a; 同样的当一个锁释放时&#xff0c;其他等待的线程并不需要排队&#…

LeetCode 80.删除有序数组中的重复项 II

目录标题 删除有序数组中的重复项 II题目解题思路实现代码代码讲解总结删除有序数组中的重复项 II 题目 解题思路 慢指针指向满足条件的数字的末尾,快指针遍历原数组。 并且用一个变量记录当前末尾数字出现了几次,防止超过两次。最后返回维护慢指针的结果+1即可。 实现代…

【数据可视化】Echarts最常用图表

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 准备工作3. 柱状图3.1 绘制堆积柱状图3.2 绘制标准条形图3.3 绘制瀑布图 4. 折线图4.1 绘制堆积面积图和堆积折线图4.2 绘制阶梯图 5. 饼图5.1 绘制标准饼图5.2 绘制圆环图5.2 绘制嵌套饼图5.3 绘制南丁格尔…

文件操作与IO流

文章目录 File文件操作类IO流原理及流的分类节点流FileInputStreamFileOutputStreamFileReaderFileWriter 处理流BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStreamObjectInputStreamObjectOutputStreamPrintStreamPrintWriter 标准输入输出流 Properties …

【声速、频率、波长、波数、波矢】

【声速、频率、波长、波数、波矢】 在声学中,声速(Speed of Sound)、频率(Frequency)、波长(Wavelength)、波数(Wave Number)和波矢(Wave Vector)是描述声波传播特性的重要物理量。它们之间的关系如下: 声速(Speed of Sound): 表示声波在介质中传播的速度,通常…

Vue 运行报错 Error: Cannot find module ‘semver‘

文章目录 项目场景&#xff1a;问题描述解决方案&#xff1a;注意&#xff1a; 项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 运行 Vue 后遇到一个报错&#xff1a; 我的项目是WebStorm 运行的&#xff0c;不通过命令运行&#xff0c;我奇怪的是…

用网格大师网络重划分时,坐标原点按照XML文件原点填写,导出的瓦块文件命名不对,坐标原点该怎么填写

瓦块名称和原来不一致的原因是瓦块原点这里设置的不对&#xff0c;要和重建设置的瓦块原点保持一致。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一&#xff0c;重叠区域处理问题的工具“百宝箱”&#xff0c;集格式转换、坐标转换、轻量化、瓦片重划分…