Po około 48 godzinach badań skończyłem tak, aby uzyskać proporcjonalne skalowanie:
UWAGA: Ta próbka jest napisana za pomocą React. Jeśli nie używasz, że zmiany case wielbłąd rzeczy z powrotem do kresek (tj zmian backgroundColor
do background-color
i zmienić styl Object
z powrotem do String
).
<div
style={{
backgroundColor: 'lightpink',
resize: 'horizontal',
overflow: 'hidden',
width: '1000px',
height: 'auto',
}}
>
<svg
width="100%"
viewBox="113 128 972 600"
preserveAspectRatio="xMidYMid meet"
>
<g> ... </g>
</svg>
</div>
Oto, co dzieje się w powyższym przykładowym kodzie:
WIDOK
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox
min-x, min-y, szerokość i wysokość
tj .: viewbox = "0 0 1000 1000"
Viewbox jest ważnym atrybutem, ponieważ w zasadzie informuje SVG, jaki rozmiar narysować i gdzie. Jeśli użyłeś CSS do zrobienia SVG o wymiarach 1000 x 1000 pikseli, ale Twój viewbox miał wymiary 2000 x 2000, zobaczysz lewą górną ćwiartkę SVG.
Pierwsze dwie liczby, min-x i min-y, określają, czy SVG powinien być przesunięty w polu widzenia.
Mój SVG musi się zmieniać w górę / w dół lub w lewo / w prawo
Zbadaj to: viewbox = "50 50 450 450"
Pierwsze dwie liczby przesuną twój plik SVG w lewo o 50 pikseli i w górę o 50 pikseli, a dwie pozostałe liczby to rozmiar pola widzenia: 450 x 450 pikseli. Jeśli Twój plik SVG ma wymiary 500 x 500, ale ma na nim dodatkowe dopełnienie, możesz manipulować tymi liczbami, aby przenosić je w „polu widzenia”.
Twoim celem w tym momencie jest zmiana jednej z tych liczb i zobaczenie, co się stanie.
Możesz również całkowicie pominąć pole widzenia, ale wtedy twój przebieg będzie się różnić w zależności od każdego innego ustawienia, jakie masz w tym czasie. Z mojego doświadczenia wynika, że napotkasz problemy z zachowaniem współczynnika kształtu, ponieważ viewbox pomaga zdefiniować współczynnik kształtu.
ZACHOWAJ PROPORCJE
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio
Z moich badań wynika, że istnieje wiele różnych ustawień współczynnika kształtu, ale domyślnie nazywa się to xMidYMid meet
. Nakładam to na moje, aby wyraźnie sobie przypomnieć. xMidYMid meet
sprawia, że skaluje się proporcjonalnie w oparciu o punkt środkowy X i Y. Oznacza to, że pozostaje wyśrodkowany w polu podglądu.
SZEROKOŚĆ
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/width
Spójrz na mój przykładowy kod powyżej. Zauważ, jak ustawiam tylko szerokość, bez wysokości. Ustawiłem go na 100%, aby wypełniał pojemnik, w którym się znajduje. To prawdopodobnie najbardziej przyczynia się do odpowiedzi na pytanie przepełnienia stosu.
Możesz go zmienić na dowolną wartość piksela, ale zalecam użycie 100%, tak jak zrobiłem, aby powiększyć go do maksymalnego rozmiaru, a następnie kontrolować za pomocą CSS za pośrednictwem kontenera nadrzędnego. Polecam to, ponieważ uzyskasz „odpowiednią” kontrolę. Możesz używać zapytań o media i kontrolować rozmiar bez szalonego JavaScript.
SKALOWANIE Z CSS
Ponownie spójrz na mój przykładowy kod powyżej. Zwróć uwagę, jak mam te właściwości:
resize: 'horizontal', // you can safely omit this
overflow: 'hidden', // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',
Jest to dodatkowe, ale pokazuje, jak zezwolić użytkownikowi na zmianę rozmiaru SVG przy zachowaniu odpowiedniego współczynnika proporcji. Ponieważ SVG zachowuje swój własny współczynnik kształtu, wystarczy zmienić rozmiar kontenera nadrzędnego, a jego rozmiar zmieni się zgodnie z potrzebami.
Wysokość zostawiamy w spokoju i / lub ustawiamy ją na auto, i kontrolujemy zmianę rozmiaru za pomocą szerokości. Wybrałem szerokość, ponieważ często jest bardziej znacząca ze względu na responsywne projekty.
Oto obraz używanych ustawień:
Jeśli czytasz wszystkie rozwiązania zawarte w tym pytaniu i nadal jesteś zdezorientowany lub nie rozumiesz, czego potrzebujesz, sprawdź ten link tutaj. Uważam to za bardzo pomocne:
https://css-tricks.com/scale-svg/
Jest to ogromny artykuł, ale rozkłada się praktycznie każdy możliwy sposób manipulowania SVG, z CSS lub bez. Zalecam przeczytanie go podczas swobodnego picia kawy lub wyboru wybranych płynów.