当我引入CSS变量时,为什么浏览器会尝试使用其他无效的属性声明?

亨里克·N

我使用两个这样的背景图像声明来进行回退:

background-image: url(https://via.placeholder.com/300x150.png?text=regular);
background-image: -webkit-image-set(
  url(https://via.placeholder.com/300x150.png?text=1x) 1x,
  url(https://via.placeholder.com/600x300.png?text=2x) 2x
);

JS bin:https//jsbin.com/jadoharoyi/edit? html,css,output

这个想法是例如让Firefox显示“常规” bg,因为它不支持-webkit-image-set;例如,让Chrome显示“ 1x”或“ 2x” bg(取决于分辨率),因为它确实支持-webkit-image-set。

到现在为止还挺好。

但是,如果我尝试通过CSS变量提供一个或多个图片网址(出于复杂的原因),它就会失败:

--image-1x: url(https://via.placeholder.com/300x150.png?text=1x);

background-image: url(https://via.placeholder.com/300x150.png?text=regular);
background-image: -webkit-image-set(
  var(--image-1x) 1x,
  url(https://via.placeholder.com/600x300.png?text=2x) 2x
);

JS bin:https//jsbin.com/vojiboqije/1/edit? html,css,output

现在,Firefox(在macOS Big Sur 11.1上为85.0.2)根本不显示bg图像。据我所知,Firefox突然很高兴尝试使用它不支持的第二个背景图像声明。

但它在Chrome(88.0.4324.146)中可以正常工作。

我不明白为什么。有任何想法吗?这是一个错误吗?还是我误会了?

陪同Afif

这就是CSS变量的工作方式。使用CSS变量时,浏览器只能在运行时评估该值,因此在我们评估该变量之前,该值将被视为有效(或者可以说是在待机模式下),如果浏览器发现整个值无效,它将回退初始或继承:

如果声明包含一个以初始值引用自定义属性的var(),则声明在计算值时可能是无效的,如上所述,或者声明使用一个有效的自定义属性,但在替换了var()之后使用该属性值)功能,无效。发生这种情况时,该属性的计算值分别是该属性的继承值或它的初始值,具体取决于该属性是否被继承,就好像该属性的值已被指定为unset关键字一样。参考

带有明显无效值的更明确的示例:

html {
  background:linear-gradient(red,blue); /* this will be used */
  background:strange-gradient(red,blue); /* this is a joke */
  
  min-height:100%;
}

而且,当使用CSS变量时,不幸的是将使用第二条指令,从而使您的第一条指令无效。

html {
  --c:red;

  background:linear-gradient(red,blue);  /* this will be ignored */
  background:strange-gradient(var(--c),blue); /* the joke is being used ..*/
  
  min-height:100%;
}


这种行为在某种程度上是合乎逻辑的,因为通过更改变量,我们可以使值有效(如果先前无效)或无效(如果先前有效),因此浏览器应考虑使用它。


对于您的特殊情况,可以考虑使用伪元素技巧:

.my-div {
  width: 300px;
  height: 150px;
  background-color: red;
  position:relative;
  z-index:0;
  
  --image-1x: url(https://via.placeholder.com/300x150.png?text=1x);

  background-image: url(https://via.placeholder.com/300x150.png?text=regular);
}
/* the pseudo element will cover the main background if it's valid */
.my-div::before {
  content:"";
  position:absolute;
  z-index:-1;
  top:0;
  left:0;
  right:0;
  bottom:0;
  background-image: -webkit-image-set(
    var(--image-1x) 1x,
    url(https://via.placeholder.com/600x300.png?text=2x) 2x
  );
}
<div class="my-div">
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当我访问其他网页时,为什么浏览器会连接到未知的第三方网站?

来自分类Dev

为什么当我使用函数返回值并崩溃浏览器时 *ngFor 会无限循环?

来自分类Dev

当我在他们的浏览器中对其进行测试时,为什么我的网址会转到一个空的登录页面?

来自分类Dev

为什么 Firefox 和其他浏览器在我尝试初始化多个组件时冻结,但在 Chrome 上却没有?

来自分类Dev

当我将其他设备插入调制解调器时,为什么我的公共IP会更改?

来自分类Dev

为什么我的CSS3动画在Google Chrome浏览器中不流畅(但在其他浏览器上却不流畅)?

来自分类Dev

当我从浏览器修改html / js时,为什么多次发送ajax请求

来自分类Dev

当我尝试在此列表上使用迭代器时,为什么会引发此异常?

来自分类Dev

当我尝试访问OnActivityResult而不是其他位置时,为什么GoogleApiClient断开连接?

来自分类Dev

为什么当我在地址栏中输入新搜索内容时,Chrome浏览器会更改tabId,然后将其导航到Google页面结果

来自分类Dev

为什么当我访问google.com:8000时浏览器会挂起,但在google.com:443上却出错?

来自分类Dev

为什么可以在Chrome的devtools控制台中重新声明“ let”?(其他浏览器不允许。)

来自分类Dev

为什么使用Bootstrap时zombie.js浏览器会返回空HTML?

来自分类Dev

为什么在浏览器中使用 directX 视频时 mstsc 会崩溃:TOR、Chrome 等

来自分类Dev

反应。为什么当我在请求后请求 api 时在我调用的浏览器 url 中出现 api

来自分类Dev

Firefox正在加载CSS,但未应用。我尝试了其他浏览器,并且所有浏览器都运行良好

来自分类Dev

当我尝试引用其他模式的对象时,为什么猫鼬引用对我不起作用?

来自分类Dev

网站元素显示在浏览器中,但当我尝试使用检查元素访问它时隐藏

来自分类Dev

当我复制浏览器发出的确切请求时,为什么被检测为机器人?

来自分类Dev

当我使用与父名称相同的作用域变量时,为什么父值会更新?

来自分类Dev

为什么浏览器会忽略我CSS文件中的第一个选择器?

来自分类Dev

为什么[CSS功能]在[浏览器]中不起作用,但在其他浏览器中又起作用呢?

来自分类Dev

当我在Java的静态块中声明接口时,为什么编译器会显示错误?

来自分类Dev

当我尝试为iframe src属性构建URL时,AngularJS为什么会引发错误?

来自分类Dev

为什么我的网站在Firefox和所有其他浏览器上看起来都不同

来自分类Dev

为什么在其他对象中散布对象时,浏览器中的输出与节点中的输出不同?

来自分类Dev

当我在浏览器中使用0.0.0.0而不是localhost时,Chrome /服务器会做什么?

来自分类Dev

为什么当我在函数名称中声明全局变量的局部数组声明bash时,bash会引发未绑定变量警告?

来自分类Dev

当我尝试从外壳程序打开浏览器和特定URL时,权限被拒绝

Related 相关文章

  1. 1

    当我访问其他网页时,为什么浏览器会连接到未知的第三方网站?

  2. 2

    为什么当我使用函数返回值并崩溃浏览器时 *ngFor 会无限循环?

  3. 3

    当我在他们的浏览器中对其进行测试时,为什么我的网址会转到一个空的登录页面?

  4. 4

    为什么 Firefox 和其他浏览器在我尝试初始化多个组件时冻结,但在 Chrome 上却没有?

  5. 5

    当我将其他设备插入调制解调器时,为什么我的公共IP会更改?

  6. 6

    为什么我的CSS3动画在Google Chrome浏览器中不流畅(但在其他浏览器上却不流畅)?

  7. 7

    当我从浏览器修改html / js时,为什么多次发送ajax请求

  8. 8

    当我尝试在此列表上使用迭代器时,为什么会引发此异常?

  9. 9

    当我尝试访问OnActivityResult而不是其他位置时,为什么GoogleApiClient断开连接?

  10. 10

    为什么当我在地址栏中输入新搜索内容时,Chrome浏览器会更改tabId,然后将其导航到Google页面结果

  11. 11

    为什么当我访问google.com:8000时浏览器会挂起,但在google.com:443上却出错?

  12. 12

    为什么可以在Chrome的devtools控制台中重新声明“ let”?(其他浏览器不允许。)

  13. 13

    为什么使用Bootstrap时zombie.js浏览器会返回空HTML?

  14. 14

    为什么在浏览器中使用 directX 视频时 mstsc 会崩溃:TOR、Chrome 等

  15. 15

    反应。为什么当我在请求后请求 api 时在我调用的浏览器 url 中出现 api

  16. 16

    Firefox正在加载CSS,但未应用。我尝试了其他浏览器,并且所有浏览器都运行良好

  17. 17

    当我尝试引用其他模式的对象时,为什么猫鼬引用对我不起作用?

  18. 18

    网站元素显示在浏览器中,但当我尝试使用检查元素访问它时隐藏

  19. 19

    当我复制浏览器发出的确切请求时,为什么被检测为机器人?

  20. 20

    当我使用与父名称相同的作用域变量时,为什么父值会更新?

  21. 21

    为什么浏览器会忽略我CSS文件中的第一个选择器?

  22. 22

    为什么[CSS功能]在[浏览器]中不起作用,但在其他浏览器中又起作用呢?

  23. 23

    当我在Java的静态块中声明接口时,为什么编译器会显示错误?

  24. 24

    当我尝试为iframe src属性构建URL时,AngularJS为什么会引发错误?

  25. 25

    为什么我的网站在Firefox和所有其他浏览器上看起来都不同

  26. 26

    为什么在其他对象中散布对象时,浏览器中的输出与节点中的输出不同?

  27. 27

    当我在浏览器中使用0.0.0.0而不是localhost时,Chrome /服务器会做什么?

  28. 28

    为什么当我在函数名称中声明全局变量的局部数组声明bash时,bash会引发未绑定变量警告?

  29. 29

    当我尝试从外壳程序打开浏览器和特定URL时,权限被拒绝

热门标签

归档