Ana kapsayıcıyla nasıl svg ölçeği yapabilirim?


235

Boyut yerel olmadığında satır içi svg öğesinin içindekiler ölçeği olmasını istiyorum. Tabii ki ayrı bir dosya olarak alabilir ve böyle ölçeklendirebilirim.

index.html: <img src="foo.svg" style="width: 100%;" />

foo.svg: <svg width="123" height="456"></svg>

Ancak, CSS aracılığıyla SVG'ye ek stiller eklemek istiyorum, bu yüzden harici bir bağlantı bağlamak bir seçenek değil. Satır içi SVG ölçeğini nasıl oluştururum?


2
svg genişliklerinde ve yüksekliklerinde sınırları deneyin.
ncm

@ncm JS ile nasıl yapılır?
Mawg, Monica'nın

Yanıtlar:


457

Görüntünün ölçeklendirilmiş boyutundan bağımsız olarak SVG görüntüsü içindeki koordinatları belirtmek için görüntünün viewBoxsınırlayıcı kutusunun görüntünün koordinat sisteminde ne olduğunu tanımlamak için SVG öğesindeki özniteliği kullanın widthve heightneyi tanımlamak için ve özniteliklerini kullanın genişlik veya yükseklik içeren sayfaya göredir.

Örneğin, aşağıdakilere sahipseniz:

<svg>
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

10 piksel x 20 piksel üçgen şeklinde oluşturulur:

10x20 üçgen

Şimdi, yalnızca genişliği ve yüksekliği ayarlarsanız, bu SVG öğesinin boyutunu değiştirir, ancak üçgeni ölçeklendirmez:

<svg width=100 height=50>
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

10x20 üçgen

Görünüm kutusunu ayarlarsanız, bu, görüntüyü verilen kutu (görüntünün koordinat sisteminde), verilen genişlik ve yüksekliğe (sayfanın koordinat sistemine) sığacak şekilde ölçeklendirilecek şekilde dönüştürür. Örneğin, üçgeni 100 piksel x 50 piksel olacak şekilde ölçeklendirmek için:

<svg width=100 height=50 viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

100x50 üçgen

HTML görünümünün genişliğine kadar ölçeklendirmek istiyorsanız:

<svg width="100%" viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

300x150 üçgen

Varsayılan olarak en boy oranının korunduğuna dikkat edin. Dolayısıyla, öğenin% 100 genişliğe, ancak 50 piksel yüksekliğe sahip olması gerektiğini belirtirseniz, aslında yalnızca 50 piksel yüksekliğe kadar ölçeklendirilir (çok dar bir pencereniz yoksa):

<svg width="100%" height="50px" viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

100x50 üçgen

Aslında yatay olarak uzanmasını istiyorsanız, en boy oranı korumasını aşağıdakilerle devre dışı bırakın preserveAspectRatio=none:

<svg width="100%" height="50px" viewBox="0 0 20 10" preserveAspectRatio="none">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

300x50 üçgen

(benim örneklerde HTML gömme için çalışan sözdizimi kullanırken, örnekleri StackOverflow bir görüntü olarak eklemek için bunun yerine başka bir SVG içine gömüyorum, bu yüzden geçerli XML sözdizimi kullanmanız gerektiğini unutmayın)


1
Nasıl sadece viewBox preserveAspectRatio değil, aynı zamanda ana kutu yapmak? Genişlik istiyorum:% 100; yükseklik: bunun için otomatik.
bjb568

1
@ Dostum: width="100%"Belirtilen yüksekliği olan ve yüksekliği olmayan örnek istediğinizi yapar. Göstermek için resimler ekledim. % 100 genişliğe sahiptir ve yüksekliği orantılı olarak ölçeklendirir. Eğer aradığınız bu değilse, ne demek istediğinizi açıklığa kavuşturabilir misiniz?
Brian Campbell

1
Ah. Aslında sorun değil. Bu sadece bir webkit hatası. Safari ve Chrome'da "gerçek" yükseklik varsayılan olarak% 100'dür, otomatik değil. Öyleyse bunu nasıl hallederim?
bjb568

4
@ Ah Ah, evet, anlıyorum. Firefox'ta Tamam çalışıyor, ancak Chrome veya Safari yok. Göre SVG Şartname , Firefox doğru görünmektedir; SVG öğesinin widthve heightSVG öğesinin varsayılan değeri % 100 olsa da, bu% 100 (içeren bloğun% 100'ü) CSS tanımı değil, bunun yerine içsel en boy oranına ( viewBoxverilen zamandan hesaplanır ). Chrome / Safari'de çalışan bu soruna henüz bir çözüm bulamadım.
Brian Campbell

1
Bu benim için çalışıyor. Önce SVG öğesi üzerinde bir viewBox özniteliği oluşturuyorum ve değeri "0 0 [original svg width] [original svg height]" olarak ayarlıyorum. Sonra SVG öğesinin width özelliğini "auto" ve height özelliğini "100%" olarak değiştiririm. Kap ayrıca belirlenmiş bir yüksekliğe sahip olmalıdır. Bu, vektörü kap yüksekliğinin% 100'üne ölçeklendirir ve genişliğin yüzmesine izin verir. Son olarak, kabın aşılmasını önlemek için SVG'nin CSS maksimum genişliğini% 100 olarak ayarlayın.
Ryan Griggs

28

48 saatlik araştırmadan sonra, orantılı ölçeklendirme elde etmek için bunu yaptım:

NOT: Bu örnek React ile yazılmıştır. (: Değişim yani bunu kullanmıyorsanız, tire için deve vaka şeyler geri değiştirmek backgroundColoriçin background-colorve stil değiştirmek Objectbir için arkasını 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>

Yukarıdaki örnek kodda neler olduğu aşağıda açıklanmıştır:

ViewBox

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

min-x, min-y, genişlik ve yükseklik

ie: viewbox = "0 0 1000 1000"

Viewbox önemli bir özelliktir, çünkü temel olarak SVG'ye hangi boyutta ve nerede çizileceğini söyler. SVG 1000x1000 piksel yapmak için CSS kullandıysanız ancak görünüm kutunuz 2000x2000 ise, SVG'nizin sol üst çeyreğini görürsünüz .

İlk iki sayı, min-x ve min-y, SVG'nin görünüm kutusunun içinde dengelenip dengelenmeyeceğini belirler.

SVG'm yukarı / aşağı veya sola / sağa kaydırmalı

Şunu inceleyin: viewbox = "50 50 450 450"

İlk iki sayı SVG'nizi 50 piksel ve 50 piksel yukarı kaydırır ve ikinci iki sayı görüntüleme kutusu boyutudur: 450x450 piksel. SVG'niz 500x500 ise ancak üzerinde fazladan dolgu varsa, bu sayıları "görünüm kutusu" içinde hareket ettirmek için değiştirebilirsiniz.

Bu noktada amacınız bu sayılardan birini değiştirmek ve ne olduğunu görmektir.

Görünüm kutusunu tamamen atlayabilirsiniz, ancak daha sonra milajınız o anda sahip olduğunuz diğer tüm ayarlara bağlı olarak değişir. Deneyimlerime göre, görünüm kutusu en boy oranını tanımlamaya yardımcı olduğu için en boy oranını koruma ile ilgili sorunlarla karşılaşacaksınız.

EN BOY ORANINI KORU

MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio

Araştırmamı temel alarak, birçok farklı en boy oranı ayarı var, ancak varsayılan olanı çağırılıyor xMidYMid meet. Kendime açıkça hatırlatmak için benimkini koydum. xMidYMid meetorta nokta X ve Y'ye göre orantılı olarak ölçeklendirir. Bu, görünüm kutusunda ortalanmış olarak kaldığı anlamına gelir.

GENİŞLİK

MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/width

Yukarıdaki örnek koduma bakın. Sadece genişliği nasıl ayarladığımı fark ettim, yükseklik yok. % 100'e ayarladım, böylece içinde bulunduğu kabı dolduruyor. Muhtemelen bu Yığın Taşması sorusunu cevaplamaya en çok katkıda bulunan şey budur.

İstediğiniz piksel değerine değiştirebilirsiniz, ancak maksimum boyuta kadar şişirmek ve daha sonra üst konteyner aracılığıyla CSS ile kontrol etmek için yaptığım gibi% 100 kullanmanızı öneririm. Bunu tavsiye ederim çünkü "uygun" kontrol elde edersiniz. Medya sorgularını kullanabilir ve çılgın JavaScript olmadan boyutu kontrol edebilirsiniz.

CSS İLE ÖLÇEKLEME

Yukarıdaki örnek koduma tekrar bakın. Nasıl bu özelliklere sahip dikkat edin:

resize: 'horizontal', // you can safely omit this
overflow: 'hidden',   // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',

Bu ek bir konudur, ancak uygun en boy oranını korurken kullanıcının SVG'yi yeniden boyutlandırmasına nasıl izin vereceğinizi gösterir. SVG kendi en boy oranını koruduğundan, yalnızca ana kapta genişliği yeniden boyutlandırmanız gerekir ve istendiği gibi yeniden boyutlandırılır.

Yüksekliği yalnız bırakıyoruz ve / veya otomatik olarak ayarlıyoruz ve yeniden boyutlandırmayı genişlikle kontrol ediyoruz. Genişliği seçtim, çünkü duyarlı tasarımlar nedeniyle genellikle daha anlamlı.

Kullanılan bu ayarların bir görüntüsü:

resim açıklamasını buraya girin

Bu sorudaki her çözümü okuduysanız ve hala karıştıysanız veya neye ihtiyacınız olduğunu tam olarak göremiyorsanız, buradaki bağlantıya göz atın. Çok yararlı buldum:

https://css-tricks.com/scale-svg/

Bu büyük bir makale, ancak bir SVG'yi CSS ile veya CSS olmadan manipüle etmek için mümkün olan her yolu yıkıyor. Bir kahve içerken veya seçtiğiniz sıvıları seçerken okumanızı tavsiye ederim.


Bu herhangi bir SVG için işe yaramıyor gibi görünüyor - SVG kaynağı üzerinde kontrolünüz yoksa, SVG sabit bir genişliğe sahip olduğunda bu yöntem başarısız olur.
user48956

@ user48956 Her zaman JavaScript'ten sonra her zaman değiştirebilirsiniz.
Andrew

Evet - bir programlama ile çeşitli dosya formatlarının iç kısımlarına her zaman poke edebilirsiniz - ancak her türlü varlık (örneğin PNG'ler) için çalışan ve JavaScript programlama gerektirmeyen bir yöntem olacağını umabilirsiniz.
user48956

21

Böyle bir dönüşüm yapmak isteyeceksiniz:

JavaScript ile:

document.getElementById(yourtarget).setAttribute("transform", "scale(2.0)");

CSS ile:

#yourtarget {
  transform:scale(2.0);
  -webkit-transform:scale(2.0);
}

SVG Sayfanızı bir Grup etiketine bu şekilde sarın ve tüm sayfayı değiştirmek için hedefleyin:

<svg>
  <g id="yourtarget">
    your svg page
  </g>
</svg>

Not : Ölçek 1.0% 100'dür


7
Tamam. Bu konuda JS istemiyorum. Ebeveyne uyum sağlamanın bir yolu var mı?
bjb568

@bj setAttribute, <tag attribute = "value"> ile aynı şeydir
john ktejik

17

Bu CSS'yi karıştırmak ve bu CSS'nin, konteynerin resimden daha büyük olduğu noktaya kadar Chrome tarayıcısında SVG içerdiği görülüyor:

div.inserted-svg-logo svg { max-width:100%; }

Ayrıca FF + IE 11'de çalışıyor gibi görünüyor.


Bu benim için sorunu çözdü. Ancak iOS'taki taşmayı görüyordum. Teşekkürler!
Evan Mattson

5
Her ikisini de kullanmak max-width: 100%ve max-height: 100%svg'yi en boy oranını taşmadan veya kaybetmeden her zaman kaba ölçeklendirir.
Gavin

2
@Gavin max-height: 100%benim için çalışmıyor, vhyerine kullanarak çözüldü%
Pavel

2

SVG dosyasını değiştirmek benim için adil bir çözüm değildi, bu yüzden göreceli CSS birimleri kullandım .

vh, vw, %Çok kullanışlı. height: 2.4vh;SVG görüntülerime dinamik bir boyut ayarlamak için CSS kullandım .



0

CurrentScale özniteliğini ayarlamak IE'de çalışır (IE 11 ile test ettim), ancak Chrome'da çalışmıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.