Leaflet 中圆形的渐变填充
Gradient fill for circle in Leaflet
我正在寻找一种在 Leaflet 中创建带有渐变填充的圆圈的方法。
到目前为止,我的方法是将圆的 fillColor 定义为 'url(#gradient)' 并通过以下代码手动添加渐变定义:
function createGradient (map) {
// Get the SVG element from the overlayPane
var svg = map.getPanes().overlayPane.firstChild;
var doc = document.implementation.createDocument(null, null, null);
// Create def element
var svgDef = doc.createElement('defs');
// Create gradient and stops element
var svgGradient = doc.createElement("radialGradient");
var svgStart = doc.createElement('stop');
var svgStop = doc.createElement('stop');
// Set ID attribute of gradient
svgGradient.setAttribute('id', 'gradient');
// set stops and colors
svgStart.setAttribute('offset', '0%');
svgStop.setAttribute('offset', '100%');
svgStart.setAttribute('class', 'circle-start');
svgStop.setAttribute('class', 'circle-stop');
svgGradient.appendChild(svgStart);
svgGradient.appendChild(svgStop);
// Append blur element to filter element
svgDef.appendChild(svgGradient);
// Append filter element to SVG element
svg.appendChild(svgDef);
}
有趣的是,最初并没有显示渐变填充。但是,如果我进入 devtools 并删除 'defs' 块并再次添加它,渐变填充将正确显示。
谁能帮我解决这个问题,或者用其他方法获得渐变填充?
您不能使用 createElement 创建 SVG 元素,这仅适用于 html 元素。如果你想创建一个 SVG 元素,你必须使用 createElementNS 在 SVG 命名空间中创建一个元素,即
var svgDef = doc.createElementNS('http://www.w3.org/2000/svg', 'defs');
// Create gradient and stops element
var svgGradient = doc.createElementNS("http://www.w3.org/2000/svg", "radialGradient");
var svgStart = doc.createElementNS('http://www.w3.org/2000/svg', 'stop');
var svgStop = doc.createElementNS('http://www.w3.org/2000/svg', 'stop');
使用 devtools 对内容重新运行 html 解析器,神奇地更正了命名空间。
我正在寻找一种在 Leaflet 中创建带有渐变填充的圆圈的方法。 到目前为止,我的方法是将圆的 fillColor 定义为 'url(#gradient)' 并通过以下代码手动添加渐变定义:
function createGradient (map) {
// Get the SVG element from the overlayPane
var svg = map.getPanes().overlayPane.firstChild;
var doc = document.implementation.createDocument(null, null, null);
// Create def element
var svgDef = doc.createElement('defs');
// Create gradient and stops element
var svgGradient = doc.createElement("radialGradient");
var svgStart = doc.createElement('stop');
var svgStop = doc.createElement('stop');
// Set ID attribute of gradient
svgGradient.setAttribute('id', 'gradient');
// set stops and colors
svgStart.setAttribute('offset', '0%');
svgStop.setAttribute('offset', '100%');
svgStart.setAttribute('class', 'circle-start');
svgStop.setAttribute('class', 'circle-stop');
svgGradient.appendChild(svgStart);
svgGradient.appendChild(svgStop);
// Append blur element to filter element
svgDef.appendChild(svgGradient);
// Append filter element to SVG element
svg.appendChild(svgDef);
}
有趣的是,最初并没有显示渐变填充。但是,如果我进入 devtools 并删除 'defs' 块并再次添加它,渐变填充将正确显示。 谁能帮我解决这个问题,或者用其他方法获得渐变填充?
您不能使用 createElement 创建 SVG 元素,这仅适用于 html 元素。如果你想创建一个 SVG 元素,你必须使用 createElementNS 在 SVG 命名空间中创建一个元素,即
var svgDef = doc.createElementNS('http://www.w3.org/2000/svg', 'defs');
// Create gradient and stops element
var svgGradient = doc.createElementNS("http://www.w3.org/2000/svg", "radialGradient");
var svgStart = doc.createElementNS('http://www.w3.org/2000/svg', 'stop');
var svgStop = doc.createElementNS('http://www.w3.org/2000/svg', 'stop');
使用 devtools 对内容重新运行 html 解析器,神奇地更正了命名空间。