For an SVG’s contents to scale with its size, it needs to have a viewBox
.
svg { background-color: linen; } .point { stroke: black; stroke-width: 1; }
<svg width="10px" height="10px" viewBox="0 0 10 10"> <line class="point" x1="0" x2="10" y1="5" y2="5" /> <line class="point" x1="5" x2="5" y1="0" y2="10" /> </svg> <svg width="30px" height="30px" viewBox="0 0 10 10"> <line class="point" x1="0" x2="10" y1="5" y2="5" /> <line class="point" x1="5" x2="5" y1="0" y2="10" /> </svg> <svg width="100px" height="100px" viewBox="0 0 10 10"> <line class="point" x1="0" x2="10" y1="5" y2="5" /> <line class="point" x1="5" x2="5" y1="0" y2="10" /> </svg>
Run code snippetExpand snippet
In this example, everything scales, including the line width. If that’s not what you want, then you can either use @SirExotic’s approach (using percentage coordinates), or you could set the lines to not scale by using vector-effect: non-scaling-stroke
.
svg { background-color: linen; } .point { stroke: black; stroke-width: 1; vector-effect: non-scaling-stroke; }
<svg width="10px" height="10px" viewBox="0 0 10 10"> <line class="point" x1="0" x2="10" y1="5" y2="5" /> <line class="point" x1="5" x2="5" y1="0" y2="10" /> </svg> <svg width="30px" height="30px" viewBox="0 0 10 10"> <line class="point" x1="0" x2="10" y1="5" y2="5" /> <line class="point" x1="5" x2="5" y1="0" y2="10" /> </svg> <svg width="100px" height="100px" viewBox="0 0 10 10"> <line class="point" x1="0" x2="10" y1="5" y2="5" /> <line class="point" x1="5" x2="5" y1="0" y2="10" /> </svg>
Run code snippetExpand snippet