RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 802669
Accepted
Дмитрий Полянин
Дмитрий Полянин
Asked:2020-03-21 22:37:03 +0000 UTC2020-03-21 22:37:03 +0000 UTC 2020-03-21 22:37:03 +0000 UTC

从正方形制作动画 SVG 背景

  • 772

有必要编写一个脚本,以随机旋转创建相似颜色的正方形背景。

背景动画,当鼠标移动时,鼠标悬停的方块变成指定的颜色,这个颜色逐渐变成方块的原色,也是随机旋转动画。

javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Дмитрий Полянин
    2020-03-21T22:37:03Z2020-03-21T22:37:03Z

    基于SVG.js库的解决方案

    /* компоненты базового цвета */
    var rgb = [255,201,218];
    
    /* получаем холст */
    var svg = document.getElementById("svg1");
    
    /* добавляем квадрат с задаными параметрами */
    function AddRect(x, y, width, height) {
      var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
    
      /* вычисляем случайную компоненту цвета близкую к базовой */
      function randomColorComponent(start,dist) {
         var rez = start + Math.floor(Math.random() * dist);
         if(rez > 255) {
           rez = 255;
         }
         return rez;
      }
    
      /* создаём случайный цвет близкий к базовому */
      var rgb2 = rgb.map(x => randomColorComponent(x, 30));
      var color = `rgb(${ rgb2.join(",") })`;
    
      rect.setAttribute("fill", color);
      /* кастомный атрибут, для восстановления цвета */
      rect.setAttribute("mycolor", color);
      rect.setAttribute("stroke", "silver");
      rect.setAttribute("x", x);
      rect.setAttribute("y", y);
      rect.setAttribute("width", width);
      rect.setAttribute("height", height);
      rect.setAttribute("class", "rect1");
    
      /* случайный поворот */
      var rot = Math.random() * 360;
      rect.setAttribute(
        "transform",
        " rotate(" + rot + " " + (x + width / 2) + " " + (y + height / 2) + ")"
      );
    
      /* вешаем обработчик */
      rect.addEventListener("mouseover", mouseOverSquare);
    
      /* добавляем на холст */
      document.getElementById("svg1").appendChild(rect);
    }
    
    /* обработчик наведения мыши на квадрат */
    function mouseOverSquare() {
      /* получаем объект SVG.js из текущего */
      var rect1 = SVG.adopt(this);
    
      /* останавливаем анимацию которая могла быть запущена ранее с сохранением параметров  */
      rect1.finish();
    
      /* перемещаем квадрат наверх холста для большей красоты анимации */
      this.remove();
      svg.append(this);
    
      var rot = (Math.random() - 0.5) * 90;
    
      /* извлекаем цвет для возврата из кастомного атрибута */
      var color = this.getAttribute("mycolor");
    
      /* заполняем новым цветом */
      rect1.fill("rgb(87, 86, 255)");
    
      /* анимируем варщение и возвращение цвета */
      rect1.animate(1100, "-").rotate(rot).attr({
        "fill": color
      });
    }
    
    /* заполнение холста квадратами */
    function FillArea() {
      var style = window.getComputedStyle(svg);
    
      var width = parseInt(style.width);
      var height = parseInt(style.height);
    
      var rectWidth = 24;
      var rectHeight = 24;
    
      var vxx = 27;
      var vyy = 27;
    
      for (var x = -7; x < width; x += vxx) {
        for (var y = -7; y < height; y += vyy) {
          AddRect(x, y, rectWidth, rectHeight);
        }
      }
    }
    
    
    
    FillArea();
    #svg1 {
      width: 100%;
      height: 175px;
      background-color: rgb(255,201,218);
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.4/svg.min.js"></script>
    
    <svg id="svg1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/2000/svg" version="1.1"></svg>

    完整示例代码 -链接

    • 8

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5