【问题标题】:How to overlay a dynamically selected image over a dynamically populated div如何在动态填充的 div 上覆盖动态选择的图像
【发布时间】:2013-11-29 08:24:55
【问题描述】:

需求描述

我正在使用 d3 解析 .csv 文件中的数据,然后动态填充页面上的各种项目。其中一段如下所示:

我的代码进度

  • 我首先将每个动态检索到的数字包含在其自己的 div 标签中,并为每个动态设置背景图像。这是 d3 JavaScript 代码:

    careerstage_td.append("div")
    .text(function(d){ return d.count })
    .attr("class", "career-count")
    .style("color", function(d){return d.color;})
    .style("background-image", function(d){return "url('images/" + d.icon + "')";})
    .style("background-repeat", "no-repeat")
    .style("background-position", "center center");
    

    请注意,我正在使用一个函数来动态填充数字以及确定要叠加的图像

    这给了我以下预期结果,其中图像位于文本后面:

  • 下一步是弄清楚如何将背景图像覆盖在文本之上。为此,我开始在谷歌上搜索并在 SO:How to overlay images 上找到了这个问题。在这里,我确定了两种不同的解决方案:

    解决方案 1:(来自该页面上的最佳答案)在带有数字的 div 中添加一个 span,然后使用 css 将 span 绝对定位在中心,就像这样

    div.career-count span.stickperson
    {
        position:absolute;
        left:45%;
        top: 34%;
    }
    

    解决方案 2:(来自该页面上的另一个答案)添加以下 css,用动态文本扩展 div 的类,像这样

    .career-count:after
    {
        content: url(/images/person_assoc.gif);
        position: absolute;
        left:45%;
        top: 34%;
    }
    

两种解决方案都有效,但解决方案 1 仅适用于 Chrome,解决方案 2 不允许我动态设置图像,因为这一切都是在 css 中完成的,并且“后”结构不能内联使用。

如果我能帮助我找出一个解决方案,让我可以动态设置图像并且也适用于 Chrome、Firefox 25 和 IE 11,我将不胜感激。

编辑:谢谢大家的支持。我现在添加了图片:)

【问题讨论】:

  • 您是否尝试过不在第一组divs 上设置背景图像,然后以图像为背景添加一组相同的divs?
  • @Lars:上面的解决方案 1 与您所说的类似,因为我在 div 顶部用文本覆盖了一个跨度,并将图像作为内容添加到该跨度。我用 div 而不是 span 标签尝试了相同的解决方案,但它仍然只显示在 Chrome 中。我会将图像添加为背景图像而不是内容,然后看看会发生什么。敬请期待。
  • @LarsKotthoff:我尝试了你的建议。它在所有三个浏览器中都没有显示任何内容,所以我现在恢复到解决方案 1。我最喜欢解决方案 1 的一点是需要一个 CSS 定义。如果我要使用解决方案 2,我将不得不为每个块创建一个单独的 css 定义来定义各自的图像前景。解决方案 2 的好处是它适用于所有浏览器,并且不需要 html 端的额外元素。
  • 您能发布一个完整的工作示例吗?这样玩起来会容易得多。

标签: javascript html css d3.js


【解决方案1】:

实际上,我认为最好的解决方案不是向您放置文本的div 元素添加背景图像,而是为您创建的每个div 创建一个子div,并使用孩子体内的图像。

careerstage_td.selectAll('div')
    .data(dataset)
    .enter().append('div')
    .attr("class", "career-count")
    .text(function(d){return d;})
    .style("color", function(d){return d.color;})
    .append('div')
    .attr("class", "childClass")
    .style("background-image", function(d){return "url('images/" + d.icon + "')";})
    .style("background-repeat", "no-repeat")
    .style("background-position", "center center");

在给定的代码中,由于数据,我生成了我的 div,并为每个 div 添加一个新的 div(类名“childClass”)。现在我可以在这个 childClass 上玩了。

See the jsfiddle 举个例子。 (请注意,我使用了一个简化的数据集,所以我总是将图像作为背景推送,并使用相同的文本颜色)。

确保图标显示在父节点中间的技巧是将父节点定义为position:relative,将子节点定义为absolute,宽度和高度均为100%。将背景居中在 x 和 y 上就可以了。

【讨论】:

  • 谢谢。我会尝试一下并用我的结果做出回应,尽管在我上面的描述中似乎与解决方案 1 没有太大区别。似乎主要区别在于您使用的是 z-index 而不是轴定位。我错了吗?
  • oups,实际上你可以删除 z-index,没有它也可以工作。它可能看起来像解决方案 1,但是 a) 所有现代浏览器都支持它 b) 没有 % 猜测将元素居中(左:45%;上:34%;)。由于子 Div 与 parentDiv 的大小完全相同(100% 宽度和高度),并且位于相同的位置(绝对,相对于相对的父级),因此无需使用两个轴位置。特别是因为简单地为背景定义“中心中心”就可以为您计算。
  • 此解决方案有效。 Lars Kotthoff 提出了与您相同的建议,但他错过了这部分:宽度:100%;高度:100%;因此,它没有显示 div。现在我让它在 Chrome、Firefox 和 IE 上运行。非常感谢 leMoisela!
猜你喜欢
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多