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.