Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

243
Views
Insertar elementos SVG de otro elemento SVG con JS simple

Estoy tratando de representar dinámicamente el contenido de un elemento SVG usando la biblioteca svg.js ( https://svgjs.dev ). Todo funciona bien al crear elementos básicos, como líneas, polígonos y texto simple y trabajar con sus propiedades.

Ahora, me gustaría extender el dibujo con elementos más complejos usando SVG listos para usar (disponibles en un div oculto en la página o por otros medios), que necesito 'clonar' de alguna manera al elemento SVG principal y también ajustar el tamaño y posición.

La imagen a continuación es un ejemplo de lo que estoy tratando de lograr: el rectángulo se crea con svg.polygon svg.polygon().plot(... ) de svgjs, y me gustaría agregar los árboles.

¿Cuál sería la forma simple/correcta de hacer esto?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Una vez más, una buena noche de sueño proporciona la respuesta correcta y es mucho más fácil de lo que esperaba.

Resulta que todo lo que se necesita es un use , con la identificación del elemento svg y, opcionalmente, una URL desde la que cargar el archivo SVG, lo que evita que uno incruste el SVG en la página:

 // the definition of the object to embed // holds the item id, and transformation data var item = ...; var g = svg .group() .use( item.src, resURL + '/svg/sprites.svg') .transform({ translateX : item.x, translateY : item.y });

Para archivos SVG fuera de su dominio, probablemente necesite cargarlos de manera diferente.

Según lo solicitado, a continuación se muestra un ejemplo de código aún parcial, pero más detallado; agregar el código completo haría que la solución fuera difícil de seguir.

DESCARGO DE RESPONSABILIDAD: todavía no he llegado a las optimizaciones / refactorización, así que sí, probablemente haya mucho espacio para mejorar tanto en los datos como en el código.

Los datos son una estructura JSON así:

 { "items" : { "item1" : { "points" : [[1600,200],[2300,200],[2300,600],[1600,600],[1600,200]], "fill" : "rgba(144, 238, 144, 0.3)", "stroke" : "#228B22" }, "item2" : { "src":"sprite1" "style":{ "opacity" : 0.3 }, "position":{ "x" : -360, "y" : 75, "scale" : 0.8 }, } }, }

El procesamiento es así:

 var svg = SVG("#drawing-" + floor.key) Object.keys(floor.items).forEach(function(key,index) { var item = floor.items[key]; if (item.hasOwnProperty('points')) { var polygon = svg .polygon() .stroke({ color: item.stroke }) .fill(item.fill); polygon.plot(item.points); } else if (item.hasOwnProperty('src')) { var g = svg .group() .use(item.src, resURL + '/svg/plan-sprites.svg') .transform({ translateX : item.position.x, translateY : item.position.y, scale : item.position.scale || 1.}) .css(item.style || { }); } });

Cuando haya terminado, la página se ve así (simplificado):

 <svg id="drawing-curte" class="hwb-drawing" <g id="viewport"> <polygon points="1600,200 2300,200 2300,600 1600,600 1600,200" stroke="#228b22" fill="#90ee90"></polygon> <g><use xlink:href="/resources/svg/plan-sprites.svg#sprite1" transform="matrix(1,0,0,1,1550,150)"></use></g> </g> </svg>
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!