{"id":4513,"date":"2018-02-13T12:51:36","date_gmt":"2018-02-13T11:51:36","guid":{"rendered":"https:\/\/florianbrinkmann.com\/en\/?p=4513"},"modified":"2020-02-09T11:28:50","modified_gmt":"2020-02-09T10:28:50","slug":"svg-use-element-javascript","status":"publish","type":"post","link":"https:\/\/florianbrinkmann.com\/en\/svg-use-element-javascript-4513\/","title":{"rendered":"Create \u00bbsvg\u00ab and \u00bbuse\u00ab element with JavaScript"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Creating SVG elements dynamically via JavaScript is not as easy as I thought\u2026 In this post, I show how to create an SVG element with JS, that displays a symbol via a <code class=\"lang-markup\">use<\/code> element.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Preliminary remark<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SVG elements can be displayed like that (there are more possibilities to display an SVG):<\/p>\n\n\n<pre class=\"wp-block-code lang-markup\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">svg<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">use<\/span> <span class=\"hljs-attr\">xlink:href<\/span>=<span class=\"hljs-string\">\"#down-arrow\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">use<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">svg<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">There we reference an SVG element we want to show via the <code class=\"lang-markup\">use<\/code> element (these three lines are the markup we want to create with JavaScript). In my concrete case, the above markup displays an arrow pointing to the bottom, that is included into the page with the following markup:<\/p>\n\n\n<pre class=\"wp-block-code lang-markup\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">svg<\/span> <span class=\"hljs-attr\">xmlns<\/span>=<span class=\"hljs-string\">\"http:\/\/www.w3.org\/2000\/svg\"<\/span> <span class=\"hljs-attr\">xmlns:xlink<\/span>=<span class=\"hljs-string\">\"http:\/\/www.w3.org\/1999\/xlink\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"hannover-svg-icons\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">symbol<\/span> <span class=\"hljs-attr\">viewBox<\/span>=<span class=\"hljs-string\">\"0 0 16 16\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"down-arrow\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">polygon<\/span> <span class=\"hljs-attr\">points<\/span>=<span class=\"hljs-string\">\"11,6 7.5,9.5 4,6 3,7 7.5,11.5 12,7\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">polygon<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">symbol<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">svg<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The <code class=\"lang-markup\">id<\/code> of the <code class=\"lang-markup\">symbol<\/code> element is the same as the value for <code class=\"lang-markup\">xlink:href<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The creation with JavaScript<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you know what to look for, it is not that hard. This is the complete code:<\/p>\n\n\n<pre class=\"wp-block-code lang-js\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">var<\/span> svgElem = <span class=\"hljs-built_in\">document<\/span>.createElementNS(<span class=\"hljs-string\">'http:\/\/www.w3.org\/2000\/svg'<\/span>, <span class=\"hljs-string\">'svg'<\/span>),\n\tuseElem = <span class=\"hljs-built_in\">document<\/span>.createElementNS(<span class=\"hljs-string\">'http:\/\/www.w3.org\/2000\/svg'<\/span>, <span class=\"hljs-string\">'use'<\/span>);\n\nuseElem.setAttributeNS(<span class=\"hljs-string\">'http:\/\/www.w3.org\/1999\/xlink'<\/span>, <span class=\"hljs-string\">'xlink:href'<\/span>, <span class=\"hljs-string\">'#down-arrow'<\/span>);\n\nsvgElem.appendChild(useElem);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">It is important to know that you have to use <code class=\"lang-js\">document.createElementNS<\/code> with the correct namespace to create the <code class=\"lang-markup\">svg<\/code> and <code class=\"lang-markup\">use<\/code> element \u2013 it does not work with <code class=\"lang-js\">document.createElement<\/code>. Likewise, the <code class=\"lang-js\">setAttributeNS<\/code> method must be used for the <code class=\"lang-markup\">xlink:href<\/code> attribute instead of <code class=\"lang-js\">setAttribute<\/code> \u2013 again with the correct Namespace.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After this code was run, svgElem contains the SVG element with <code class=\"lang-markup\">use<\/code> that can be used on the site.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Creating SVG elements dynamically via JavaScript is not as easy as I thought\u2026 In this post, I show how to create an SVG element with JS, that displays a symbol via a use element.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wpf_show_in_dewp_planet_feed":false,"flobn_post_versions":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"lazy_load_responsive_images_disabled":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-4513","post","type-post","status-publish","format-standard","hentry","category-web-development"],"wp-worthy-pixel":{"ignored":false,"public":"5682600a2df34383ab4c8e1b16e6320e","server":"vg07.met.vgwort.de","url":"https:\/\/vg07.met.vgwort.de\/na\/5682600a2df34383ab4c8e1b16e6320e"},"wp-worthy-type":"normal","_links":{"self":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/4513","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/comments?post=4513"}],"version-history":[{"count":4,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/4513\/revisions"}],"predecessor-version":[{"id":5974,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/posts\/4513\/revisions\/5974"}],"wp:attachment":[{"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/media?parent=4513"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/categories?post=4513"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/florianbrinkmann.com\/en\/wp-json\/wp\/v2\/tags?post=4513"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}