【问题标题】:CSS set background-image by data-image attrCSS 通过数据图像属性设置背景图像
【发布时间】:2014-11-17 07:52:17
【问题描述】:

我有一些具有这种模式的元素:

<div data-image="{imageurl}" ...></div>

我想将此元素 background-image 设置为 data-image。我测试了这段 CSS 代码:

div[data-image] {
    border: 2px solid black;
    background-image: attr(data-image url);
}

边框显示正确,但背景没有任何反应 如何仅使用 css(而不是 js 或 jq)修复此代码?

【问题讨论】:

标签: html css url background-image attr


【解决方案1】:

data- 属性(或一般的attr() 方法)的一个很好的替代方法是使用自定义属性MDNcsswgcss-tricks)。

由于它们的值不限于字符串,我们可以传递任何允许作为自定义属性值的类型!

此外,您还可以在运行时通过交换样式表来更新这些属性。

.kitten {
  width: 525px;
  height: 252px;
  background-image: var(--bg-image);
}
<div  class="kitten"
      style="--bg-image: url('http://placekitten.com/525/252');">
</div>

【讨论】:

  • 这应该是 IMO 接受的解决方案。它允许您设置 CSS 可用于指定背景图像的属性。这只是使用style 而不是data-*。非常聪明的解决方案。
  • 是的,但如果你有一个动态列表,那就行不通了
  • @Ayyash - 动态列表是什么意思,为什么它不起作用?
  • 在 for 循环中生成输出,并且 --bg-image 在每次迭代时重置为新值
  • 非常聪明:)!
【解决方案2】:

在撰写本文时,attr() notationcontent 以外的 CSS 属性的浏览器支持 - 例如 background-image - 是 very limited

此外,根据CSS level 2 spec,组合url()attr() 无效:
content: url(attr(data-image));

因此,目前没有跨浏览器的 CSS 解决方案来达到预期的效果。除非使用 JavaScript 是一种选择:

var list = document.querySelectorAll("div[data-image]");

for (var i = 0; i < list.length; i++) {
  var url = list[i].getAttribute('data-image');
  list[i].style.backgroundImage="url('" + url + "')";
}
div[data-image] {
  width: 100px; height: 100px; /* If needed */
  border: 2px solid black;
}
&lt;div data-image="http://placehold.it/100"&gt;&lt;/div&gt;

【讨论】:

【解决方案3】:

如果目标是能够从 HTML 文档而不是 CSS 定义中设置 HTML 元素的 background-image 样式,为什么不使用 HTML 元素的内联 style 属性?

div[style^='background-image'] {
  width:400px;
  height:225px;
  background-repeat:no-repeat;
  background-size:contain;
  background-position:center center;
  /* background-image is not set here... */
}
<!-- ... but here -->
<div style="background-image:url(http://img01.deviantart.net/5e4b/i/2015/112/c/5/mandelbrot_62____courage_to_leave___by_olbaid_st-d646sjv.jpg)"></div>

编辑:

如果不能按样式选择&lt;div&gt;,您可以给它一个类并按类名选择它。

【讨论】:

  • 这是一个没有浏览器不兼容问题的简单解决方案,因此应该被赞成。
【解决方案4】:

在您的 HTML 中:

<div data-image="path_to_image/image_file.extension" ... ></div>

在您的 CSS 中:

div:after {
    background-image : attr(data-image url);
    /* other CSS styling */
}

问题:

这是您需要的答案。在 w3.org 中查看此文档。但主要问题是它不会起作用,现在还不行!。在许多浏览器中,attr() 在 CSS 编码的content: 属性中使用时会成功运行。但是在 CSS 的其他属性中使用它,它并不能按预期工作,即使在主流浏览器中也是如此。

解决方案

  • 使用 JavaScriptjQuery 等脚本。

参考文献

谢谢

【讨论】:

  • 请注意,url( attr(data-image) )肯定是错误的。根据CSS Values and Units Module Level 3url() 符号只接受裸/引用的&lt;string&gt; 作为URI。 OP 已经使用了attr() 的有效语法,但尚未在浏览器中实现。
  • @HashemQolami,谢谢。但我不明白 url 的文档。 url( attr() ) 的确切位置会是什么??
  • 正如我所提到的,OP 使用了有效的语法:attr(data-image url),由the spec 声明。 attr() 的新语法是:attr( &lt;attr-name&gt; &lt;type-or-unit&gt;? [ , &lt;fallback&gt; ]? ) 其中可选的&lt;type-or-unit&gt; 指定给定&lt;attr-name&gt; 的类型,如果缺少命名属性,&lt;fallback&gt; 将是默认值。
  • @HashemQolami,感谢您的宝贵帮助。我从来没有从文献中学到任何东西,我学到的一切都是从一个人的教义中得到的。但是,我仍然包含文档链接,以便向提问者解决问题。
  • 我认为 = 需要在您的 CSS 中为 :
猜你喜欢
  • 2019-03-24
  • 2010-10-05
  • 2016-09-01
  • 2012-06-22
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多