将 SVG 数据设置为光标

Set SVG data as cursor

我想通过 jquery

更改光标

问题是我不需要任何外部文件或来源。 我也希望它是一个 SVG,所以我认为这会起作用:

$("html").css("cursor: url('<svg><circle cx="5.7" cy="6.2" r="6"/></svg>'), auto");

但它没有:(

我知道已经有很多关于游标打开的话题,但是 none 其中有直接的 SVG 数据。

提前致谢

PS:是否可以动态地为该数据设置动画?

您确实可以将 SVG 用于游标,但您需要将 SVG 另存为自己的文件并引用它:

cursor: url('/path/to/your/graphic.svg');

这是个好问题,有两种解法:

1) 创建一个Blob url 并传递svg 数据并将url 传递给属性 值

2) 使用数据 url,但有一个问题 - 如果您不指定尺寸,则光标将不会改变,因为浏览器不知道它的大小。此外,您需要添加 xmlns 标签,否则浏览器仍然不会显示它。

请注意,为简洁起见,我使用了 ES6 字符串,但如果您不使用 transpiler/want 来支持旧浏览器,请更改为字符串连接。

function svgUrl(svgString, width, height, viewBoxWidth, viewBoxHeight) {
  viewBoxWidth = viewBoxWidth || width;
  viewBoxHeight = viewBoxHeight || width;
  return `url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="${width}" height="${height}" viewBox="0 0 ${viewBoxWidth} ${viewBoxHeight}">${svgString}</svg>')`;
}

$('html').css('cursor', `${svgUrl('<circle cx="100" cy="100" r="100"/>', 100, 100, 200, 200)}, auto`);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

PS 如果您担心 svg 数据中的无效字符,您也可以使用 base64 字符串:

function svgToBase64Url(svgString, width, height) {
  const base64SVG = btoa(`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="${width}px" height="${height}px">${svgString}</svg>`);
  return `url('data:image/svg+xml;base64,${base64SVG}')`;
}