¿Cómo centro un SVG en un div?

254

Tengo un SVG que estoy tratando de centrar en un div. El div tiene un ancho o 900px. El SVG tiene un ancho de 400 px. El SVG tiene su margen izquierdo y margen derecho establecidos en automático. No funciona, solo actúa como si el margen izquierdo fuera 0 (predeterminado).

Alguien sabe mi error?

Don P
fuente

Respuestas:

461

SVG está en línea de forma predeterminada. Agréguelo display: blocky luego margin: autofuncionará como se esperaba.

Spadar Shut
fuente
10
Estoy bastante seguro de que esto también significa que la alineación de texto: el centro en el elemento padre también funcionará (de todos modos, para mí funciona en Chrome)
Nathan
esto NO funcionó para mí, pero usar 'inline-block' en lugar de 'block', funcionó. Tal vez fue porque tddiv
inserté
29

Las respuestas anteriores no funcionaron para mí. Sin embargo, agregar el atributo preserveAspectRatio="xMidYMin"a la <svg>etiqueta hizo el truco. El viewBoxatributo necesita ser especificado para que esto funcione también. Fuente: red de desarrolladores de Mozilla

Esger
fuente
77
Mi enfoque actual es flexbox. Simplemente agregue: .container { display: flex; justify-content: center; }Y agregue la clase .container al div que contiene su svg.
Esger
1
Considere agregar otra respuesta con este nuevo enfoque para que pueda votarlo. ¡Gracias por tu ayuda!
Chris Peters
25

Habiendo leído anteriormente que svg está en línea por defecto, acabo de agregar lo siguiente al div:

<div style="text-align:center;">

y me sirvió.

Puede que a los puristas no les guste (es una imagen, no un texto) pero, en mi opinión, HTML y CSS se equivocaron por centrar, así que creo que está justificado.

David
fuente
gracias por esto. Simple y efectivo. He estado enloqueciendo durante horas jugando con viewPort y viewBox. Esto hizo el truco en segundos. simplemente envuelve la estupidez en un div y céntralo.
anon58192932
@ anon58192932 - De nada. Es estúpidamente simple, pero satisfactorio que sea útil para otros, ya que me he beneficiado de tantas respuestas más sofisticadas a las preguntas aquí.
David
20

Ninguna de estas respuestas funcionó para mí. Así es como lo hice.

position: relative;
left: 50%;
-webkit-transform: translateX(-50%);
-ms-transform: translateX(-50%);
transform: translateX(-50%);
Ryan
fuente
3
no sé por qué, pero tuve que usarloleft: 100%
Luís Deschamps Rudge
16

Las respuestas anteriores parecen incompletas ya que solo hablan desde el punto de vista css.

el posicionamiento de svg dentro de la ventana gráfica se ve afectado por dos atributos de svg

  1. viewBox: define el área del rectángulo para que svg cubra.
  2. preserveAspectRatio: definió dónde colocar la ventana gráfica viewBox wrt y cómo extenderla si la ventana gráfica cambia.

Siga este enlace desde codepen para una descripción detallada

<svg viewBox="70 160 800 190" preserveAspectRatio="xMaxYMax meet">
Shishir Arora
fuente
6

Tuve que usar

display: inline-block;
Joanna Schweiger
fuente
4

asegúrese de que su css lea:

margin: 0 auto;

Aunque esté diciendo que tiene los ajustes izquierdo y derecho en automático, puede estar colocando un error. Por supuesto, no lo sabríamos porque no nos mostró ningún código.

Michael Rader
fuente
3

También puedes hacer esto:

<center>
<div style="width: 40px; height: 40px;">
    <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#twitter-icon">
            <svg id="twitter-icon" viewBox="0 0 64 64" width="100%" height="100%">
                <path
                    d="M48,22.1c-1.2,0.5-2.4,0.9-3.8,1c1.4-0.8,2.4-2.1,2.9-3.6c-1.3,0.8-2.7,1.3-4.2,1.6 C41.7,19.8,40,19,38.2,19c-3.6,0-6.6,2.9-6.6,6.6c0,0.5,0.1,1,0.2,1.5c-5.5-0.3-10.3-2.9-13.5-6.9c-0.6,1-0.9,2.1-0.9,3.3 c0,2.3,1.2,4.3,2.9,5.5c-1.1,0-2.1-0.3-3-0.8c0,0,0,0.1,0,0.1c0,3.2,2.3,5.8,5.3,6.4c-0.6,0.1-1.1,0.2-1.7,0.2c-0.4,0-0.8,0-1.2-0.1 c0.8,2.6,3.3,4.5,6.1,4.6c-2.2,1.8-5.1,2.8-8.2,2.8c-0.5,0-1.1,0-1.6-0.1c2.9,1.9,6.4,2.9,10.1,2.9c12.1,0,18.7-10,18.7-18.7 c0-0.3,0-0.6,0-0.8C46,24.5,47.1,23.4,48,22.1z"
                    />
            </svg>
        </use>
    </svg>
</div>
</center>
Martin Lloyd Jose
fuente
2

Ponga su código entre esto divsi está usando bootstrap :

  <div class="text-center ">
  <i class="fa fa-twitter" style="font-size:36px "></i>
  <i class="fa fa-pinterest" style="font-size:36px"></i>
  <i class="fa fa-dribbble" style="font-size:36px"></i>
  <i class="fa fa-instagram" style="font-size:36px"></i>
  </div>
Uzair Ahmad
fuente
2

Flexbox es otro enfoque: agregar .container { display: flex; justify-content: center; }y agregar la .containerclase al div que contiene su svg.

Esger
fuente
0

Para mí, la solución fue agregar margin: 0 auto;al elemento que contiene el<svg> .

Me gusta esto:

<div style="margin: 0 auto">
   <svg ...</svg>
</div>
Collin Krawll
fuente