如何修改svg js时间轴图形?

如果您曾经听说过StatusPage.io,则它是Atlassian的产品,可让您为网站创建Statuspage并自定义CSS / HTML / JS。如果您查看this网站,则可以看到条/时间轴基本上是与该设备正常运行时间相对应的历史视图。此时间轴图形最初以“ 90天”视图出现,但是此网站的开发人员添加了JS脚本,将其带入“ 30天”视图。这是下面的脚本:

<script type="text/javascript" charset="utf-8">

  function calculateViewbox (dayCount,rectWidth,rectPadding) {
    var viewBox = [];
    if (dayCount === 90) {
      viewBox.push(0);
    } else {
      var offset = 90 - dayCount;
      viewBox.push((offset * rectWidth) + (rectPadding * (offset))); // x origin
    }
    viewBox.push(0); // y origin
    viewBox.push((rectWidth * dayCount) + (rectPadding * (dayCount - 1))); // svg width
    viewBox.push(34); // svg height
    return viewBox.join(' ');
  }

  // returns the number of visible columns based on the current screen width
  function getVisibleColumns(width,colCount) {
    var ONE_COLUMN_BREAKPOINT = 700,TWO_COLUMN_BREAKPOINT = 900;
    var visibleColumns = 1;
    if (width > TWO_COLUMN_BREAKPOINT) {
      visibleColumns = colCount;
    }
    else if (width > ONE_COLUMN_BREAKPOINT) {
      visibleColumns = Math.min(colCount,2);
    }
    return visibleColumns;
  }

  document.addEventListener('DOMContentLoaded',function () {

    var MAX_WIDTH_30_DAYS = 600,MAX_WIDTH_60_DAYS = 1024,svgs = document.getElementsByClassname('availability-time-line-graphic'),rects = svgs[0].getElementsByTagName('rect'),rectWidth = parseInt(rects[0].getattribute('width')),rectPadding = parseInt(rects[1].getattribute('x')) - parseInt(rects[0].getattribute('x')) - rectWidth,throttled = false,delay = 150,timeoutId,prevCols,colCount = 3;

    function getKeyAndCount(width) {
      var visibleColumns = getVisibleColumns(width,colCount);
      if (width <= MAX_WIDTH_30_DAYS || visibleColumns > 1) {
        return { dayCount: 30,uptimeKey: 'thirty',visibleColumns: visibleColumns }
      } else if (width <= MAX_WIDTH_60_DAYS) {
        return { dayCount: 60,uptimeKey: 'sixty',visibleColumns: visibleColumns }
      } else {
        return { dayCount: 90,uptimeKey: 'ninety',visibleColumns: visibleColumns }
      }
    }

    function setUptimeValue(values,uptimeKey,shouldShorten) {
      var queryID = '.legend-item-' + values.component;
      var currentUptime = document.querySelector(queryID);
      if (currentUptime) {
        // Faster than setting innerHTML to "" then adding nodes
        var clone = currentUptime.cloneNode(false);
        var uptimeSpan = document.createElement('span');
        uptimeSpan.id = 'uptime-percent-' + values.component
        uptimeSpan.innerText = values[uptimeKey]
        clone.appendChild(uptimeSpan);
        var appendText = document.createTextNode(shouldShorten ? ' %' : ' % uptime');
        clone.appendChild(appendText);
        currentUptime.parentNode.replaceChild(clone,currentUptime);
      }
    }

    function setDayCount(el,dayCount,shouldShorten) {
      // Faster than setting innerHTML to "" then adding nodes
      var clone = el.cloneNode(false);
      var dateSpan = document.createElement('span')
      dateSpan.classname = "availability-time-line-legend-day-count"
      dateSpan.innerText= dayCount;
      clone.appendChild(dateSpan);
      var appendText = document.createTextNode(shouldShorten ? ' days' : ' days ago');
      clone.appendChild(appendText);
      el.parentNode.replaceChild(clone,el);
    }

    function resizeSvgViewBoxes () {
      var width = window.innerWidth;
      var columnInfo = getKeyAndCount(width);
      var dayCount = columnInfo.dayCount,uptimeKey = columnInfo.uptimeKey;
      var newViewboxValue = calculateViewbox(dayCount,rectPadding);

      // If a user quickly resizes from < 450 to > 900 without stopping,// it will retain the same 30 day info as it wont have changed,but this only
      // impacts 30 day display as it is the only one with shortened text
      if (newViewboxValue !== svgs[0].getattribute('viewBox') || prevCols !== columnInfo.visibleColumns) {
        prevCols = columnInfo.visibleColumns
        for (var i = 0; i < svgs.length; i++) {
          var el = svgs[i];
          if (el.getattribute('viewBox') !== newViewboxValue) {
            el.setattribute('viewBox',newViewboxValue);
          }
        }
        var shouldShorten = columnInfo.visibleColumns === 3;

        var dayCountElements = document.querySelectorAll('.legend-item-date-range:first-of-type');

        for (var i = 0; i < dayCountElements.length; i++) {
          setDayCount(dayCountElements[i],shouldShorten);
        }

        uptimeValues = [{"component":"x1v3t5qrnlhk","ninety":100.0,"sixty":100.0,"thirty":100.0},{"component":"0l5xn1l7qs8f",{"component":"bpfmy8wy8wq2",{"component":"zxxnbynf4dkm","ninety":99.95,"sixty":99.93,"thirty":99.86},{"component":"sw1j7xsbdlk4","ninety":99.96,"sixty":99.95,"thirty":99.92},{"component":"8v2msyx3y53z",{"component":"bckmjhmfhjnb",{"component":"01xvh5h7yc4l",{"component":"8g8cdcv5h95x","thirty":100.0}];

        for (var i = 0; i < uptimeValues.length; i++) {
          setUptimeValue(uptimeValues[i],shouldShorten)
        }

        const uptimeLinkVar = document.querySelector('.components-uptime-link > var')
        if (uptimeLinkVar) {
          uptimeLinkVar.innerHTML = dayCount;
        }
      }
    }

    window.addEventListener('resize',function () {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(function () {
        resizeSvgViewBoxes();
      },delay);
    });

    resizeSvgViewBoxes();
  });
</script>

此脚本最终对我有用,但我需要创建一个1天视图,而不是30/60/90天,该天将一天分成24个块/小时,其中每个块代表一个小时时间。谁能帮帮我吗?我对JS不够熟悉,我不确定如何将其从“天”级别转换为“小时”级别视图。谢谢大家。

shuiyezhu 回答:如何修改svg js时间轴图形?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3164055.html

大家都在问