- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我构建了一个 SVG 条形图,它似乎在除 IE 之外的所有浏览器中都能正常工作。我的刻度、标签、条形等未在 IE 中呈现。仅渲染轴线。
经过初步的 IE + SVG 搜索后,我尝试向图表添加 viewbox 属性,但这并没有改变任何东西。它仍然以同样不受欢迎的方式呈现。我在 IE 控制台中没有看到任何错误。我缺少什么?
我会分享一些代码,但最好将此处的代码复制/粘贴到支持使用 IE 查看的位置:https://codepen.io/Finches/pen/QWWarrp
<svg id="hourly-chart" height="285">
<g transform="translate(40,40)">
<g class="y axis" id="y-axis-ticks">
<line class="y-axis-zero-line axis-line" id="y-axis-zero-line" x1="0" y1="0" x2="0" y2="240"></line>
</g>
<g id="hourly-chart-bars"></g>
<g class="x axis" id="hourly-x-ticks" transform="translate(0,0)">
<line class="x-axis-zero-line axis-line" id="x-axis-zero-line" x1="0" y1="240" x2="600" y2="240"></line>
</g>
</g>
</svg>
预期结果与 Chrome 和 IE 上的图表相同。实际结果是 Chrome 中的正确图表,但 IE 中是仅绘制轴线的空白图表。
有什么帮助吗?
最佳答案
该问题与 Internet Explorer 目前不支持 SVG 元素上的innerHTML 属性有关。因此,新节点不会附加到 SVG 元素。您可以使用 console.log() 方法来检查该值。
为了解决这个问题,我们可以使用 createElementNS() 方法创建一个 SVG 节点元素,然后使用 document.appendChild() 方法在 SVG 元素中添加新节点。
//add <g> node
var newg = document.createElementNS('http://www.w3.org/2000/svg', 'g');
newg.setAttribute('class', 'tick');
newg.setAttribute('transform', 'translate(0,' + (height - 60 * j) + ')');
//add <line> node
var newLine3 = document.createElementNS('http://www.w3.org/2000/svg', 'line');
newLine3.setAttribute('class', 'gray');
newLine3.setAttribute('x1', '0');
newLine3.setAttribute('y1', '0');
newLine3.setAttribute('x2', '-30');
newLine3.setAttribute('y2', '0');
newg.appendChild(newLine3);
var newLine4 = document.createElementNS('http://www.w3.org/2000/svg', 'line');
newLine4.setAttribute('class', 'gray');
newLine4.setAttribute('x1', '0');
newLine4.setAttribute('y1', '0');
newLine4.setAttribute('x2', width);
newLine4.setAttribute('y2', '0');
newg.appendChild(newLine4);
//add <text> node
var newtext = document.createElementNS('http://www.w3.org/2000/svg', 'text');
newtext.setAttribute('class', 'y-tick');
newtext.setAttribute('dy', '.32em');
newtext.setAttribute('x', '-9');
newtext.setAttribute('y', '-30');
newtext.setAttribute('style', 'text-anchor: end;');
newtext.textContent = ticks[j];
newg.appendChild(newtext);
//using appendChild method to add child node.
tickContainer.appendChild(newg);
详细示例代码如下:
<link href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap" rel="stylesheet">
<div class="hourly-chart-wrapper">
<svg id="hourly-chart" height="285" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(40,40)">
<g class="y axis" id="y-axis-ticks">
<line class="y-axis-zero-line axis-line" id="y-axis-zero-line" x1="0" y1="0" x2="0" y2="240"></line>
</g>
<g id="hourly-chart-bars"></g>
<g class="x axis" id="hourly-x-ticks" transform="translate(0,0)">
<line class="x-axis-zero-line axis-line" id="x-axis-zero-line" x1="0" y1="240" x2="600" y2="240"></line>
</g>
</g>
</svg>
</div>
<script>
var index = 0;
// Total bar container width 35 px
// Labels before formatting
var labels = [['Wed', '11 PM'], ['Thu', '12 AM'], ['Thu', '1 AM'], ['Thu', '2 AM'], ['Thu', '3 AM'], ['Thu', '4 AM'], ['Thu', '5 AM'], ['Thu', '6 AM'], ['Thu', '7 AM'], ['Thu', '8 AM'], ['Thu', '9 AM'], ['Thu', '10 AM'], ['Thu', '11 AM'], ['Thu', '12 PM'], ['Thu', '1 PM'], ['Thu', '2 PM'], ['Thu', '3 PM'], ['Thu', '4 PM'], ['Thu', '5 PM'], ['Thu', '6 PM'], ['Thu', '7 PM'], ['Thu', '8 PM'], ['Thu', '9 PM'], ['Thu', '10 PM'], ['Thu', '11 PM'], ['Fri', '12 AM'], ['Fri', '1 AM'], ['Fri', '2 AM'], ['Fri', '3 AM']]; // Data points
var data = [0.25, 0.56, 0.5, 0.5, 0.86, 0.45, 0.3, 0, 0.3, 0.6, 0.4, 0, 0, 0.8, 0, 0, 0.4, 0.3, 0.1, 0, 0, 0.2, 0, 0, 0.4, 0.7, 0.1, 0.6, 0.4]; // Get max value from data set
var maxDataValue = Math.max.apply(Math, data); // Max Y Tick
var maxYValue = yAxisRangeImperial(maxDataValue); // Get chart svg
var hourlyChart = document.getElementById('hourly-chart'); // Get y axis ticks g
var tickContainer = document.getElementById('y-axis-ticks'); // Get y axis zero line
var yAxisZeroLine = document.getElementById('y-axis-zero-line'); // Get x axis zero line
var xAxisZeroLine = document.getElementById('x-axis-zero-line'); // Get chart ticks by id
var hourlyChartXTicks = document.getElementById('hourly-x-ticks'); // Get chart bar group by id
var hourlyChartBars = document.getElementById('hourly-chart-bars'); // Function to determine chart width
function chartWidth(data) {
var width = 600;
var possibleWidth = data.length * 35;
if (possibleWidth > 600) {
width = possibleWidth;
}
return width;
} // Function to figure out max Y Tick
function yAxisRangeImperial(max) {
if (max < 1) {
return 1;
} else if (max < 2) {
return 2;
} else if (max < 4) {
return 4;
} else if (max < 8) {
return 8;
} else if (max < 12) {
return 12;
} else if (max < 24) {
return 24;
} else if (max < 48) {
return 48;
} else if (max < 72) {
return 72;
} else if (max < 96) {
return 96;
} else {
return 192;
}
}
; // Function to populate the y axis ticks and depth labels
function populateHourlyYAxisLabels(max, unit) {
var interval = max / 4;
var ticks = [interval + unit, interval * 2 + unit, interval * 3 + unit, interval * 4 + unit];
var width = chartWidth(data);
var height = 240;
//tickContainer.appendChild('<line class="gray" x2="-30" y2="0"></line><line class="gray" x1="0" x2="' + width + '" y2="0"></line>');
var newLine = document.createElementNS('http://www.w3.org/2000/svg', 'line');
newLine.setAttribute('class', 'gray');
newLine.setAttribute('x1', '0');
newLine.setAttribute('y1', '0');
newLine.setAttribute('x2', '-30');
newLine.setAttribute('y2', '0');
tickContainer.appendChild(newLine);
var newLine2 = document.createElementNS('http://www.w3.org/2000/svg', 'line');
newLine2.setAttribute('class', 'gray');
newLine2.setAttribute('x1', '0');
newLine2.setAttribute('y1', '0');
newLine2.setAttribute('x2', width);
newLine2.setAttribute('y2', '0');
tickContainer.appendChild(newLine2);
xAxisZeroLine.setAttribute("x2", width);
for (var j = ticks.length - 1; j >= 0; j--) {
if (j !== 0) {
//tickContainer.innerHTML += '<g class="tick" transform="translate(0,' + (height - 60 * j) + ')"><line class="gray" x2="-30" y2="0"></line>
//<line class="gray" x1="0" x2="' + width + '" y2="0"></line>
//<text class="y-tick" dy=".32em" x="-9" y="-30" style="text-anchor: end;">' + ticks[j] + '</text></g > ';
var newg = document.createElementNS('http://www.w3.org/2000/svg', 'g');
newg.setAttribute('class', 'tick');
newg.setAttribute('transform', 'translate(0,' + (height - 60 * j) + ')');
var newLine3 = document.createElementNS('http://www.w3.org/2000/svg', 'line');
newLine3.setAttribute('class', 'gray');
newLine3.setAttribute('x1', '0');
newLine3.setAttribute('y1', '0');
newLine3.setAttribute('x2', '-30');
newLine3.setAttribute('y2', '0');
newg.appendChild(newLine3);
var newLine4 = document.createElementNS('http://www.w3.org/2000/svg', 'line');
newLine4.setAttribute('class', 'gray');
newLine4.setAttribute('x1', '0');
newLine4.setAttribute('y1', '0');
newLine4.setAttribute('x2', width);
newLine4.setAttribute('y2', '0');
newg.appendChild(newLine4);
var newtext = document.createElementNS('http://www.w3.org/2000/svg', 'text');
newtext.setAttribute('class', 'y-tick');
newtext.setAttribute('dy', '.32em');
newtext.setAttribute('x', '-9');
newtext.setAttribute('y', '-30');
newtext.setAttribute('style', 'text-anchor: end;');
newtext.textContent = ticks[j];
newg.appendChild(newtext);
tickContainer.appendChild(newg);
} else {
//tickContainer.innerHTML += '<g class="tick" transform="translate(0,' + height + ')">
//<line x2="-30" y2="0"></line>
//<text dy=".32em" x="-9" y="-30" style="text-anchor: end;">' + ticks[j] + '</text></g > ';
var newg = document.createElementNS('http://www.w3.org/2000/svg', 'g');
newg.setAttribute('class', 'tick');
newg.setAttribute('transform', 'translate(0,' + (height - 60 * j) + ')');
var newLine3 = document.createElementNS('http://www.w3.org/2000/svg', 'line');
newLine3.setAttribute('class', 'gray');
newLine3.setAttribute('x1', '0');
newLine3.setAttribute('y1', '0');
newLine3.setAttribute('x2', '-30');
newLine3.setAttribute('y2', '0');
newg.appendChild(newLine3);
var newtext = document.createElementNS('http://www.w3.org/2000/svg', 'text');
newtext.setAttribute('dy', '.32em');
newtext.setAttribute('x', '-9');
newtext.setAttribute('y', '-30');
newtext.setAttribute('style', 'text-anchor: end;');
newtext.textContent = ticks[j];
newg.appendChild(newtext);
tickContainer.appendChild(newg);
}
};
}; // Function to determine hour display interval
function hoursLabelInterval(hours) {
if (hours <= 6) {
return 1;
} else if (hours <= 12) {
return 2;
} else if (hours <= 24) {
return 4;
} else if (hours <= 36) {
return 6;
} else if (hours <= 48) {
return 8;
} else if (hours <= 60) {
return 10;
} else if (hours <= 72) {
return 12;
} else {
return 24;
}
} // Function to create x axis labels
function createLabels(labels) {
var hoursInterval = hoursLabelInterval(labels.length);
var currentDay = '';
var formattedLabels = labels.map(function (label, i) {
if (i % hoursInterval === 0) {
if (label[0] !== currentDay) {
currentDay = label[0];
return [label[0], label[1]];
}
return ['', label[1]];
}
return ['', ''];
});
for (var i = 0; i < formattedLabels.length; i++) {
var translateDistance = void 0;
if (i === 0) {
translateDistance = 15;
} else {
translateDistance = i * 30 + 15;
}
if (formattedLabels[i][1].length && i !== 0) {
//hourlyChartXTicks.innerHTML += '
//<g class="tick" transform="translate(' + translateDistance + ',0)">
//<line class="y-axis-zero-line axis-line dash gray" stroke-dasharray="4" stroke-width="1" x1="-13" y1="0" x2="-13" y2="240"></line>
//<text class="label-day" dy=".71em" y="-20" x="0">' + formattedLabels[i][0] + '</text>
//<text class="label-time" dy=".71em" y="-10" x="0">' + formattedLabels[i][1] + '</text></g > ';
var newg = document.createElementNS('http://www.w3.org/2000/svg', 'g');
newg.setAttribute('class', 'tick');
newg.setAttribute('transform', 'translate(' + translateDistance + ',0)');
var newLine3 = document.createElementNS('http://www.w3.org/2000/svg', 'line');
newLine3.setAttribute('class', 'y-axis-zero-line axis-line dash gray');
newLine3.setAttribute('stroke-dasharray', '4');
newLine3.setAttribute('stroke-width', '1');
newLine3.setAttribute('x1', '-13');
newLine3.setAttribute('y1', '0');
newLine3.setAttribute('x2', '-13');
newLine3.setAttribute('y2', '240');
newg.appendChild(newLine3);
var newtext = document.createElementNS('http://www.w3.org/2000/svg', 'text');
newtext.setAttribute('class', 'label-day');
newtext.setAttribute('dy', '.71em');
newtext.setAttribute('x', '0');
newtext.setAttribute('y', '-20');
newtext.textContent = formattedLabels[i][0];
newg.appendChild(newtext);
var newtext = document.createElementNS('http://www.w3.org/2000/svg', 'text');
newtext.setAttribute('class', 'label-time');
newtext.setAttribute('dy', '.71em');
newtext.setAttribute('x', '0');
newtext.setAttribute('y', '-10');
newtext.textContent = formattedLabels[i][1];
newg.appendChild(newtext);
hourlyChartXTicks.appendChild(newg);
} else {
// hourlyChartXTicks.innerHTML += '
//<g class="tick" transform="translate(' + translateDistance + ',0)">
//<text class="label-day" dy=".71em" y="-20" x="0">' + formattedLabels[i][0] + '</text>
//<text class="label-time" dy=".71em" y="-10" x="0">' + formattedLabels[i][1] + '</text></g > ';
var newg = document.createElementNS('http://www.w3.org/2000/svg', 'g');
newg.setAttribute('class', 'tick');
newg.setAttribute('transform', 'translate(' + translateDistance + ',0)');
var newtext = document.createElementNS('http://www.w3.org/2000/svg', 'text');
newtext.setAttribute('class', 'label-day');
newtext.setAttribute('dy', '.71em');
newtext.setAttribute('x', '0');
newtext.setAttribute('y', '-20');
newtext.textContent = formattedLabels[i][0];
newg.appendChild(newtext);
var newtext = document.createElementNS('http://www.w3.org/2000/svg', 'text');
newtext.setAttribute('class', 'label-time');
newtext.setAttribute('dy', '.71em');
newtext.setAttribute('x', '0');
newtext.setAttribute('y', '-10');
newtext.textContent = formattedLabels[i][1];
newg.appendChild(newtext);
hourlyChartXTicks.appendChild(newg);
}
}
} // Function to compute bar height
function barHeight(maxChartYTick, individualBarAccumulation) {
var barHeightDecimalPercentage = individualBarAccumulation / maxChartYTick;
return barHeightDecimalPercentage;
} // Function to create bars
function createBars(data, maxYTick) {
for (var k = 0; k < data.length; k++) {
var translateDistance = void 0;
if (k === 0) {
translateDistance = 5;
} else {
translateDistance = 5 + k * 30;
}
var height = barHeight(maxYTick, data[k]);
//hourlyChartBars.innerHTML += '<rect class="bar" x="' + translateDistance + '" width="25" y="' + (240 - 240 * height) + '" height="' + 240 * height + '"></rect>';
var newrect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
newrect.setAttribute('class', 'bar');
newrect.setAttribute('x', translateDistance);
newrect.setAttribute('width', '25');
newrect.setAttribute('y', (240 - 240 * height));
newrect.setAttribute('height', (240 * height));
hourlyChartBars.appendChild(newrect);
console.log((index++) + ": " + hourlyChartBars.innerHTML);
}
}
hourlyChart.setAttribute("width", chartWidth(data));
populateHourlyYAxisLabels(maxYValue, '"');
createLabels(labels);
createBars(data, maxYValue);
</script>
IE浏览器中的结果:
关于javascript - 为什么我的 svg 图表无法在 IE 中正确呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58704474/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
有两个 SVG 元素( SVG1 和 SVG2 ),其中 SVG1 是一个包含各种元素的大区域,会不时添加、删除和重新定位。另一方面,SVG2 需要用作 图标化表示(小) SVG1 的版本,非常小,但
我知道我们可以使用 document.createElementNS("http://www.w3.org/2000/svg","line"); 创建一个嵌入到html页面。 但是,这种方法似乎不适用
我正在尝试使用 Flutter SVG 依赖项,我将 svg 放入 Assets 中,在 pubspec.yaml 中设置,并在我的小部件中设置,但是,使用黑色容器加载 svg 我已经尝试过更改 sv
为什么这样的演示:http://jsbin.com/ejorus/2/edit,将元素嵌套在另一个元素内? JS
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试在 SVG 中做一些非常简单的事情: 将整个视口(viewport)分成两个矩形 每个矩形的宽度应为视口(viewport)宽度的 50% 每个矩形的高度应为视口(viewport)高度的
我试图将 play svg 居中放置在 SVG 圆圈的中间,但似乎不知道该怎么做。 垂直和水平。 https://jsfiddle.net/c0qshm0t/17/ 最
是否可以使用一个 SVG 形状作为另一个形状的填充? 最佳答案 您想使用 SVG Pattern .见 this example : 注意
我在 SVG 中有一个非常简单的路径。 (预览:https://i.imgur.com/nVnxcRg.png) 我想要
我可以通过以下方式创建多边形: #!/usr/bin/env python from shapely.geometry import Polygon area = Polygon(((52, 13),
我使用 require 的 SVG 没有显示。 在我的终端中,svg Assets 被发出并且路径在我的 html 中正确设置。 但是,SVG 不会显示,而其他格式(如 jpg 或 png)可以显示
我在 SVG 混合模式中遇到了问题。我在 SVG 中有四个路径,我想用公式组合它们:(1*2) + (3*4),即路径 1 和路径 2 应该使用乘法模式混合,类似地路径 3 和路径 4 应该使用混合相
我无法超过 2 个级别。 (在 Iceweasel 和 Chromium 上尝试过。) 作为测试,我尝试了 this earlier reply 中提供的代码的变体。 .这个由 3 个单独的文件组成,
请引用以下组中的clip-path 组 ID -> “container_svg_symbolGroup1_0(即圆圈符号)在我删除图表中可见的剪辑路径时不可见。 问题是什么?为什么
使用联合 js 在 svg 中创建了一个文本区域。但是,我无法在文本区域中输入任何文本。如何使文本区域可编辑? 代码: var graph = new joint.dia.Graph;
您可以不受限制地停止和重复动画,但如果您重新启动一个不确定的动画,它将失去其累积值并从初始值开始。 也许我应该用一个例子来澄清;拿这个动画: 如果我停止此动画,并开始影响同一对象旋转的不同动画(
如果我在浏览器中显示常规 SVG(作为独立文件或嵌入在 HTML 中),在拥有大量单独的路径元素和一个巨大的路径元素之间在效率上是否有任何理论上的差异? 我正在考虑将某种动画从一张图片变成一张完全不同
logo的turtlegraphics的svg路径中是否有等价物? 而不是硬编码的 x 和 y 坐标,这也迫使我在移动更相对的“增量”方法时调整控制点。 我的解决方案应该适用于 FOCS(Firefo
目前正在使用 SVG 元素与一堆 元素将使它具有一种逐渐变细的边缘。我尝试了很多不同的 CSS 样式来解决这个问题,但没有任何效果。这是一个带有针迹的圆圈的代码:
我是一名优秀的程序员,十分优秀!