Чому мої зображення SVG не масштабуються за допомогою властивості CSS “width”?


82

Я створюю веб-сайт портфоліо.

HTML-код

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

CSS-код (за допомогою 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;
        }
    }
}

Проблема в тому, що я не можу змінити розмір SVG за допомогою widthвластивості CSS . Ось що я отримую в різних випадках:

img { width: 2em; }

введіть тут опис зображення

img { width: 3em; }

введіть тут опис зображення

img { width: em; }

введіть тут опис зображення

Зверніть увагу, як піктограми згортаються до середини herodiv.

Натомість, якщо я використовую heightвластивість CSS :

img { height: 2em; }

введіть тут опис зображення

img { height: 3em; }

введіть тут опис зображення

img { height: 4em; }

введіть тут опис зображення

Така поведінка мені потрібна, але я не впевнений, що це правильний шлях. Чому це трапляється? Чи знаєте ви кращі способи зміни розміру зображень SVG (особливо за допомогою моделі flexbox )?

Відповіді:


110

SVG відрізняються від растрових зображень, таких як PNG тощо. Якщо SVG має файл viewBox - як здається вашій, - вона буде масштабована відповідно до визначеного вікна перегляду. Він не буде безпосередньо масштабуватися, як PNG.

Тож збільшення widthзначень imgне зробить піктограми вищими, якщо висота обмежена. Ви просто закінчитеimg горизонтально відцентрований у ширшому полі.

Я вважаю, що ваша проблема полягає в тому, що ваші SVG мають фіксовану висоту, визначену в них. Відкрийте файли SVG і переконайтеся, що вони:

  1. не мають widthі heightвизначено, або
  2. є widthі heightобидва встановлені на "100%".

Це має вирішити вашу проблему. Якщо цього не сталося, опублікуйте один із своїх SVG у своєму питанні, щоб ми могли побачити, як це визначається.


Здається, ваша відповідь є рішенням моєї проблеми. Отже, якщо я не вказав widthі heightSVG, я думаю, я можу масштабувати його без проблем.
Pine Code

Станом на 2019 рік, схоже, SVG підкоряються правилам ширини та висоти css, навіть якщо вони мають вікно перегляду та / або ширину та висоту всередині них. Перевірено в Chrome та Firefox.
Ілліч

1
Проблема @Ilyich OP полягала в тому, що вони вказували лише widthв CSS. Це heightнадходило з SVG.
Paul

13

Мені довелося це зрозуміти самому, але деякі svgs вам потрібні для відповідності viewBox & width + height у.

Наприклад, якщо це вже є width="x" height="y"= =

додати <svg ... viewBox="0 0 [width] [height]">

і навпаки.

Після цього він буде масштабуватися за допомогою <svg ... style="width: xxx; height: yyy;">


1
це viewBox , а не viewport
Alyona

2
Дякую! мені справді допомогло
Максим Герінк

10
  1. Якщо файл svg має висоту та ширину, вже визначені width="100" height="100"у файлі svg, додайте це x="0px" y="0px" width="100" height="100" viewBox="0 0 100 100", зберігаючи вже визначені width="100" height="100".
  2. Потім ви можете масштабувати svg у своєму файлі css, використовуючи селектор у вашому випадку, imgщоб ви могли зробити це: img{height: 20px; width: 20px;}і зображення буде масштабовано.

4

Перетворення CSS властивість дозволяє обертати, масштабувати, перекіс, або перевести елемент.

Таким чином, ви можете легко використовувати transform: scale(2.5);опцію масштабування, наприклад, у 2,5 рази.


2
Це рішення для мене добре працювало, оскільки я не контролював внутрішні елементи файлу SVG. Дякуємо за публікацію;)
jamesioppolo

0

Вам потрібно змінити viewBoxвластивість, щоб правильно змінювати висоту та ширину за допомогою svg. Це в <svg>тегу svg.

https://developer.mozilla.org/en/docs/Web/SVG/Attribute/viewBox


6
На моє припущення щодо голосування проти, що зміна вікна перегляду насправді не масштабує елементи svg, а лише змінює розмір області перегляду.
Марко

-1

Ви також можете скористатися цією transform: scale("")опцією.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.