【实战】流动的箭头 —— 线性流动组件(repeating-linear-gradient,@keyFrames)

news2024/9/8 23:57:32

文章目录

  • 一、引子
  • 二、组件思路
  • 三、效果图
  • 四、源代码
    • src\components\flow-arrow\index.js
    • src\components\flow-arrow\keyFrames.js
    • src\components\flow-arrow\constant.js
    • 组件调用
  • 五、拓展学习
    • 1.repeating-linear-gradient
    • 2.animation
    • 3.@keyFrames
  • 组件源码获取:
  • ⭐️ 好书推荐
    • 《Next.js实战》
      • 【内容简介】


一、引子

在大屏数据展示中,若是按节点展示在不同数据层的数据时,为了形象体现数据的流动效果,需要让节点之间,层与层之间用流动的虚线+箭头连接。

二、组件思路

正常情况下,数据需要从上个节点底部出发到下个节点顶部结束,层与层之间传递需要经过汇总。因此水平方向上主要有两种情况:

  • 底部汇总:数据流从外向里;(左侧从左往右,右侧从右往左)
  • 顶部分散:数据流从里向外;(左侧从右往左,右侧从左往右)

偶尔会有特殊情况,比如:

  • 同一层中两个节点数据是互相流动的,这就需要在两个节点之间使用双向箭头,且依据实际情况,其中一个可能不会有向下流动的数据只有与同层节点的数据交互,若此层刚好两个节点且为了美观保持对称(而非将带有向下流动数据的节点居中),此时数据流动会出现从左到右或从右到左的单向流动
  • 同一层中还会有层级关系。。。(这个对数据流影响不大)
  • 此思路在当前需求下够用了,后续有新需求再灵活变动

垂直方向上,无论是节点底部的小尾巴还是顶部的部分都是向下流动,而且由于与节点是强关联的,因此不需要单独封装出来到组件中

效果优化:

  • 为保证起始位置不会出现“闪现”,虚线的出现一定是从 0 到 1 的过程,主要需要调整盒子内虚线在起始位置的偏移度,经过调整,最终确定偏移度最小为线段长度;
  • 为保证动画的流畅性,动画结束时需要与动画开始时状态保持一致,主要调整整段虚线的动画位移距离和线段及之间间隔,最终确定最小位移距离为“线段长度+间隔”

三、效果图

在这里插入图片描述

四、源代码

src\components\flow-arrow\index.js

/* eslint-disable react/no-unknown-property */
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx } from '@emotion/react';
import keyFrames from './keyFrames'
import constant from './constant'

const { flowLen } = constant

/**
 * 线性流动组件
 * @param direction 方向:从左到右(lr);从右到左(rl);从里到外(io);从外到里(oi)
 * @param place 位置:顶部(head);底部(foot)
 * @description 方向和位置参数控制,顶部数据流发散(io),底部数据流汇聚(oi),具体显隐可参考如下(案例中:fo 是顶层;f3 是底层)
 *   - {floor.code --= 'f0'? null : <div className='flow-head'/>} 
 *   - {floor.code --- 'f3'? null : <div className='flow-foot'/>}
 *   其他特殊情况特殊处理(单独配置,强制传参改变方向)
 */
const containerStyle = {
  ...keyFrames,
  '.flow-container': {
    width: 'calc(100% - 24vh)',
    height: '.5vh',
    position: 'relative',
    left:'12.8vh',
    overflow: 'hidden',
  },
  ".flow-head-container": {
    top:'-.6vh',
  },
  ".flow-foot-container": {
    bottom:'-1.6vh',
  },
  ".flow": {
    width:'110%',
    height: '.5vh',
    // 第三个值 每个线段长度; 第四个值角度同向渐变距离; 第五个值 每个线段间隔
    background: `repeating-linear-gradient(90deg, #e2e8fd 0, #e2e8fd ${flowLen}vh, rgba(0,0,0,0) ${flowLen}vh, rgba(0,0,0,0) ${flowLen}vh)`,
    zIndex: 1,
  },
  '.flow-both-container':{
    display:'flex',
  },
  '.flow-both': {
    width:'51%',
    overflow: 'hidden',
    '.flow-rl': {
      marginLeft: '-2vh'
    },
  },
  '.flow-lr, .flow-rl,.flow-io, .flow-oi': {
    background: `repeating-linear-gradient(90deg, #e2e8fd 0, #e2e8fd ${flowLen}vh, rgba(0,0,0,0) 0vh, rgba(0,0,0,0) ${flowLen * 2}vh)`,
  },
  '.flow-lr': {
    animation: 'flow-lr linear 1s infinite',
    marginLeft:'-2vh',
  },
  '.flow-rl': {
    animation: 'flow-rl linear 1s infinite',
    marginRight: '-2vh',
  },
}

const index = (props = {direction: 'lr', place: 'head'}) => {
  const { direction, place } = props
  
  return <div css={containerStyle}>
    <div className={`flow-container flow-${place}-container`}>
    {
      (() => {
        switch (direction) { 
          case 'lr': 
          case 'rl':
            return <div className={`flow flow-${props.direction}`} />
          case 'io':
            return <div className='flow-both-container'>
              <div className={`flow-both`}>
                <div className={`flow flow-head flow-rl`} />
              </div>
              <div className={`flow-both`}>
                <div className={`flow flow-lr`} />
              </div>
            </div>
          case 'oi':
            return <div className='flow-both-container'>
              <div className={`flow-both`}>
                <div className={`flow flow-lr`} />
              </div>
              <div className={`flow-both` }>
                <div className={`flow flow-rl`} />
              </div>
            </div>
          default:
            return <div className={`flow`} />
        }
      })()
    }
    </div>
  </div>
}

export default index

src\components\flow-arrow\keyFrames.js

const keyFrames = {
  '@keyFrames flow-lr': {
    from: {
      transform:'translateX(0vh)',
    },
    to: {
      transform: 'translateX(4.8vh)',
    }
  },
  '@keyFrames flow-rl': {
    from: {
      transform:'translateX(4.8vh)',
    },
    to: {
      transform: 'translateX(0vh)',
    }
  }
}

export default keyFrames

src\components\flow-arrow\constant.js

const constant = {
  flowLen: 1.2,
}

export default constant

组件调用

/* eslint-disable react/no-unknown-property */
/** @jsxRuntime classic */
/** @jsx jsx */
import { jsx } from '@emotion/react';
import FlowArrow from './components/flow-arrow/index'

function App() {
  return (
    <div className="App" css={{background: '#00f', height: '600px', 'h1': { textAlign: 'center' }}}>
      <h1>左右</h1>
      <FlowArrow direction='lr' place='head'/>
      <h1>右左</h1>
      <FlowArrow direction='rl' place='head'/>
      <h1>内外</h1>
      <FlowArrow direction='io' place='head'/>
      <h1>外内</h1>
      <FlowArrow direction='oi' place='head'/>
    </div>
  );
}

export default App;

五、拓展学习

1.repeating-linear-gradient

官方文档:repeating-linear-gradient() - CSS:层叠样式表 | MDN

2.animation

官方文档:animation - CSS:层叠样式表 | MDN

animation 属性是 animation-nameanimation-duration, animation-timing-functionanimation-delayanimation-iteration-countanimation-directionanimation-fill-modeanimation-play-state 属性的一个简写属性形式。

3.@keyFrames

官方文档:@keyframes - CSS:层叠样式表 | MDN


组件源码获取:

  • 关注公众号:程序边界,输入 ‘程序边界 001’ !
  • 直接下载:流动的箭头-线性流动组件(repeating-linear-gradient,@keyFrames)资源-CSDN文库

⭐️ 好书推荐

《Next.js实战》

在这里插入图片描述

【内容简介】

《Next.js实战》详细阐述了与Next.js框架相关的基本解决方案,主要包括Next.js简介、不同的渲染策略、Next.js基础知识和内建组件、在Next.js中组织代码库和获取数据、在Next.js中管理本地和全局状态、CSS和内建样式化方法、使用UI框架、使用自定义服务器、测试Next.js、与SEO协同工作和性能管理、不同的部署平台、管理身份验证机制和用户会话、利用Next.js和GraphCMS构建电子商务网站等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。
在这里插入图片描述

📚 京东购买链接:《Next.js实战》
📚 当当购买链接:《Next.js实战》

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

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

相关文章

docker 安装 logstash

文章目录 Logstash基本语法组成什么是Logstash配置文件&#xff1a;拉去镜像启动镜像 Logstash输入插件&#xff08;input&#xff09;1、标准输入(Stdin)2、读取文件(File) Logstash基本语法组成 什么是Logstash logstash是一个数据抽取工具&#xff0c;将数据从一个地方转移…

Dubbo3应用开发—协议(Dubbo协议、REST协议 、gRPC协议、Triple协议)

协议 协议简介 什么是协议 Client(Consumer端)与Server&#xff08;Provider端&#xff09;在传输数据时双方的约定。 Dubbo3中常见的协议 1.dubbo协议[前面文章中使用的都是dubbo协议] 2.rest协议 3.triple协议 4.grpc协议 5.thirft协议 6.webservice协议 7.rocketmq协议 …

回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测

回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测 目录 回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测预测效果基本介绍模型描述程序设计预测效果 <

【Unet系列】

https://tianfeng.space/1947.html 前言概念 图像分割 分割任务就是在原始图像中逐像素的找到你需要的家伙! 语义分割 就是把每个像素都打上标签&#xff08;这个像素点是人&#xff0c;树&#xff0c;背景等&#xff09; &#xff08;语义分割只区分类别&#xff0c;不区…

Android Studio编写xml布局不提示控件的部分属性问题的解决

最近突然发现Android Studio编写xml&#xff0c;发现有一部分控件的属性没有了代码提示&#xff0c;主要体现为id,margin等属性不再有代码提示&#xff0c;如下图。 但是手动输入仍然有效。然后删掉Android Sdk重新回来还是发现有问题&#xff0c;导一个之前的旧项目进来&#…

Mysql技术文档--慢mysql的优化--工作流--按步排查

这里是用来发现慢sql的一个好方法 --by.阿丹 Prometheus-监控Mysql进阶用法(1)&#xff08;安装配置&#xff09;_一单成的博客-CSDN博客 阿丹&#xff1a; 知道了慢sql的语句那么就开始按照优化步骤对sql进行排查和优化。 1、阅读sql逻辑 首先观察sql语句的书写&#xff0…

智慧邮政:浅述视频监控与AI智能分析技术助力邮政物流智能监管

随着电子商务的蓬勃发展&#xff0c;我国的快递业务量也随之增长&#xff0c;邮政快递业的规模也在不断扩大。快递业务的迅猛发展促进了快递网点数量的爆发式增长&#xff0c;同时也带来了成本投入增加、服务质量下降等各种管理问题。快递企业每年因快递损毁、丢件等事件造成的…

棉花叶病害数据集

Bacterial Blight&#xff08;细菌性枯萎病&#xff09;&#xff1a;细菌性枯萎病是由细菌引起的棉花疾病&#xff0c;主要受害部位是棉花的叶子和茎。这种病害可以导致叶片枯萎、变色和腐烂&#xff0c;对棉花产量产生不利影响。 Curl Virus&#xff08;卷叶病毒&#xff09;…

对比表:阿里云轻量应用服务器和服务器性能差异

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;轻量和ECS优缺点对比&#xff0c;云服务器ECS是明星级云产品&#xff0c;适合企业专业级的使用场景&#xff0c;轻量应用服务器是在ECS的基础上推出的轻量级云服务器&#xff0c;适合个人开发者单机应用访问量不高的网站…

TF坐标变换

ROS小乌龟跟随 5.1 TF坐标变换 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 tf模块&#xff1a;在 ROS 中用于实现不同坐标系之间的点或向量的转换。 在ROS中坐标变换最初对应的是tf&#xff0c;不过在 hydro 版本开始, tf 被弃用&#xff0c;迁移到 tf2,后者更…

Flv.js编译使用

Flv.js &#xff08;https://github.com/bilibili/flv.js&#xff09;是 HTML5 Flash 视频&#xff08;FLV&#xff09;播放器&#xff0c;纯原生 JavaScript 开发&#xff0c;没有用到 Flash。由 bilibili 网站开源。本文讲述其编译使用。 Flv.js目前最新版本是v1.6.2。在htt…

《视觉 SLAM 十四讲》V2 第 5 讲 相机与图像

文章目录 相机 内参 && 外参5.1.2 畸变模型单目相机的成像过程5.1.3 双目相机模型5.1.4 RGB-D 相机模型 实践5.3.1 OpenCV 基础操作 【Code】OpenCV版本查看 5.3.2 图像去畸变 【Code】5.4.1 双目视觉 视差图 点云 【Code】5.4.2 RGB-D 点云 拼合成 地图【Code】 习题题…

美妆护肤品商城小程序的作用是什么?

化妆品几乎可以覆盖所有人群&#xff0c;各式各样的品牌及经销商非常多&#xff0c;主要销售模式为门店零售、线上入驻电商平台售卖、批发等&#xff0c;近些年随着电商发展迭代以及消费升级&#xff0c;对品牌或经销商来说&#xff0c;传统经营模式变得低效&#xff0c;每个人…

华为云云耀云服务器L实例评测|Uniapp开发部署茶叶商城小程序、H5

1、华为云云耀云服务器L实例评测&#xff5c;Uniapp开发茶叶商城小程序、H5 华为云耀云服务器L实例是新一代开箱即用、面向中小企业和开发者打造的全新轻量应用云服务器。多种产品规格&#xff0c;满足您对成本、性能及技术创新的诉求。云耀云服务器L实例提供丰富严选的应用镜像…

Spring Security 6.1.x 系列 (1)—— 初识Spring Security

一、 Spring Security 概述 Spring Security是Spring组织提供的一个开源安全框架&#xff0c;基于Spring开发&#xff0c;所以非常适合在Spring Boot中使用。 官方文档地址&#xff1a;https://docs.spring.io/spring-security/reference/index.html GitHub地址&#xff1a;…

抖音小店怎么运营?运营全流程,不懂的快来看!

我是电商珠珠 抖音小店是抖音旗下的电商平台&#xff0c;对于抖音来说流量是充足的&#xff0c;所以很多人想要在抖音小店上下功夫。 但是关于抖音小店的流程很多人还不太熟悉&#xff0c;今天我就来给大家详细的讲一下。 一、入驻准备 在入驻的时候&#xff0c;需要办理一…

lv7 嵌入式开发-网络编程开发 09 UDP通信

目录 1 用到的相关API 1.1 write/read到send/recv 1.2 sendto与recvfrom 2 UDP通信的实现过程 3 服务端代码、客户端、makefile代码实现 1 用到的相关API 1.1 write/read到send/recv send函数原型&#xff1a; ssize_t send(int sockfd, const void *buf, size_t len, …

Ubuntu MySQL

在安装前&#xff0c;首先看你之前是否安装过&#xff0c;如果安装过&#xff0c;但是没成功&#xff0c;就要先卸载。 一、卸载 1.查看安装 dpkg --list | grep mysql 有东西&#xff0c;就说明您之前安装过mysql。 2.卸载 先停掉server sudo systemctl stop mysql.servic…

基于回溯搜索优化的BP神经网络(分类应用) - 附代码

基于回溯搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于回溯搜索优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.回溯搜索优化BP神经网络3.1 BP神经网络参数设置3.2 回溯搜索算法应用 4.测试结果…

基于Java的飞机航班订票购票管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…