Jak wyśrodkować plik SVG w div?

252

Mam plik SVG, który próbuję wyśrodkować w div. Div ma szerokość lub 900 pikseli. SVG ma szerokość 400 pikseli. SVG ma lewy margines i prawy margines ustawiony na auto. Nie działa, działa tak, jakby lewy margines wynosił 0 (domyślnie).

Czy ktoś zna mój błąd?

Don P.
źródło

Odpowiedzi:

459

SVG jest domyślnie wbudowany. Dodaj display: blockdo niego, a następnie margin: autobędzie działać zgodnie z oczekiwaniami.

Spadar Shut
źródło
10
całkiem pewne, że oznacza to również, że wyrównywanie tekstu: wyśrodkuje również element nadrzędny (to i tak działa dla mnie w Chrome)
Nathan
29

Powyższe odpowiedzi nie działały dla mnie. Dodanie atrybutu preserveAspectRatio="xMidYMin"do <svg>tagu załatwiło sprawę. Aby viewBoxto działało, należy również określić atrybut. Źródło: sieć programistów Mozilla

Esger
źródło
7
Moje obecne podejście to flexbox. Wystarczy dodać: .container { display: flex; justify-content: center; }I dodaj klasę .container do div, który zawiera twój plik svg.
Esger,
1
Zastanów się nad dodaniem kolejnej odpowiedzi w tym nowym podejściu, aby móc ją głosować. Dzięki za pomoc!
Chris Peters
24

Po przeczytaniu powyżej, że plik svg jest domyślnie wbudowany, dodałem właśnie do div:

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

i to załatwiło sprawę.

Purystom może się to nie podobać (jest to obraz, a nie tekst), ale moim zdaniem HTML i CSS zepsuły się nad centrowaniem, więc myślę, że jest to uzasadnione.

David
źródło
dzięki za to. prosty i skuteczny. oszalałem przez wiele godzin, bawiąc się viewPort i viewBox. załatwiło sprawę w kilka sekund. po prostu owiń głupią rzecz w div i wyśrodkuj ją.
anon58192932,
@ anon58192932 - Nie ma za co. To jest głupio proste, ale satysfakcjonujące, że przydaje się innym, ponieważ skorzystałem z tylu bardziej wyrafinowanych odpowiedzi na pytania tutaj.
David
20

Żadna z tych odpowiedzi nie działała dla mnie. Tak to zrobiłem.

position: relative;
left: 50%;
-webkit-transform: translateX(-50%);
-ms-transform: translateX(-50%);
transform: translateX(-50%);
Ryan
źródło
3
nie wiem dlaczego, ale musiałem użyćleft: 100%
Luís Deschamps Rudge
16

Odpowiedzi powyżej wyglądają na niekompletne, ponieważ rozmawiają tylko z punktu widzenia css.

na położenie svg w rzutni mają wpływ dwa atrybuty svg

  1. viewBox: definiuje obszar prostokąta dla svg do pokrycia.
  2. preserveAspectRatio: określono, gdzie umieścić viewBox wrt viewport i jak strechować go, jeśli zmieni się viewport.

Kliknij ten link z codepen, aby uzyskać szczegółowy opis

<svg viewBox="70 160 800 190" preserveAspectRatio="xMaxYMax meet">
Shishir Arora
źródło
6

Musiałem użyć

display: inline-block;
Joanna Schweiger
źródło
4

upewnij się, że twój css czyta:

margin: 0 auto;

Nawet jeśli mówisz, że lewy i prawy jest ustawiony na auto, być może umieszczasz błąd. Oczywiście nie wiedzielibyśmy, ponieważ nie pokazałeś nam żadnego kodu.

Michael Rader
źródło
3

Możesz także to zrobić:

<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
źródło
2

Umieść kod między tym, divjeśli używasz 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
źródło
2

Flexbox to inne podejście: dodaj .container { display: flex; justify-content: center; }I dodaj .containerklasę do div, który zawiera twój svg.

Esger
źródło
0

Dla mnie poprawką było dodanie margin: 0 auto;do elementu zawierającego <svg>.

Lubię to:

<div style="margin: 0 auto">
   <svg ...</svg>
</div>
Collin Krawll
źródło