使用HTML数据属性设置CSS背景图片网址


80

我计划为朋友建立一个自定义的图片库,我确切地知道我将如何制作HTML,但是CSS遇到了一个小问题。
(如果可能,我希望页面样式不依赖jQuery)


我的问题是:CSS
Data-Attribute中的HTML
Background-image
我将这种格式用于html缩略图:
<div class="thumb" data-image-src="images/img.jpg"></div>

我认为CSS应该看起来像这样:

.thumb {
    width:150px;
    height:150px;
    background-position:center center;
    overflow:hidden;
    border:1px solid black;

    background-image: attr(data-image-src);/*This is the question piece*/
}


我的目标是把data-image-srcdiv.thumb我的HTML文件,并使用它的每一个div.thumb(或多个)background-image在我的CSS文件来源。

这是一支Codepen笔,以便获得我所寻找的动态示例:http :
//codepen.io/thestevekelzer/pen/rEDJv

Answers:


64

您最终将可以使用

background-image: attr(data-image-src url);

但是据我所知,这还没有实现。上面url是的可选“类型或单位”参数attr()。参见https://drafts.c​​sswg.org/css-values/#attr-notation


4
当您最终说出时,是否有办法大致了解W3站点的时间?
StephenKelzer

5
在不知道任何特定实施状态的情况下,进行随机猜测的时间是1-2年,之后才能在所有浏览器中使用。

5
@torazaburo一年过去了,仍然充满希望。
Clemens Himmer

3
不在2016年的铬路线图上:( #246571
Felipe

2
caniuse.com/#feat=css3-attr到目前为止,还没有浏览器实现此功能。
saawsann

17

如果只想使用HTML和CSS保留它,则可以使用CSS变量。请记住,IE中不支持css变量

<div class="thumb" style="--background: url('images/img.jpg')"></div> 
.thumb {
    background-image: var(--background);
}

Codepen:https://codepen.io/bruce13/pen/bJdoZW


2
这可能是目前最好的答案。没有JavaScript总是好的。
阿卜杜拉·阿巴布

+1。这是比下面的另一个答案中所示直接内联添加图像更灵活的解决方案,因为您可以声明多个图像路径(例如,多个分辨率),然后在CSS代码中决定要为哪个分辨率加载哪个图像。
萨米特

16

混合内容和样式不是最佳做法,但是可以采用以下解决方案

<div class="thumb" style="background-image: url('images/img.jpg')"></div>

6

您将需要一些JavaScript:

var list = document.getElementsByClassName('thumb');

for (var i = 0; i < list.length; i++) {
  var src = list[i].getAttribute('data-image-src');
  list[i].style.backgroundImage="url('" + src + "')";
}

<script>标签之前将其</body>包装在底部的标签中,或者在页面加载后包装在调用的函数中。


2

使用一些Sass怎么样?这是我为实现类似目的所做的事情(尽管请注意,您必须为每个数据属性创建一个Sass列表)。

/*
  Iterate over list and use "data-social" to put in the appropriate background-image.
*/
$social: "fb", "twitter", "youtube";

@each $i in $social {
  [data-social="#{$i}"] {
    background: url('#{$image-path}/icons/#{$i}.svg') no-repeat 0 0;
    background-size: cover; // Only seems to work if placed below background property
  }
}

本质上,您列出了所有数据属性值。然后使用Sass @each遍历并选择HTML中的所有数据属性。然后,引入iterator变量并使它与文件名匹配。

无论如何,正如我所说,您必须列出所有值,然后确保文件名将这些值合并到列表中。


1
这要求您在样式声明中具有已知的值列表。当我问这个问题时,我试图让标记驱动样式显示的样式,而不是相反。
斯蒂芬·凯泽(StephenKelzer)

1
是的,那是凝灰岩。抱歉!
CodeFinity

这帮助我解决了类似的问题,还向我展示了一个我不知道的Sass功能,干杯!
MadSkunk

1

的HTML

<div class="thumb" data-image-src="img/image.png">

jQuery的

$( ".thumb" ).each(function() {
  var attr = $(this).attr('data-image-src');

  if (typeof attr !== typeof undefined && attr !== false) {
      $(this).css('background', 'url('+attr+')');
  }

});

JSFiddle上的演示

您也可以使用JavaScript进行此操作。


2
if (attr) {惹你麻烦吗?我看不出严格的typeof和false检查的意义,因为false和undefined都是虚假值。
Thijs Koerselman'2

1

对于那些想要像我这样愚蠢的答案的人

像如何按1、2、3步进行操作

这就是我所做的

首先创建HTML标记

<div class="thumb" data-image-src="images/img.jpg"></div>

然后在结束的body标签之前,添加此脚本

我在下面的代码中包含了结尾正文作为示例

复制时请多加注意

<script>
var list = document.getElementsByClassName('thumb');

for (var i = 0; i < list.length; i++) {
  var src = list[i].getAttribute('data-image-src');
  list[i].style.backgroundImage="url('" + src + "')";
}
</script>

</body>

0

HTML代码

<div id="borderLoader"  data-height="230px" data-color="lightgrey" data- 
width="230px" data-image="https://fiverr- res.cloudinary.com/t_profile_thumb,q_auto,f_auto/attachments/profile/photo/a54f24b2ab6f377ea269863cbf556c12-619447411516923848661/913d6cc9-3d3c-4884-ac6e-4c2d58ee4d6a.jpg">

</div>

JS代码

var dataValue, dataSet,key;
dataValue = document.getElementById('borderLoader');
//data set contains all the dataset that you are to style the shape;
dataSet ={ 
   "height":dataValue.dataset.height,
   "width":dataValue.dataset.width,
   "color":dataValue.dataset.color,
   "imageBg":dataValue.dataset.image
};

dataValue.style.height = dataSet.height;
dataValue.style.width = dataSet.width;
dataValue.style.background = "#f3f3f3 url("+dataSet.imageBg+") no-repeat 
center";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.