我有一个可以从任何地方(例如通过CDN)托管和使用的CSS库,其中还包含图像或字体等资源.我想让这些资源的URL作为自定义的CSS属性可用.这些URL必须是相对于库的.例如.

<!-- https://my.server/index.html -->
<link rel="stylesheet" href="https://my.cdn/a/lib.css">
<div style="background-image: var(--img)"></div>
/* https://my.cdn/a/lib.css */
@property --img {
  syntax: "<url>";
  initial-value: none;
  inherits: true;
}

:root {
  --img: url(./img.svg);
}
<!-- https://my.cdn/a/img.svg -->
<svg xmlns="http://www.w3.org/2000/svg">
  <!-- […] -->
</svg>

我在寻找一种方法来制作div https://my.cdn/a/img.svg的有效背景图像URL(而不直接引用它,--img可能是none,或者有时指向完全不同的URL).但是,URL将始终相对于文档(即,URL将是https://my.server/img.svg).更糟糕的是,它相对于使用css Custom属性的样式表.也就是说,如果我

/* https://my.server/b/lib.css */
@import url("https://my.cdn/a/lib.css");
div {
  background-image: var(--img);
}

实际上应该是https://my.server/b/img.svg.

作为一种解决办法,a/lib.css本身提供了应用CSS自定义属性的CSS类,如

/* https://my.cdn/a/lib.css */
/* […] */
.img--background-image {
  background-image: var(--img);
}

这样,消费者就可以应用该类,并且正确解析URL,如

<!-- https://my.server/index.html -->
<link rel="stylesheet" href="https://my.cdn/a/lib.css">
<div class="img--background-image"></div>

显然,这个变通办法是有缺陷的,因为它限制了--img用于库所预见的用例的方式.而且您必须更改HTML(通过添加类)才能使用它.

我想当我回试Chrome实现@property的时候,URL被正确解析了.然而,今天的情况并非如此.

有谁遇到过类似的问题吗?你是怎么解决的?我错过了显而易见的事情了吗?

推荐答案

The issue is that none is not a valid initial value for <url>.
Chrome's console will report the issue in its "Issues" tab, which is easily missable, and Safari will stay silent, but at least in JS the error is quite clear:

CSS.registerProperty({
  name: "--img",
  syntax: "<url>",
  inherits: true,
  initialValue: "none",
});
// In Chrome and Safari this throws (not the same error o_0)
// with the message "The initial value provided does not parse for the given syntax."
// or similar.

因此,您的注册失败了,只有当变量实际用作<url>时,即在用户的样式表中,才会解析url(),因此它成为相对于他们的样式表的变量.

如果您确实使用有效的url() initial-value正确注册了属性,那么URL将在定义时被解析,并且相对于在其中进行定义的任何样式表.

因此,例如,您可以设置

@property --img {
  syntax: "<url>";
  initial-value: url();
  inherits: true;
}

说明书中甚至有一个完整的例子说明了这种行为: https://drafts.css-houdini.org/css-properties-values-api/#example-57a63cfb

PS:你可能会对下面的this related issue个感兴趣.

Html相关问答推荐

HTML横幅未正确对齐页面顶部

如何在元素的三条边中间换行边框?

悬停效果在新西兰表上不起作用

在css中,如何在英雄版块的标题后面做一个粘性的导航栏?

如何突破安莉得分

使具有FLEX父项的溢出自动的子元素收缩

如何将功能附加到嵌入式药剂中的按钮?

CSS中的转换属性是如何工作的?

如何用css在右侧创建多个半圆

将精选选项的价格合并为一个价格HTML、PHP和JQuery

如何在VB.NET中用打印预览和直接打印的方式在Html中打印数据表的内容,包括页眉/设置纸张/方向/适合页面/总计

有没有一种方法可以提高代码中tailwind 类名的可读性?

在屏幕上每行 css 中的特定列居中

如果使用复选框属性更改,如何防止事件更改?

将三个div转换为显示flex

CSS flex:0 0 auto创建了1像素的间隙

BeautifulSoup用名称列表的findall无法找到另一个目标后面的目标

在带有换行文本的工具提示中显示溢出文本

如何在滚动行中显示一张图片和下一张图片的一半?

如何使用 CSS 制作蜂窝状网格?