0

0

AngularJS 实现上下两组字段点击连线的交互教程

心靈之曲

心靈之曲

发布时间:2026-03-14 12:14:01

|

563人浏览过

|

来源于php中文网

原创

AngularJS 实现上下两组字段点击连线的交互教程

本文详解如何在 angularjs 中实现上下两排字段(如10个上排 + 10个下排)之间的点击配对连线功能:用户依次点击一个上排字段和一个下排字段,自动生成 svg 连线;支持多次配对、状态重置与视觉反馈。

本文详解如何在 angularjs 中实现上下两排字段(如10个上排 + 10个下排)之间的点击配对连线功能:用户依次点击一个上排字段和一个下排字段,自动生成 svg 连线;支持多次配对、状态重置与视觉反馈。

在 AngularJS 应用中实现「点击两个字段生成连接线」的交互,核心在于坐标采集 → 状态暂存 → SVG 渲染 → 状态复位四个环节。以下是一个结构清晰、可扩展的完整实现方案。

✅ 核心思路说明

  • 上排字段与下排字段分别用 ng-repeat 渲染,每个元素赋予唯一 ID(如 1_1, 2_3),便于 DOM 定位;
  • 点击任一字段时,通过 getPosTop() 或 getPosBottom() 获取其左上角偏移坐标,并做轻微偏移校准(如 x + 15, y + 30),确保连线起点/终点落在图标视觉中心;
  • 使用 $scope.unline = { from: {...}, to: {...} } 暂存待绘制的线段端点;
  • 首次点击记录 from,第二次点击(必须是另一排)补全 to 并调用 clearLine() 将该线段推入 $scope.lines 数组;
  • 所有连线统一由 <svg> + <line ng-repeat="line in lines"> 动态渲染,利用 AngularJS 的双向绑定实现即时更新;
  • 为提升交互体验,点击后对目标元素添加缩放动画(transform: scale(0.8)),提供明确视觉反馈。

? 完整代码实现

HTML 结构(含 SVG 容器)

<div ng-app="plunker" ng-controller="MainCtrl">
  <!-- 上排字段 -->
  <div class="parent_span">
    <div class="top_span" ng-repeat="c in top_span track by $index">
      <span id="1_{{$index}}" ng-click="getPosTop($index)">
        <svg fill="#000000" width="30" height="30" viewBox="0 0 490 490">
          <path d="M0,0v490h490V0H0z M430.1,332.9h-87.5v50.9h-33.1v50.9H180.4v-50.6h-33.1v-51.3H59.9v-278h46.7v66.5h38.5V54.8h40.8v66.5h38.5V54.8h40.8v66.5h38.5V54.8h40.8v66.5H383V54.8h46.7v278.1L430.1,332.9z"/>
        </svg>
      </span>
      <div>{{c.name}}</div>
    </div>
  </div>

  <!-- 下排字段 -->
  <div class="parent_span_2">
    <div class="bottom_span" ng-repeat="c in bottom_span track by $index">
      <span id="2_{{$index}}" ng-click="getPosBottom($index)">
        <svg fill="#000000" width="30" height="30" viewBox="0 0 490 490">
          <path d="M0,0v490h490V0H0z M430.1,332.9h-87.5v50.9h-33.1v50.9H180.4v-50.6h-33.1v-51.3H59.9v-278h46.7v66.5h38.5V54.8h40.8v66.5h38.5V54.8h40.8v66.5h38.5V54.8h40.8v66.5H383V54.8h46.7v278.1L430.1,332.9z"/>
        </svg>
      </span>
      <div>{{c.name}}</div>
    </div>
  </div>

  <!-- 连线 SVG 容器(置于底层) -->
  <div class="line">
    <svg>
      <line
        ng-repeat="line in lines track by $index"
        x1="{{line.from.x}}"
        y1="{{line.from.y}}"
        x2="{{line.to.x}}"
        y2="{{line.to.y}}"
        stroke="#e74c3c"
        stroke-width="2.5"
        stroke-linecap="round"
      />
    </svg>
  </div>
</div>

CSS 样式(确保布局与层级正确)

PatentPal专利申请写作
PatentPal专利申请写作

AI软件来为专利申请自动生成内容

下载
.parent_span, .parent_span_2 {
  display: flex;
  justify-content: space-between;
  margin: 40px 0;
}
.top_span, .bottom_span {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.line {
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  z-index: -1;
}
.line svg {
  width: 100%; height: 100%;
}
/* 点击缩放反馈 */
.top_span span, .bottom_span span {
  transition: transform 0.15s ease;
}

AngularJS 控制器逻辑(关键优化版)

var app = angular.module("plunker", []);

app.controller("MainCtrl", function($scope) {
  // 初始化上下两排字段(支持任意数量,此处各5个示例)
  $scope.top_span = Array.from({ length: 5 }, (_, i) => ({ name: (i + 1).toString() }));
  $scope.bottom_span = Array.from({ length: 5 }, (_, i) => ({ name: (i + 1).toString() }));

  $scope.lines = [];       // 已保存的连线数组
  $scope.unline = {};      // 临时存储待提交的线段 { from: {x,y}, to: {x,y} }

  // 获取上排字段坐标(点击触发)
  $scope.getPosTop = function(index) {
    const el = document.getElementById(`1_${index}`);
    if (!el) return;

    el.style.transform = "scale(0.8)";
    const rect = el.getBoundingClientRect();
    const x = rect.left + window.scrollX + 15; // 水平居中偏移
    const y = rect.top + window.scrollY + 30;  // 垂直底部偏移(适配图标位置)

    if ($scope.unline.from && !$scope.unline.to) {
      // 第二次点击:补全 to 并提交
      $scope.unline.to = { x, y };
      $scope.lines.push(angular.copy($scope.unline));
      $scope.unline = {};
    } else {
      // 第一次点击:初始化 from
      $scope.unline.from = { x, y };
    }
  };

  // 获取下排字段坐标(点击触发)
  $scope.getPosBottom = function(index) {
    const el = document.getElementById(`2_${index}`);
    if (!el) return;

    el.style.transform = "scale(0.8)";
    const rect = el.getBoundingClientRect();
    const x = rect.left + window.scrollX + 15;
    const y = rect.top + window.scrollY + 10;  // 下排图标更靠上,y 偏移略小

    if ($scope.unline.from && !$scope.unline.to) {
      $scope.unline.to = { x, y };
      $scope.lines.push(angular.copy($scope.unline));
      $scope.unline = {};
    } else {
      $scope.unline.from = { x, y };
    }
  };

  // 【可选】清空所有连线
  $scope.clearAllLines = function() {
    $scope.lines = [];
    $scope.unline = {};
  };
});

⚠️ 注意事项与最佳实践

  • 坐标计算可靠性:务必使用 getBoundingClientRect() 替代 offsetLeft/Top,避免因滚动、定位或 CSS 变换导致坐标偏差;
  • 防误操作:当前逻辑允许「先点下排再点上排」,若需强制「上→下」顺序,可在 $scope.unline 中增加 phase: 'top' | 'bottom' 状态控制;
  • 性能优化:当连线数量较多(>50 条)时,建议将 <line> 改为 Canvas 绘制,或使用 track by $index 避免重复渲染;
  • 响应式适配:若页面支持缩放或响应式布局,请在 getPos* 中监听 window.resize 并重绘所有连线;
  • AngularJS 版本兼容性:示例基于 1.0.6,若使用 1.3+,建议启用 ng-cloak 防止 SVG 闪烁,并考虑升级至 Angular(v2+)以获得更现代的图形方案(如 D3 + Angular 绑定)。

通过以上实现,你已拥有一套健壮、可维护的 AngularJS 字段连线交互系统——既满足基础需求,也预留了扩展空间。实际项目中,还可进一步集成撤销/重做、连线样式定制(虚线、箭头、颜色映射)、数据持久化等高级能力。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4348

2024.08.14

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

550

2023.10.23

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

114

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

99

2025.11.13

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

36

2025.12.30

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

104

2026.03.06

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

42

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

79

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

234

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号