【问题标题】:Transfer <img> attributes from one tag to another将 <img> 属性从一个标签转移到另一个标签
【发布时间】:2014-08-21 20:03:48
【问题描述】:

我的目标是使用svg.js 对投资组合中的每个单独图像进行遮罩,以生成图像遮罩。我正在使用 svg.js 和 cargo.collective 主题。

我写了一些 js 来生成 &lt;svg&gt; 标签并单独包装一组图像,这工作正常但是 &lt;img&gt; 标签不会在 &lt;svg&gt;&lt;/svg&gt; 内呈现

为了解决这个问题,我使用 svg.js 生成一个单独的 &lt;image&gt; 标记。这就是我的问题所在 - 我似乎无法将&lt;img&gt; 中的源转移到svg.js 中创建的新&lt;image&gt; 标签我尽最大努力在&lt;image&gt; href 中返回了[object Object]。

我想让图像在 &lt;svg&gt; 标记内呈现,这样我就可以对它们应用蒙版,而不管容器中实际有什么图像。

HTML

<svg class="thumb_image" id="drawing" xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" height="100%" xmlns:xlink="http://www.w3.org/1999/xlink">
  <image id="SvgjsImage1005" width="0" height="0"></image>
  <image class="imgclip" src="http://payload280.cargocollective.com/1/16/516926/7919591/prt_275x242_1403202556_2x.jpg" width="275" height="242" data-hi-res="http://payload280.cargocollective.com/1/16/516926/7919591/prt_275x242_1403202556_2x.jpg"></image>
  <defs id="SvgjsDefs1000">
    <polygon id="SvgjsPolygon1006" points="0,0 275,50 0,270" fill="#f2f0ce" stroke-width="0"></polygon>
  </defs>
</svg>

【问题讨论】:

  • 请制作一个 jsFiddle,以便我们更好地理解问题。据我了解,您的页面上将有一个 &lt;img&gt; 元素,并且您希望将其转换为 SVG 中的 &lt;image&gt; 元素。这样做的方法是从图像中获取src,删除&lt;img&gt; 元素,然后使用draw.image('/path/to/image.jpg') 在SVG 中创建&lt;image&gt; 元素。此外,请查看使用 Chrome 调试器来检查您尝试在 href 中插入的数据,因为这不是字符串。但是从一个小提琴开始来说明你的例子。
  • 感谢您的建议,这是我的js fiddle 我必须警告它在代码的再现中有点冒险。我正在使用的模板是一个 handlebars.js 模板,它生成 html 代码我添加了一个屏幕截图来显示它应该是什么样子,而不是我在 jsfiddle 中的样子。话虽如此,代码完全相同,并在我的屏幕截图中实现了结果。再次感谢您的帮助。
  • 我打开了小提琴,我不会费心去看它。里面的垃圾太多了。如果您不及时提出合理的问题,您将不会得到任何好的答案。
  • 好的,here's 代码更新。我已经删除了所有不相关的信息。
  • 我更新了屏幕截图以更好地解释我想要做什么。

标签: javascript jquery loops svg svg.js


【解决方案1】:

svg &lt;image&gt; 标签有一个 xlink:href 属性,它指向图像数据而不是 src 属性。

【讨论】:

  • 我意识到,我将如何将 src 从 img 标签打印到 xlink:href 属性
  • 我是javascript吗? IE。 getAttribute 后跟 setAttributeNS
  • 在 svg.js 中是:image.load('new/image/loaction')
  • 在 for 循环中包含 getAttribute 并解决了它,谢谢!
【解决方案2】:

我希望我能理解你想要做什么,但你给出的小提琴例子很糟糕。 svg.js 中有一个插件可以让你吸收 svg.js 中现有的 SVG:s,https://github.com/wout/svg.absorb.jshttps://github.com/wout/svg.absorb.js。您需要在示例中使用它。但是,您的 svg 非常简单,因此最好从头开始创建它。因此,您可以在服务器端生成一个 JavaScript 数组并使用它来生成您的 SVG:s,而不是将损坏的 SVG:s 包含到您的 dom 中。

var imageSrc = ['http://placekitten.com/g/200/300', 'http://placekitten.com/g/200/300'];

//get SVG target
var target = $("#target");

// Create SVG:s
imageSrc.forEach(function (src) {
    // create a wrapper div for the SVG element
    var svgWrapper = $('<div>').appendTo(target);

    // Create the SVG, please note that we need the native DOM node
    // That is why [0] is used
    var draw = SVG(svgWrapper[0]).size(300, 200);

    // draw the image
    var image = draw.image(src);

    //polygon image mask
    var polygon = draw.polygon('0,0 275,50 0,270').fill('#f2f0ce').stroke({
        width: 0
    });

    // create the mask
    image.maskWith(polygon);
});

示例:http://jsfiddle.net/h9ydmt80/

如果您在服务器端生成页面并且不需要继续操作 SVG:s,我将只在此处生成 SVG:s。在这种情况下,它们看起来像这样。

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="0" height="0" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
        <mask id="mask">
            <polygon points="0,0 275,50 0,270" fill="#f2f0ce" stroke-width="0"></polygon>
        </mask>
    </defs>
</svg>

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300" height="200" xmlns:xlink="http://www.w3.org/1999/xlink">
    <image xlink:href="http://placekitten.com/g/200/300" width="200" height="300" mask="url(#mask)"></image>
</svg>

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300" height="200" xmlns:xlink="http://www.w3.org/1999/xlink">
    <image xlink:href="http://placekitten.com/g/200/300" width="200" height="300" mask="url(#mask)"></image>
</svg>

第一个 SVG 不可见,只包含掩码,最后两个 SVG:s 只包含图像和对第一个 SVG 中掩码的引用。

例如:http://jsfiddle.net/ayw8w9ak/2/

请注意,它不是 SVG:s 中的src 属性,而是上面示例中的xlink:href

【讨论】:

  • 感谢 Nils 的深入回答,解释清楚我试图做的事情背后的概念有点困难,所以我感谢大家的意见。我最终编写了大部分让它工作的脚本,你的回答肯定会帮助我优化它。我会在几天后发布该网站的链接。
  • 想我会分享一个链接,这样你就可以看到结果如何。再次感谢各位的帮助! regardless.co
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多