HTML SVG Positioning? - html
so i have a little problem with a svg, this svg is align on left side, but i want make it to the right side, I've tried using x and y but its not working, please help me
<svg width="498" height="99" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M0 36C0 2.863 26.8629-24 60-24
h438V99H60C26.8629 99 0 72.1371 0 39v-3Z" fill="#2D2D2D"/>
</svg>
You can use an outer div like this:
<div class='outer-div' >
<!-- SVG Element -->
<svg></svg>
</div>
And in the CSS file:
.outer-div{
display:flex;
flex-direction: row-reverse;
}
There could be a number of options depending on the context. Here I present:
CSS float
CSS text-align
CSS position
CSS flexbox
and SVG viewBox
CSS float
A bit old-school I guess. It works, but the downside is that the SVG takes up 0 px height.
svg {
float: right;
}
<svg width="498" height="99" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M0 36C0 2.863 26.8629-24 60-24
h438V99H60C26.8629 99 0 72.1371 0 39v-3Z" fill="#2D2D2D"/>
</svg>
CSS text-align
The SVG is displayed as an inline element, so it behaves like a text.
.parent {
text-align: right;
}
<div class="parent">
<svg width="498" height="99" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M0 36C0 2.863 26.8629-24 60-24
h438V99H60C26.8629 99 0 72.1371 0 39v-3Z" fill="#2D2D2D"/>
</svg>
</div>
CSS position
If the parent is positioned relative (or absolute) and the SVG is positioned absolute the property right can be used for aligning the SVG.
.parent {
position: relative;
}
svg {
position: absolute;
right: 0;
}
<div class="parent">
<svg width="498" height="99" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M0 36C0 2.863 26.8629-24 60-24
h438V99H60C26.8629 99 0 72.1371 0 39v-3Z" fill="#2D2D2D"/>
</svg>
</div>
CSS flexbox
The more modern version of the above examples.
.parent {
display: flex;
justify-content: flex-end;
}
<div class="parent">
<svg width="498" height="99" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path d="M0 36C0 2.863 26.8629-24 60-24
h438V99H60C26.8629 99 0 72.1371 0 39v-3Z" fill="#2D2D2D"/>
</svg>
</div>
SVG vieBox
And lastly, by using the viewBox attribute instead of the width and the height attributes, the <path> can be positioned in the right side of the SVG itself (the transform attribute). The SVG will take up 100 % of the width at all times and the <path> will therefore also "float" to the right. This will make the SVG scale up and down depending on the width available.
<svg viewBox="0 0 700 99" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path transform="translate(262 0)" d="M0 36C0 2.863 26.8629-24 60-24
h438V99H60C26.8629 99 0 72.1371 0 39v-3Z" fill="#2D2D2D"/>
</svg>
Like this?
<svg width="498" height="99" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 36C0 2.863 26.8629-24 60-24h438V99H60C26.8629 99 0 72.1371 0 39v-3Z" fill="#2D2D2D" transform="scale (-1, 1)" transform-origin="center" />
</svg>
Related
CSS parent selector not working as expected
Given the following HTML <div id="field-filter-TIPO" class="css-1hqm095 container"> <svg aria-hidden="true" role="img" class="octicon octicon-x-circle-fill css-djuh4e" viewBox="0 0 12 12" width="12" height="12" fill="currentColor" style=" display: inline-block; user-select: none; vertical-align: text-bottom; overflow: visible; " > <path fill-rule="evenodd" d="M1.757 10.243a6 6 0 118.486-8.486 6 6 0 01-8.486 8.486zM6 4.763l-2-2L2.763 4l2 2-2 2L4 9.237l2-2 2 2L9.237 8l-2-2 2-2L8 2.763l-2 2z" ></path> </svg> <div style="font-size: 16px; width: auto" class="css-1bmhiq9"> <svg viewBox="25 25 50 50" width="1em" height="1em" class="css-1bez47e"> <circle cx="50" cy="50" r="22" fill="none" stroke="currentColor" stroke-width="6" stroke-miterlimit="10" class="css-frwtbx" ></circle> </svg> </div> <div title="ColumnFilter" kind="ColumnFilter" id="columnfilter--fetching" name="Fetching" class="css-utvy5" > <button class="css-m8wrzs"> <svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" font-size="16" class="css-1cx02qk" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" > <path d="M21 3H5a1 1 0 0 0-1 1v2.59c0 .523.213 1.037.583 1.407L10 13.414V21a1.001 1.001 0 0 0 1.447.895l4-2c.339-.17.553-.516.553-.895v-5.586l5.417-5.417c.37-.37.583-.884.583-1.407V4a1 1 0 0 0-1-1zm-6.707 9.293A.996.996 0 0 0 14 13v5.382l-2 1V13a.996.996 0 0 0-.293-.707L6 6.59V5h14.001l.002 1.583-5.71 5.71z" ></path> </svg> </button> </div> </div> why this selector .container div > svg { margin-right: -8px; } is not affecting the first svg (the X icon)? Should't the selector pick all the svg whose parent is a div inside the elements with the .container class? My goal is to create a selector to apply to the X icon (svg) and the second svg (the circle icon). jsfiddle
Should't the selector pick all the svg whose parent is a div inside the elements with the .container class? My goal is to create a selector to apply to the X icon (svg) and the second svg (the circle icon). Well the first svg is not inside div... it's in a container... try adding it ina div and check
For now, there is no parent selector in CSS (only child selector). However, you can use the JS property .parentNode
SVG mask doesn't hide the elements in Chrome & Edge
For the life of me, I cannot figure out the issue with the inside the following SVGs: https://codepen.io/LookyRo/pen/wvjezPE .svgs-container { display: flex; gap: 10px; text-align: center; width: 100%; } .svgs-container div { border: 2px solid red; flex: 1 1 auto; } svg { width: 250px; } <div class="svgs-container"> <div> <h1>Mask BAD</h1> <svg id="eI1EGNfkb8r1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" style="background-color:#000"> <g transform="matrix(.984808 0.173648-.173648 0.984808-41.142952 21.499616)" mask="url(#eI1EGNfkb8r6)"> <g transform="translate(-.244181 1.646644)"> <path d="M107.295374,68.86121c-3.202847,15.480427-37.900356,59.25267-13.345196,66.725979s59.252668,9.074732,70.99644-3.736656s11.209963-46.441282-5.871887-46.441282-27.224199-4.804272-25.088968-24.021353-19.217082-30.960854-21.886121-19.75089s10.676157,18.149466-4.804268,27.224202Z" transform="translate(-8.760641-5.488538)" fill="#5717d1" stroke="#3f5787" stroke-width="0.6"/> <rect style="isolation:isolate" width="27.224199" height="154.804271" rx="0" ry="0" transform="matrix(.866025 0.5-.5 0.866025 243.998411-43.500831)" fill="#d2dbed" stroke-width="0"/> </g> <mask id="eI1EGNfkb8r6" mask-type="luminance"> <path d="M107.295374,68.86121c-3.202847,15.480427-37.900356,59.25267-13.345196,66.725979s59.252668,9.074732,70.99644-3.736656s11.209963-46.441282-5.871887-46.441282-27.224199-4.804272-25.088968-24.021353-19.217082-30.960854-21.886121-19.75089s10.676157,18.149466-4.804268,27.224202Z" transform="matrix(-.865792 1.16328-.884732-.658478 328.565567-28.974333)" fill="#e34242" stroke-width="0.6"/> </mask> </g> </svg> </div> <div> <h1>Mask GOOD</h1> <svg id="em67u90McsE1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" style="background-color:#000"> <g transform="matrix(.984808 0.173648-.173648 0.984808-41.142952 21.499616)" mask="url(#em67u90McsE6)"> <g transform="translate(-.244181 1.646644)"> <path d="M107.295374,68.86121c-3.202847,15.480427-37.900356,59.25267-13.345196,66.725979s59.252668,9.074732,70.99644-3.736656s11.209963-46.441282-5.871887-46.441282-27.224199-4.804272-25.088968-24.021353-19.217082-30.960854-21.886121-19.75089s10.676157,18.149466-4.804268,27.224202Z" transform="translate(-8.760641-5.488538)" fill="#5717d1" stroke="#3f5787" stroke-width="0.6"/> <rect style="isolation:isolate" width="27.224199" height="154.804271" rx="0" ry="0" transform="matrix(.866025 0.5-.5 0.866025 243.013603-43.327183)" fill="#d2dbed" stroke-width="0"/> </g> <mask id="em67u90McsE6" mask-type="luminance"> <path d="M107.295374,68.86121c-3.202847,15.480427-37.900356,59.25267-13.345196,66.725979s59.252668,9.074732,70.99644-3.736656s11.209963-46.441282-5.871887-46.441282-27.224199-4.804272-25.088968-24.021353-19.217082-30.960854-21.886121-19.75089s10.676157,18.149466-4.804268,27.224202Z" transform="matrix(-.865792 1.16328-.884732-.658478 328.565567-28.974333)" fill="#e34242" stroke-width="0.6"/> </mask> </g> </svg> </div> </div> The left one renders the elements inside the masked group and slightly casts a shadow where the mask should be. The right one works correctly. I am seeing this issue un Chrome & Edge, yet Firefox, Opera and Safari displays both of this the same. The only difference between these 2 SVGs is that the element is slightly moved on the X axis. Bad: matrix(.866025 0.5-.5 0.866025 243.998411-43.500831) Good: matrix(.866025 0.5-.5 0.866025 243.013603-43.327183) All the rest of the code is exactly the same. Can anyone figure this out?
<svg> is larger than <use>
I need to import svg from sprite by <use> tag so svg and use were the same size (use was as large as parent svg tag). <svg> <use xlink:href="#facebook-hover"></use> </svg> I have no idea what exactly causes that size difference, and how could I fix it. Here is my demo, for those who would like to help me: svg { width: 200px; height: 200px; position: relative; } use { position: absolute; top: 0; bottom: 0; left: 0; right: 0; } <svg width="0" height="0" class="hidden"> <symbol version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 44 44" id="facebook-hover"> <title>ThirdParty/Facebook/2xpng1. Liquorice</title> <defs> <polygon id="path-1" points="0.001 0 40 0 40 40 0.001 40"></polygon> </defs> <g id="ThirdParty/Facebook/1.-Liquorice" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Group-3" transform="translate(2.000000, 2.000000)"> <g id="Clip-2"></g> <path d="M37.793,0 L2.207,0 C0.989,0 0.001,0.988 0.001,2.208 L0.001,37.792 C0.001,39.012 0.989,40 2.207,40 L21.379,40 L21.379,24.532 L16.173,24.532 L16.173,18.476 L21.379,18.476 L21.379,14.022 C21.379,8.856 24.539,6.042 29.145,6.042 C30.697,6.038 32.249,6.118 33.793,6.276 L33.793,11.676 L30.621,11.676 C28.111,11.676 27.621,12.862 27.621,14.614 L27.621,18.468 L33.621,18.468 L32.841,24.524 L27.585,24.524 L27.585,40 L37.793,40 C39.011,40 40.001,39.012 40.001,37.792 L40.001,2.208 C40.001,0.988 39.011,0 37.793,0" id="Fill-1" fill="#002E88" mask="url(#mask-2)"></path> </g> </g> </symbol> </svg> <svg> <use xlink:href="#facebook-hover"></use> </svg>
As I've commented: use a viewBox for the second svg. Try <svg viewBox="0 0 40 40"><use ... Also: in css you are forcing both evg elements to a 200px / 200px size. You can add width="200" instead. Also: the css roules for use are pointless. Also: you are putting a useless polygon inside a useless <defs> inside the symbol. You can delete the defs. More: The path is wrapped inside lots of groups. There is an empty group too. The path is masked by an inexistent mask-2. I've removed the useless groups and the mask attribute. Please take a look: <svg width="0" height="0" class="hidden"> <symbol id="facebook-hover"> <title>ThirdParty/Facebook/2xpng1. Liquorice</title> <path d="M37.793,0 L2.207,0 C0.989,0 0.001,0.988 0.001,2.208 L0.001,37.792 C0.001,39.012 0.989,40 2.207,40 L21.379,40 L21.379,24.532 L16.173,24.532 L16.173,18.476 L21.379,18.476 L21.379,14.022 C21.379,8.856 24.539,6.042 29.145,6.042 C30.697,6.038 32.249,6.118 33.793,6.276 L33.793,11.676 L30.621,11.676 C28.111,11.676 27.621,12.862 27.621,14.614 L27.621,18.468 L33.621,18.468 L32.841,24.524 L27.585,24.524 L27.585,40 L37.793,40 C39.011,40 40.001,39.012 40.001,37.792 L40.001,2.208 C40.001,0.988 39.011,0 37.793,0" id="Fill-1" fill="#002E88"></path> </symbol> </svg> <svg viewBox="0 0 40 40" width="200"> <use xlink:href="#facebook-hover"></use> </svg>
Why doesn't an SVG with a <use> tag scale like a regular SVG?
I have an SVG icon, I'm setting a fixed height for it (50px, say), but I want its width to be auto, that is, whatever it needs to be depending on the icon. (Pretty common and normal scenario, right?). Now, the problem that I've been beating my head against the wall for, is that instead of embedding the SVG inline in the HTML, I'm intending to define it with the <symbol> tag and then reference it using the <use href="... tag, and doing so apparently requires me to set a fixed width as well as a fixed height or otherwise it will always default to about 150px, instead of just defaulting to the width of icon; this is not the case when you embed the SVG directly, you can see all of this in action in the following two snippets: Directly-embedded SVG: (Works as expected, width is consistent with the width of the icon) .icon { height: 50px; width: auto; /* Aesthetics: */ background-color: gray; border-radius: 5px; } <svg class="icon" viewBox="0 0 22.832 27.398"> <g transform="translate(-42.667)"> <g transform="translate(42.667)"> <path class="a" d="M62.074,9.133V7.991a7.991,7.991,0,1,0-15.982,0V9.133a3.429,3.429,0,0,0-3.425,3.425V23.973A3.429,3.429,0,0,0,46.092,27.4H62.074A3.429,3.429,0,0,0,65.5,23.973V12.557A3.429,3.429,0,0,0,62.074,9.133Zm-13.7-1.142a5.708,5.708,0,0,1,11.416,0V9.133H48.375ZM63.216,23.973a1.143,1.143,0,0,1-1.142,1.142H46.092a1.143,1.143,0,0,1-1.142-1.142V12.557a1.143,1.143,0,0,1,1.142-1.142H62.074a1.143,1.143,0,0,1,1.142,1.142Z" transform="translate(-42.667)"></path> </g> <g transform="translate(50.658 13.128)"> <path class="a" d="M195.425,245.333a3.416,3.416,0,0,0-1.142,6.639v1.922a1.142,1.142,0,1,0,2.283,0v-1.922a3.416,3.416,0,0,0-1.142-6.639Zm0,4.566a1.142,1.142,0,1,1,1.142-1.142A1.143,1.143,0,0,1,195.425,249.9Z" transform="translate(-192 -245.333)"></path> </g> </g> </svg> But using the <use> tag: (Width is coming from nowhere!) .icon { height: 50px; width: auto; /* Aesthetics: */ background-color: gray; border-radius: 5px; } <svg style="display: none;"> <symbol id="lock" viewBox="0 0 22.832 27.398"> <g transform="translate(-42.667)"> <g transform="translate(42.667)"> <path class="a" d="M62.074,9.133V7.991a7.991,7.991,0,1,0-15.982,0V9.133a3.429,3.429,0,0,0-3.425,3.425V23.973A3.429,3.429,0,0,0,46.092,27.4H62.074A3.429,3.429,0,0,0,65.5,23.973V12.557A3.429,3.429,0,0,0,62.074,9.133Zm-13.7-1.142a5.708,5.708,0,0,1,11.416,0V9.133H48.375ZM63.216,23.973a1.143,1.143,0,0,1-1.142,1.142H46.092a1.143,1.143,0,0,1-1.142-1.142V12.557a1.143,1.143,0,0,1,1.142-1.142H62.074a1.143,1.143,0,0,1,1.142,1.142Z" transform="translate(-42.667)" /> </g> <g transform="translate(50.658 13.128)"> <path class="a" d="M195.425,245.333a3.416,3.416,0,0,0-1.142,6.639v1.922a1.142,1.142,0,1,0,2.283,0v-1.922a3.416,3.416,0,0,0-1.142-6.639Zm0,4.566a1.142,1.142,0,1,1,1.142-1.142A1.143,1.143,0,0,1,195.425,249.9Z" transform="translate(-192 -245.333)" /> </g> </g> </symbol> </svg> <svg class="icon"> <use href="#lock"></use> </svg> I've already checked out this question, as well as this one, and I've realized that by adding the "viewBox" of the icon to the referencing SVG, the problem would be solved, like this: .icon { height: 50px; width: auto; /* Aesthetics: */ background-color: gray; border-radius: 5px; } <svg style="display: none;"> <symbol id="lock" viewBox="0 0 22.832 27.398"> <g transform="translate(-42.667)"> <g transform="translate(42.667)"> <path class="a" d="M62.074,9.133V7.991a7.991,7.991,0,1,0-15.982,0V9.133a3.429,3.429,0,0,0-3.425,3.425V23.973A3.429,3.429,0,0,0,46.092,27.4H62.074A3.429,3.429,0,0,0,65.5,23.973V12.557A3.429,3.429,0,0,0,62.074,9.133Zm-13.7-1.142a5.708,5.708,0,0,1,11.416,0V9.133H48.375ZM63.216,23.973a1.143,1.143,0,0,1-1.142,1.142H46.092a1.143,1.143,0,0,1-1.142-1.142V12.557a1.143,1.143,0,0,1,1.142-1.142H62.074a1.143,1.143,0,0,1,1.142,1.142Z" transform="translate(-42.667)" /> </g> <g transform="translate(50.658 13.128)"> <path class="a" d="M195.425,245.333a3.416,3.416,0,0,0-1.142,6.639v1.922a1.142,1.142,0,1,0,2.283,0v-1.922a3.416,3.416,0,0,0-1.142-6.639Zm0,4.566a1.142,1.142,0,1,1,1.142-1.142A1.143,1.143,0,0,1,195.425,249.9Z" transform="translate(-192 -245.333)" /> </g> </g> </symbol> </svg> <svg class="icon" viewBox="0 0 22.832 27.398"> <!-- Copy-pasted the viewbox here --> <use href="#lock"></use> </svg> But obviously this is very inconvenient, repetitive, error-prone, and indeed ugly to write. So, I'd appreciate any workarounds. Isn't there a way to set the viewBox attribute to "auto" or something which means "whatever the inner SVG is", so as to avoid writing (or copy-pasting, rather) the viewBox each time you want to reference an icon? To be honest, I think everyone would intuitively kind of expect this to work like regular embedded SVGs since the viewBox is already set once on the symbol that is being referenced.
I'd highly recommend: Make all your icons have a consistent viewBox. For example, "0 0 24 24" is a common one that many icon libraries use. That way you don't have to find and copy the correct viewBox where you need it. It's always "0 0 24 24". Add a class to the referencing <svg> that you can use for setting the icon width. <svg class="icon lock" viewBox="0 0 24 24"> <use href="#lock"></use> </svg> Then in your CSS: .icon { // as above } .icon.lock { width: 45px; height: 50px; } .icon.something-else { width: 35px; height: 50px; } As long as your icon is horizontally centred in its viewBox, everything will work. Default size (square) icons need no extra CSS. You only need to add a CSS rule for the non-square ones.
If you're not opposed to using some JavaScript, the following should work. Load it once, no matter how many icons you have on your page. document.querySelectorAll(".icon").forEach(node => { const href = node.querySelector("use").href.baseVal; const icon = document.querySelector(href); const vb = icon.viewBox.baseVal; node.setAttribute("viewBox", `${vb.x} ${vb.y} ${vb.width} ${vb.height}`); }); .icon { height: 50px; width: auto; /* Aesthetics: */ background-color: gray; border-radius: 5px; } <svg style="display: none;"> <symbol id="lock" viewBox="0 0 22.832 27.398"> <g transform="translate(-42.667)"> <g transform="translate(42.667)"> <path class="a" d="M62.074,9.133V7.991a7.991,7.991,0,1,0-15.982,0V9.133 a3.429,3.429,0,0,0-3.425,3.425V23.973A3.429,3.429,0,0,0,46.092,27.4 H62.074A3.429,3.429,0,0,0,65.5,23.973V12.557 A3.429,3.429,0,0,0,62.074,9.133Z m-13.7-1.142a5.708,5.708,0,0,1,11.416,0V9.133H48.375Z M63.216,23.973a1.143,1.143,0,0,1-1.142,1.142H46.092 a1.143,1.143,0,0,1-1.142-1.142V12.557a1.143,1.143,0,0,1,1.142-1.142 H62.074a1.143,1.143,0,0,1,1.142,1.142Z" transform="translate(-42.667)"> </path> </g> <g transform="translate(50.658 13.128)"> <path class="a" d="M195.425,245.333a3.416,3.416,0,0,0-1.142,6.639v1.922 a1.142,1.142,0,1,0,2.283,0v-1.922a3.416,3.416,0,0,0-1.142-6.639Z m0,4.566a1.142,1.142,0,1,1,1.142-1.142 A1.143,1.143,0,0,1,195.425,249.9Z" transform="translate(-192 -245.333)"> </path> </g> </g> </symbol> </svg> <svg class="icon"> <use href="#lock"></use> </svg> If you want to add icons dynamically - after page load, the following would also be an improvement over adding a manual viewBox: function iconLoaded(event) { const node = event.target; const href = node.querySelector("use").href.baseVal; const icon = document.querySelector(href); const vb = icon.viewBox.baseVal; node.setAttribute("viewBox", `${vb.x} ${vb.y} ${vb.width} ${vb.height}`); } .icon { height: 50px; width: auto; /* Aesthetics: */ background-color: gray; border-radius: 5px; } <svg style="display: none;"> <symbol id="lock" viewBox="0 0 22.832 27.398"> <g transform="translate(-42.667)"> <g transform="translate(42.667)"> <path class="a" d="M62.074,9.133V7.991a7.991,7.991,0,1,0-15.982,0V9.133 a3.429,3.429,0,0,0-3.425,3.425V23.973A3.429,3.429,0,0,0,46.092,27.4 H62.074A3.429,3.429,0,0,0,65.5,23.973V12.557 A3.429,3.429,0,0,0,62.074,9.133Z m-13.7-1.142a5.708,5.708,0,0,1,11.416,0V9.133H48.375Z M63.216,23.973a1.143,1.143,0,0,1-1.142,1.142H46.092 a1.143,1.143,0,0,1-1.142-1.142V12.557a1.143,1.143,0,0,1,1.142-1.142 H62.074a1.143,1.143,0,0,1,1.142,1.142Z" transform="translate(-42.667)"> </path> </g> <g transform="translate(50.658 13.128)"> <path class="a" d="M195.425,245.333a3.416,3.416,0,0,0-1.142,6.639v1.922 a1.142,1.142,0,1,0,2.283,0v-1.922a3.416,3.416,0,0,0-1.142-6.639Z m0,4.566a1.142,1.142,0,1,1,1.142-1.142 A1.143,1.143,0,0,1,195.425,249.9Z" transform="translate(-192 -245.333)"> </path> </g> </g> </symbol> </svg> <svg class="icon" onload="iconLoaded(event)"> <use href="#lock"></use> </svg>
how to set a stroke on left and right side only on a svg wave
How can i set a stroke only on the right and left side of a svg (wave svg) <svg class="defs-only" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <symbol id="wave"> <svg viewBox="0 0 100 50" preserveAspectRatio="none" > <g> <path d="M100,30 Q70,40 50,30 T0,30 v20 h100Z" style="fill:red;" /> </g> </svg> </symbol> </svg> <div class="wave"> <svg style="width: 100%; height: 150px; margin-top: -150px;"> <use xlink:href="#wave"/> </svg> </div> So css below gives me stroke around it, but it should only on left and right side: svg { stroke: #000; } Fiddle: https://jsfiddle.net/fe43rt4v/1/
Change the path so that the left, bottom and right edges are drawn first: M0,30 v20 h100 v-20 Q70,40 50,30 T0,30. Not 100% required, but makes things easier (otherwise you would need to compute the length of the wave). Use stroke-dasharray to declare that you want to draw the stroke for the left edge (length 20), not for the bottom (length 100), for the right edge (length 20), and not for the rest (taking length 200 to be safe): stroke-dasharray: 20,100,20,200; That's it! Fiddle: https://jsfiddle.net/fe43rt4v/2/ svg { stroke: #000; stroke-dasharray: 20,100,20,200; } <svg class="defs-only" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <symbol id="wave"> <svg viewBox="0 0 100 50" preserveAspectRatio="none" > <g> <path d="M0,30 v20 h100 v-20 Q70,40 50,30 T0,30" style="fill:red;" /> </g> </svg> </symbol> </svg> <div class="wave"> <svg style="width: 100%; height: 150px; margin-top: -150px;"> <use xlink:href="#wave"/> </svg> </div>