Como centralizo um SVG em uma div?


254

Eu tenho um SVG que estou tentando centralizar em uma div. A div tem uma largura ou 900 px. O SVG tem uma largura de 400px. O SVG tem sua margem esquerda e margem direita ajustada para automático. Não funciona, apenas age como se a margem esquerda fosse 0 (padrão).

Alguém conhece o meu erro?

Respostas:


460

SVG está embutido por padrão. Adicione display: blocka ele e, em seguida margin: auto, funcionará conforme o esperado.


10
certeza que isso também significa que text-align: center no elemento pai irá funcionar também (ele trabalha para mim no Chrome qualquer maneira)
Nathan

isso NÃO funcionou para mim, mas usar 'bloco inline' em vez de 'bloco', funcionou. Talvez tenha sido porque eu inseri o SVG em um td, não umdiv
mathheadinclouds

29

As respostas acima não funcionaram para mim. Adicionar o atributo preserveAspectRatio="xMidYMin"à <svg>tag fez o truque. O viewBoxatributo precisa ser especificado para que isso funcione também. Fonte: rede de desenvolvedores Mozilla


7
Minha abordagem atual é o flexbox. Apenas adicione: .container { display: flex; justify-content: center; }E adicione a classe .container à div que contém seu svg.
Esger

1
Considere adicionar outra resposta com essa nova abordagem para que eu possa votá-la novamente. Obrigado pela ajuda!
Chris Peters

24

Depois de ler acima que o svg está embutido por padrão, acabei de adicionar o seguinte à div:

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

e fez o truque para mim.

Os puristas podem não gostar (é uma imagem, não um texto), mas na minha opinião HTML e CSS estragaram demais a centralização, então acho que é justificado.


obrigado por isso. simples e eficaz. ficou louco por horas mexendo com viewPort e viewBox. isso fez o truque em segundos. apenas envolva a coisa estúpida em uma div e centralize-a.
anon58192932

@ anon58192932 - De nada. É estupidamente simples, mas é satisfatório que seja útil para outras pessoas, pois me beneficiei de tantas respostas mais sofisticadas para perguntas aqui.
David David

20

Nenhuma dessas respostas funcionou para mim. Foi assim que eu fiz.

position: relative;
left: 50%;
-webkit-transform: translateX(-50%);
-ms-transform: translateX(-50%);
transform: translateX(-50%);

3
eu não sei por que, mas eu tive que usarleft: 100%
Luís Deschamps Rudge

16

As respostas acima parecem incompletas, pois estão falando apenas do ponto de vista do css.

o posicionamento do svg na viewport é afetado por dois atributos svg

  1. viewBox: define a área retangular para o svg cobrir.
  2. preserveAspectRatio: definido onde colocar a viewport wrt viewBox e como expandi-la se a viewport mudar.

Siga este link do codepen para obter uma descrição detalhada

<svg viewBox="70 160 800 190" preserveAspectRatio="xMaxYMax meet">


4

verifique se o seu css lê:

margin: 0 auto;

Mesmo dizendo que a esquerda e a direita estão definidas como automáticas, você pode estar causando um erro. É claro que não saberíamos, porque você não nos mostrou nenhum código.


3

Você também pode fazer isso:

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

2

Coloque seu código entre isso divse você estiver usando o 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>

2

O Flexbox é outra abordagem: adicione .container { display: flex; justify-content: center; }E adicione a .containerclasse à div que contém seu svg.


0

Para mim, a correção foi adicionar margin: 0 auto;ao elemento que contém o <svg>.

Como isso:

<div style="margin: 0 auto">
   <svg ...</svg>
</div>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.