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?

Don P
fonte

Respostas:

460

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

Spadar Shut
fonte
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

Esger
fonte
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.

David
fonte
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%);
Ryan
fonte
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">
Shishir Arora
fonte
6

Eu tive que usar

display: inline-block;
Joanna Schweiger
fonte
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.

Michael Rader
fonte
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>
Martin Lloyd Jose
fonte
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>
Uzair Ahmad
fonte
2

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

Esger
fonte
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>
Collin Krawll
fonte