Search code examples
csssvgwidthline

SVG center horizontal and vertical line


How can I create an SVG containing two lines (one horizontal, one vertical) going from the middle from one side to the middle of the opposite side, thus making a plus sign the same size as the SVG container?

This is what I have now but when changing SVG size the line lengths will not change

<svg width="10px" height="10px">
<line class="point" x1="0" x2="10" y1="5" y2="5" />
<line class="point" x1="5" x2="5" y1="0" y2="10" />
</svg>

Solution

  • 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>

    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>