Заранее нужно извиниться: за длину и за мою неосведомленность. Я пытаюсь освоить новые концепции: d3.js и листы спрайтов. Концепция листа спрайтов проста для понимания, но я не понимаю, как интегрировать это в d3. По сути, я хочу выбрать спрайт, который я хочу использовать в качестве изображения, из листа спрайтов, а затем использовать d3 для отображения этого выбранного спрайта где-то еще на странице и, скорее всего, несколько копий одного и того же спрайта.
Фактический лист спрайтов для справки (см. Заявление об отказе от ответственности ниже):
Вот проблемы: 1) Я добавляю лист спрайтов в свой html, жестко кодирую <clipPath>
на данный момент, это отображает конкретный спрайт, который я хочу, однако размеры/позиционирование спрайта такие же, как если бы отображался весь лист спрайтов. . Как я могу «захватить» только сам спрайт, а не просто скрыть неиспользуемые? На изображении ниже я хочу использовать один «значок» в событии наведения мыши d3 (часть 2).
Изменение этого примера: SO: отображать спрайт изображения CSS в SVG без использования иностранный объект
HTML
<svg id="mySvg1" width="100%" height="100%">
<defs>
<clipPath id="c">
<rect x="135" y="0" width="150" height="150"/>
</clipPath>
</defs>
<image transform="scale(1.0)" x="0" y="0" width="550" height="420" xlink:href="static/img/iconSheet.png" clip-path="url(#c)"/>
<svg>
Результат
2) Я могу использовать <pattern>
для определения изображения, которое будет отображаться в объекте/событии d3. Как показать графику в прямоугольнике. Но это не работает для больших изображений (листов спрайтов)? Это становится странным и размытым, если я пытаюсь использовать сам лист спрайтов и его собственные размеры в шаблоне. Если мы решим часть 1, мы, вероятно, сможем проигнорировать часть 2, но это было бы полезно понять для общих знаний/использования в будущем.
Изменение этого примера: SO: добавление изображения в круг объект в d3 javascript?
HTML
<svg id="mySvg" width="550" height="420">
<defs id="mdef">
<pattern id="image" x="0" y="0" height="550" width="420">
<image transform="scale(1.0)" x="0" y="0" width="550" height="420" xlink:href="static/img/iconSheet.png"></image>
</pattern>
</defs>
</svg>
Javascript:
var svgContainer = d3.select("div#content-main").append("svg")
.attr("width", 740)
.attr("height", 760)
.attr("class", "mySvg")
.style("border", "none");
svgContainer.append("rect")
.attr("class", "logo")
.attr("x", 0)
.attr("y", 0)
.attr("width", 550)
.attr("height", 420)
.style("fill", "transparent")
.style("stroke", "black")
.style("stroke-width", 0.25)
.on("mouseover", function(){
d3.select(this)
.style("fill", "url(#image)");
})
.on("mouseout", function(){
d3.select(this)
.style("fill", "transparent");
});
Результат
3) ЕСЛИ есть более эффективный способ сделать это, я открыт для предложений. Я просто придерживаюсь модели d3, потому что я уже визуализировал объект svg, и мне просто нужно добавить к нему что-то.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Иконки не моя работа! Я использую эти значки только в образовательных целях. Ссылка автора находится здесь: Значки фитнеса