我的页面上有一个SVG元素。我想用它作为页面的图标。我如何在JavaScript中执行此操作?
答案 0 :(得分:16)
这样做令人惊讶令人费解。您可以在行动here中看到我的解决方案:下面介绍了该方法(通过ID或其他方式获取HTML元素,留给读者练习。)
xmlns="http://www.w3.org/2000/svg"
,因为您将需要将元素的源作为其自己的文件,并且独立SVG文件需要XMLNS声明。 (另请注意,这意味着您的SVG需要是自包含的,并且不能使用<use>
等内容引用其父文档中的元素。)<div>
或<span>
中,您可以使用<svg>
来获取.innerHTML
元素的内容。 (当前HTML标准中的SVG元素不存在innerHTML
和outerHTML
属性。)<link rel="icon">
。<head>
醇>
innerHTML
属性,或通过调用SVG元素上的new XMLSerializer().serializeToString()
,获取要设置为favicon的SVG元素的来源。 "data:image/svg+xml,"
添加到源代码,为此元素创建一个DataURL作为文档。 (如果大多数浏览器都支持SVG for favicons,我们会在这里完成,但是在编写本文时,他们没有,我们必须更深入。)<img>
元素,您将对图像进行路由,为load
事件添加一个事件侦听器,一旦控件返回到事件循环,就会绘制图像(作为规范)兼容的浏览器不允许您同步读取图像 - see this crbug),并将SVG源的DataURL设置为src
属性。 (此步骤和步骤8之间的步骤可以现在同步发生,也可以作为侦听器回调的一部分;它们只需要在绘制图像之前发生。)<canvas>
元素(此前称为canvasElement
)并设置其尺寸(通过设置canvasElement.width = 64
和canvasElement.height = 64
)。canvasElement.getContext('2d')
(此前称为ctx
)为画布创建绘图上下文。ctx.globalCompositeOperation = "copy"
,或使用ctx.clearRect(0, 0, 64, 64)
清除它。load
元素的<img>
侦听器后面的执行序列中的某个位置,使用ctx.drawImage(svgImg, 0, 0, 64, 64)
将图像绘制到画布上(其中{{1}是svgImg
元素,您将<img>
设置为SVG DataURL。src
从画布创建PNG DataURL,并将 设置为HTML中canvasElement.toDataURL()
元素的href
属性。答案 1 :(得分:0)
我知道它已经得到了回答,但是对于这样一个简单的任务来说工作太多了,只需将您的 svg 存储在一个 svg 文件中并将其用作 Head Tag 中的 favicon。
<link rel="shortcut icon" href="favicon.svg" type="image/x-icon">