Warum skalieren meine SVG-Bilder nicht mit der CSS-Eigenschaft "width"?


76

Ich baue eine Portfolio-Website auf.

HTML Quelltext

<div id = "hero">
   <div id = "social">
      <img src = "facebook.svg">
      <img src = "linkedin.svg">
      <img src = "instagram.svg">
    </div>
</div>

CSS-Code (mit SASS)

#hero {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    height: 300px;

    #social {
        width: 50%;
        display: flex;
        justify-content: space-between;
        flex-wrap: wrap;

        img {
            width: 2em;
        }
    }
}

Das Problem ist, dass ich die Größe von SVGs mithilfe der CSS- widthEigenschaft nicht ändern kann . Folgendes erhalte ich in verschiedenen Fällen:

img { width: 2em; }

Geben Sie hier die Bildbeschreibung ein

img { width: 3em; }

Geben Sie hier die Bildbeschreibung ein

img { width: em; }

Geben Sie hier die Bildbeschreibung ein

Bitte beachten Sie, wie Symbole in der Mitte des heroDiv zusammenfallen.

Wenn ich stattdessen die CSS- heightEigenschaft verwende:

img { height: 2em; }

Geben Sie hier die Bildbeschreibung ein

img { height: 3em; }

Geben Sie hier die Bildbeschreibung ein

img { height: 4em; }

Geben Sie hier die Bildbeschreibung ein

Dieses Verhalten ist das, was ich brauche, aber ich bin mir nicht sicher, ob dies der richtige Weg ist. Warum passiert das? Kennen Sie bessere Möglichkeiten zur Größenänderung von SVG-Bildern (insbesondere mit dem Flexbox-Modell )?

Antworten:


100

SVGs unterscheiden sich von Bitmap-Bildern wie PNG usw. Wenn ein SVG viewBox- wie es Ihren scheint - ein hat, wird es so skaliert, dass es zu seinem definierten Ansichtsfenster passt. Es wird nicht direkt skaliert wie ein PNG.

So ist die Erhöhung widthder imgnicht die Symbole jeder größer machen , wenn die Höhe begrenzt ist. Sie werden nur mit der imghorizontal zentrierten in einem breiteren Feld enden .

Ich glaube, Ihr Problem ist, dass in Ihren SVGs eine feste Höhe definiert ist. Öffnen Sie die SVG-Dateien und stellen Sie sicher, dass sie entweder:

  1. habe keine widthund heightdefiniert, oder
  2. haben widthund heightbeide setzen auf "100%".

Das sollte dein Problem lösen. Wenn dies nicht der Fall ist, geben Sie eine Ihrer SVGs in Ihre Frage ein, damit wir sehen können, wie sie definiert ist.


Ihre Antwort scheint die Lösung für mein Problem zu sein. Wenn ich also das widthund das heightder SVG nicht spezifiziere , kann ich es ohne Probleme skalieren.
Pine Code

Ab 2019 befolgen SVGs anscheinend die Regeln für CSS-Breite und -Höhe, auch wenn sie ein Ansichtsfeld und / oder eine Breite und Höhe enthalten. Getestet in Chrome und Firefox.
Iljitsch

1
Das Problem von @Ilyich OP war, dass sie nur das widthin CSS spezifizierten . Das heightkam von der SVG.
Paul LeBeau

10

Ich musste es selbst herausfinden, aber einige SVGs müssen mit der ViewBox & Breite + Höhe übereinstimmen.

ZB wenn es schon width="x" height="y"dann = = hat

hinzufügen <svg ... viewBox="0 0 [width] [height]">

und das Gegenteil.

Danach wird es mit skalieren <svg ... style="width: xxx; height: yyy;">


1
Es ist ViewBox , nicht Viewport
Alyona

2
Vielen Dank! hat mir wirklich geholfen
Maxim Geerinck

9
  1. Wenn für die SVG-Datei bereits eine Höhe und Breite width="100" height="100"in der SVG-Datei definiert ist, fügen Sie diese hinzu, x="0px" y="0px" width="100" height="100" viewBox="0 0 100 100"während Sie die bereits definierte beibehalten width="100" height="100".
  2. Anschließend können Sie das SVG in Ihrer CSS-Datei mithilfe eines Selektors in Ihrem Fall skalieren, imgdamit Sie dies tun können: img{height: 20px; width: 20px;}Das Bild wird skaliert.


0

Sie können die transform: scale("")Option auch verwenden .


0

Mit der CSS-Eigenschaft zum Transformieren können Sie ein Element drehen, skalieren, verzerren oder übersetzen.

So können Sie die transform: scale(2.5);Option ganz einfach verwenden, um beispielsweise das 2,5-fache zu skalieren.


1
Diese Lösung funktionierte gut für mich, da ich keine Kontrolle über die Interna der SVG-Datei hatte. Danke fürs
posten
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.