DataWorks产品菜单栏的优化解析

本文涉及的产品
大数据开发治理平台 DataWorks,不限时长
简介: 先来波广告,DataWorks全新起航,提供给大家更优的数据开发体验,有任何建议欢迎反馈。问题:废话不多说,看一下优化之前的菜单栏显示的交互。是的,我就是想直接选中数据开发,怎么就这么难。这一块整体的交互就是hover到上面的图标,然后出现产品菜单,第一版在实现的时候,用css去控制菜单的display属性,所以就会导致当图标失去焦点的时候,菜单就立马消失了。 .logo:hover .list

先来波广告,DataWorks全新起航,提供给大家更优的数据开发体验,有任何建议欢迎反馈。

问题:
废话不多说,看一下优化之前的菜单栏显示的交互。

优化前菜单显示

是的,我就是想直接选中数据开发,怎么就这么难。
这一块整体的交互就是hover到上面的图标,然后出现产品菜单,第一版在实现的时候,用css去控制菜单的display属性,所以就会导致当图标失去焦点的时候,菜单就立马消失了。

.logo:hover .list {
  display: none;
}​


解决思路:
一种常见的解决方式就是设置延时,失去焦点后不会立马消失。这种做法有一个缺点就是当用户真的是想收起菜单时,还是要经过一段延时。
经过主管和师兄的指导,去看了下亚马逊的菜单实现,他们的问题和这个相似,就是如何判断用户是要切换子菜单还是想移动到子菜单中,具体的交互如下:


可以看到在移动到子菜单的过程中,会经过下面的一级菜单,但是子菜单的内容并没有发生变化。具体的实现过程,已经单独抽成了一个jquery的组件,https://github.com/kamens/jQuery-menu-aim

原理解析:
学习了下实现的代码,其核心就是认为当下一刻的鼠标轨迹在这个蓝色三角区域的时候,用户是想移动到子菜单的。
仔细想了下,确实如果用户是想切换一级菜单的时候,鼠标的轨迹一般是会往正下或者正上方向去滑动。



将这个原理应用到现在的场景中,假设当前的鼠标位置为A,那么如果下一刻鼠标的位置在这个红色区域内,就认为用户是想移动到菜单中。
那么怎么判断下一刻鼠标的位置是在三角形内,方法有很多,最简单的判定方法就是,AB与BC的夹角e'1<e1,AC与BC的夹角 e'2<e2。


代码实现:
根据上面分析的原理,进行代码实现。

export default class MenuAim {

  constructor(hoverDom, menuDom) {
    this.hoverDom = hoverDom; // icon
    this.menuDom = menuDom;   // product-list
    this.mouseTrack = [];  // 记录鼠标的移动轨迹,最多只记录三组数据

    this.onMouseOver = this.onMouseOver.bind(this);
    this.onMouseLeave = this.onMouseLeave.bind(this);
    this.onMouseMove = this.onMouseMove.bind(this);

    this.hoverDom.addEventListener('mouseover', this.onMouseOver);
    this.hoverDom.addEventListener('mouseleave', this.onMouseLeave);
    this.hoverDom.addEventListener('mousemove', this.onMouseMove);
    this.menuDom.addEventListener('mouseleave', () => {
      this.menuDom.style.display = 'none';
    });
  }

  onMouseOver() {
    this.menuDom.style.display = 'block';
  }

  onMouseMove(e) {
    this.mouseTrack.push({ x: e.pageX, y: e.pageY });
    if (this.mouseTrack.length > 3) {
      this.mouseTrack.shift();
    }
  }

  onMouseLeave(e) {
    // 鼠标的当前位置
    const currentPosition = {
      x: e.pageX,
      y: e.pageY,
    };
    // 鼠标的上一位置
    const prevPosition = this.mouseTrack[0];
    // 下拉菜单的左上角
    const menuLeftTop = {
      x: this.menuDom.offsetLeft,
      y: this.menuDom.offsetTop,
    };
    // 下拉菜单的右上角
    const menuRightTop = {
      x: this.menuDom.offsetLeft + this.menuDom.offsetWidth,
      y: this.menuDom.offsetTop,
    };

    // 现在的位置与左上角的角度  负值
    const currentLeftScale = (menuLeftTop.y - currentPosition.y) / (menuLeftTop.x - currentPosition.x);
    // 现在的位置与右上角的角度
    const currentRightScale = (menuRightTop.y - currentPosition.y) / (menuRightTop.x - currentPosition.x);

    // 上一位置与左上角的角度   负值
    const prevLeftScale = (menuLeftTop.y - prevPosition.y) / (menuLeftTop.x - prevPosition.x);
    // 上一位置与右上角的角度
    const prevRightScale = (menuRightTop.y - prevPosition.y) / (menuRightTop.x - prevPosition.x);

    if (currentLeftScale > prevLeftScale && currentRightScale < prevRightScale) {
      // 认为用户是要移到下拉菜单
      this.menuDom.style.display = 'block';
    } else {
      this.menuDom.style.display = 'none';
    }
  }
}



优化结果:
最后看一下,优化后的效果。

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
一站式大数据开发治理平台DataWorks初级课程
DataWorks 从 2009 年开始,十ー年里一直支持阿里巴巴集团内部数据中台的建设,2019 年双 11 稳定支撑每日千万级的任务调度。每天阿里巴巴内部有数万名数据和算法工程师正在使用DataWorks,承了阿里巴巴 99%的据业务构建。本课程主要介绍了阿里巴巴大数据技术发展历程与 DataWorks 几大模块的基本能力。 课程目标 &nbsp;通过讲师的详细讲解与实际演示,学员可以一边学习一边进行实际操作,可以深入了解DataWorks各大模块的使用方式和具体功能,让学员对DataWorks数据集成、开发、分析、运维、安全、治理等方面有深刻的了解,加深对阿里云大数据产品体系的理解与认识。 适合人群 &nbsp;企业数据仓库开发人员 &nbsp;大数据平台开发人员 &nbsp;数据分析师 &nbsp;大数据运维人员 &nbsp;对于大数据平台、数据中台产品感兴趣的开发者
相关文章
|
12天前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
26 2
|
2天前
|
SQL 分布式计算 资源调度
一文解析 ODPS SQL 任务优化方法原理
本文重点尝试从ODPS SQL的逻辑执行计划和Logview中的执行计划出发,分析日常数据研发过程中各种优化方法背后的原理,覆盖了部分调优方法的分析,从知道怎么优化,到为什么这样优化,以及还能怎样优化。
|
19天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
30天前
|
运维 Linux Apache
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
199 2
|
1月前
CRM软件推荐2024:五款顶级产品解析,助您找到最佳选项!
2024年,随着民营经济发展,CRM软件成为企业增长的关键。本文推荐了五款高好评CRM:1) Zoho CRM,以其易用性和性价比受青睐;2) Zoho Bigin,轻量级选项适合小微企业;3) Salesforce,CRM巨头,但国内售后不足;4) Hubspot,提供免费版,付费版价格较高;5) Pipedrive,专注小型团队。企业在选择时应考虑试用体验和服务质量。
34 6
|
1月前
|
存储 安全 程序员
【C++ 包装器类 智能指针】完全教程:std::unique_ptr、std::shared_ptr、std::weak_ptr的用法解析与优化 — 初学者至进阶指南
【C++ 包装器类 智能指针】完全教程:std::unique_ptr、std::shared_ptr、std::weak_ptr的用法解析与优化 — 初学者至进阶指南
69 0
|
1月前
|
机器学习/深度学习 监控 算法
【数学建模竞赛】优化类赛题常用算法解析
【数学建模竞赛】优化类赛题常用算法解析
41 2
|
2月前
|
缓存 前端开发 JavaScript
前端性能优化实践与原理解析
【2月更文挑战第3天】 在当今互联网时代,前端性能优化已经成为了开发人员必须要面对的重要课题。本文将结合实际案例,探讨前端性能优化的一些实践方法,并深入分析其背后的原理,旨在帮助开发者更好地理解和应用前端性能优化技术。
21 5
|
2月前
|
缓存 前端开发 JavaScript
Vite 打包优化:全面解析与实践
Vite 作为新一代前端构建工具,以其快速开发体验和高效打包能力著称。然而,在实际项目开发中,为了进一步提升性能和用户体验,我们仍需对 Vite 打包进行优化。本文将深入探讨 Vite 打包优化策略,涵盖代码拆分、资源压缩、缓存利用、构建配置等多个方面,并提供实践案例和最佳实践建议,帮助开发者充分释放 Vite 的潜力。
192 1
|
2月前
|
缓存 前端开发 JavaScript
深入解析前端性能优化策略
本文将探讨前端性能优化的关键策略,包括减少HTTP请求、使用CDN加速、缓存优化、代码压缩等方面的技术手段,帮助前端开发者提升网站性能和用户体验。

推荐镜像

更多