首页 > 其他分享 >SolidJS-每日小知识(9/15)

SolidJS-每日小知识(9/15)

时间:2024-09-16 10:35:01浏览次数:12  
标签:15 attr 知识 SolidJS 设置 圆圈 const circle event

知识介绍

  1. 在视图缩放时,对SVG中的元素也进行缩放,使得text、circle等在放大后不会过于占据视野
  2. 对mainSVG中的蓝点增加双击强调的效果
  3. 对双击强调后的蓝点在lenSVG视图中,增加其他元素的半透明效果

代码分析

1 在视图缩放时,对SVG中的元素也进行缩放,使得text、circle等在放大后不会过于占据视野

  1. 对于需要控制的元素复制到变量
        // 绘制Y坐标点的圆圈
        const drawingCircle = g.selectAll('circle.drawingData')
            .data(ypoints()) // 绑定数据
            .enter().append('circle') // 创建圆元素
            .attr('class', 'drawingData') // 设置类名
            .attr('cx', d => x(d.coords[0])) // 设置圆心X坐标
            .attr('cy', d => y(d.coords[1])) // 设置圆心Y坐标
            .attr('r', 2) // 设置圆的半径
            .attr('fill', 'red') // 设置圆的填充颜色
            .on('mouseover', (event, d) => { // 鼠标悬停事件
                const tooltip = d3.select('body') // 选择body元素创建tooltip
                    .append('div')
                    .attr('class', 'tooltip')
                    .style('position', 'absolute') // 绝对定位
                    .style('background-color', 'white') // 背景色
                    .style('border', '1px solid black') // 边框样式
                    .style('padding', '5px') // 内边距
                    .style('pointer-events', 'none') // 不响应鼠标事件
                    .style('left', `${event.pageX + 10}px`) // 设置tooltip左位置
                    .style('top', `${event.pageY + 10}px`) // 设置tooltip顶部位置
                    .text(d.text); // 显示文本内容
            })
            .on('mouseout', () => {
                d3.select('.tooltip').remove(); // 鼠标移出时移除tooltip
            });

        // 绘制X坐标点的文本标签
        const textElements = g.selectAll('text')
            .data(xpoints()) // 绑定数据
            .enter().append('text') // 创建文本元素
            .attr('x', d => x(d.coords[0]) - 5) // 设置文本X位置
            .attr('y', d => y(d.coords[1]) + 5) // 设置文本Y位置
            .text(d => d.name) // 设置文本内容
            .attr('font-family', 'sans-serif') // 设置字体
            .attr('font-size', '10px') // 设置字体大小
            .attr('fill', 'black') // 设置文本颜色
            .attr('opacity', 0); // 初始设置为不可见  
  1. 在zoom行为中修改对应元素的属性
        // 添加缩放行为
        const zoomBehavior = zoom()
            .scaleExtent([0.5, 5]) // 设置缩放范围
            .on('zoom', (event) => {
                g.attr('transform', event.transform); // 应用缩放变换到g元素
                updateLenSVG(event.transform); // 更新Len SVG的视图

                const fontSize= 12 / event.transform.k; // 根据缩放比例调整字体大小

                textElements.attr('font-size', `${fontSize}px`);

                // 根据缩放比例设置 opacity
                if (event.transform.k > 1.5) { // 假设1.5是可见的阈值
                  textElements.attr('opacity', 1); // 可见
                } else {
                    textElements.attr('opacity', 0); // 不可见
                }

                drawingCircle.attr('r', 2 / (event.transform.k*0.6)); // 根据缩放比例调整圆的半径
            });

2 对mainSVG中的蓝点增加双击强调的效果

    // 选择所有的圆圈,绑定数据,并创建新的圆圈
    g.selectAll('circle.blue')
      .data(data()) // 绑定数据
      .enter().append('circle') // 创建新的圆圈
      .attr('class', 'blue') // 添加类名
      .attr('cx', d => x(d.x)) // 设置圆圈的x坐标
      .attr('cy', d => y(d.y)) // 设置圆圈的y坐标
      .attr('r', 5) // 设置圆圈的半径
      .attr('fill', 'steelblue') // 设置圆圈的颜色
      .on('dblclick', function(event, d) {
        // 阻止双击事件的默认行为
        event.preventDefault();
        
        // 双击时添加土黄色圆环
        const circle = d3.select(this);
        const cx = circle.attr('cx');
        const cy = circle.attr('cy');
        
        g.append('circle') // 在同一个g元素中添加新的圆圈
          .attr('class', 'highlight') // 可以给这个圆圈添加一个类名以便于后续操作
          .attr('cx', cx) // 设置与被点击圆圈相同的x坐标
          .attr('cy', cy) // 设置与被点击圆圈相同的y坐标
          .attr('r', 10) // 设置土黄色圆圈的半径(稍大于原始圆圈)
          .attr('fill', 'none') // 填充颜色设为无
          .attr('stroke', 'sandybrown') // 设置边框颜色为土黄色
          .attr('stroke-width', 2); // 设置边框宽度
      });

3 对双击强调后的蓝点在lenSVG视图中,增加其他元素的半透明效果

请注意:当selectedPoints的数据为浮点数时,可能会比较异常,转换成字符串再比较即可

  1. 创建selectedPoints信号量,保存被选中的蓝点
    const [selectedPoints, setSelectedPoints] = createSignal([]);
  2. 在蓝点的双击事件中,将被选中的蓝点保存到selectedPoints信号量中
.on('dblclick', function(event, d) {
  // 阻止双击事件的默认行为
  event.preventDefault();
  
  // 获取当前选中的蓝点数组
  const currentSelected = selectedPoints();

  // 检查该点是否已经被选中
  if (currentSelected.includes(d)) {
    // 如果已选中,则移除
    setSelectedPoints(currentSelected.filter(point => point !== d));
  } else {
    // 如果未选中,则添加到选中状态中
    setSelectedPoints([...currentSelected, d]);
  }

  // 双击时添加土黄色圆环
  const circle = d3.select(this);
  const cx = circle.attr('cx');
  const cy = circle.attr('cy');
  
  g.append('circle') // 在同一个g元素中添加新的圆圈
    .attr('class', 'highlight') // 可以给这个圆圈添加一个类名以便于后续操作
    .attr('cx', cx) // 设置与被点击圆圈相同的x坐标
    .attr('cy', cy) // 设置与被点击圆圈相同的y坐标
    .attr('r', 10) // 设置土黄色圆圈的半径(稍大于原始圆圈)
    .attr('fill', 'none') // 填充颜色设为无
    .attr('stroke', 'sandybrown') // 设置边框颜色为土黄色
    .attr('stroke-width', 2); // 设置边框宽度
});

  1. 在updateLenSVG中,根据selectedPoints信号量中的数据,对其他元素进行半透明处理
    // 生成配对数据并在成对的点之间画线
    const pairedData = data().map((d, i) => ({
      blue: d,
      red: redData()[i],
    }));

    g.selectAll('line.connection').remove(); // 移除旧的线条

    // 更新lenSVG中的内容
    g.selectAll('line.connection')
      .data(pairedData)
      .enter().append('line')
      .attr('class', 'connection')
      .attr('x1', d => x(d.blue.x))
      .attr('y1', d => y(d.blue.y))
      .attr('x2', d => x(d.red.x))
      .attr('y2', d => y(d.red.y))
      .attr('stroke', (d) => selectedPoints().includes(d.blue) ? 'black' : 'rgba(0, 0, 0, 0.2)') // 设置为黑色或半透明
      .attr('stroke-width', 1);

标签:15,attr,知识,SolidJS,设置,圆圈,const,circle,event
From: https://www.cnblogs.com/Frey-Li/p/18416059

相关文章

  • springboot+vue信息安全知识学习微信小程序【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,信息安全已成为现代社会不可忽视的重要议题。网络攻击、数据泄露、隐私侵犯等事件频发,不仅给个人用户带来巨大损失,也对企业的运营安全和国家的信息安全构成了严峻挑战。在此背景下,提升公众的信息安全意识和技......
  • 嵌入式开发必懂入门知识:认识嵌入式元件
    目录第一章嵌入式元件基础1.1电阻1.1.1电阻的基本概念与单位1.1.2电阻的种类及其在电路中的作用1.2电容1.2.1电容的基本原理与分类1.2.2电容在电路中的储能与滤波作用1.3电感1.3.1电感的基本概念与单位1.3.2电感在电路中的电磁感应作用第二章半导体元件......
  • Linux内存管理知识-一篇文章了解堆和栈区别(进阶篇)
    前面已经介绍过,栈是由编译器在需要时分配的,不需要时自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。堆是由malloc()函数分配的内存块,内存释放由程序员手动控制,在C语言为free函数完成。栈和堆的主要区别有以下几点:(1)管理方式不同栈编译器自动管理,无需程序员手......
  • Java知识了解Day2
    Java知识了解Day22024年7月2日11:40:17时间有限,了解一小部分知识Java是半解释半编译型语言,半动态半静态。一、变量基本数据类型和运算符1.变量变量就是存储数据的*“房间”*,通过变量名、变量类型来区分内存中不同的数据。插写一点有关编写程序的想法,上课讲到......
  • Java知识及每日一题Day3
    Day32024年9月8日14:23:37再次跟上Java的补漏学习,重点关注细节知识点,强化重点。一、入门程序编码没有问题,顺便复习一下dos命令:创建文件夹并切换路径mkdirD:\JavaLearning\JavaLesson\DemocdD:\JavaLearning\JavaLesson\Demo创建文件并使用记事本打开(需要管理......
  • Day4_Java知识及每日一题:最长回文串
    Day42024年9月9日15:38:20一、java文件名和类名一致性问题首先明确,不是必须一致。若一个类是公共(public)的,则应该在一个同名的java文件中声明。反之default类型的类声明则可以成功通过编译,编译后的.class文件和所声明的类名一致。publicclassDemo01_HelloWorld{pu......
  • 上周热点回顾(9.9-9.15)
    热点随笔:· 秋天希望的田野,九月最后的救园:终身会员计划 (博客园团队)· 41岁的大龄程序员,苟着苟着,要为以后做打算了 (Tobin)· 关于.NET在中国为什么工资低的分析 (迅捷网络[来送福利])· .NET9的新亮点:AI就绪,拥抱她 (张善友)· 45岁大龄程序员自述:我居然还苟在程序......
  • Cisco Jabber 15.0 发布下载 - 面向企业的多合一通信工具
    CiscoJabber15.0(Andriod,iOS,macOS,Windows)-面向企业的多合一通信工具即时消息、语音和视频通话、语音邮件、桌面共享、会议和在线状态请访问原文链接:https://sysin.org/blog/cisco-jabber-15/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org思科Jabber......
  • 9.15 比赛总结
    突然想起来自己把比赛总结的好习惯忘掉了,所以现在重新拾起,故名曰《朝花夕拾》。T1出了个大阴间题看数据范围明显状压。很明显,\(a,b\)分成两部分处理。\(f_{s,i}\)表示状态为\(s\),\(a=i\)时的所有情况之和,还要计算\(num_{s,i}\)表示此时情况数。\(b\)直接递推模拟即可......
  • mysql学习教程,从入门到精通,TOP 和MySQL LIMIT 子句(15)
    1、TOP和MySQLLIMIT子句内容在SQL中,不同的数据库系统对于限制查询结果的数量有不同的实现方式。TOP关键字主要用于SQLServer和Access数据库中,而LIMIT子句则主要用于MySQL、PostgreSQL(通过LIMIT/OFFSET语法)、SQLite等数据库中。下面将分别详细介绍这两个功能......