Menu

CSS Transform: translate, scale, skew ve transform-origin

transform özelliği bir elementi çevresindeki düzeni değiştirmeden taşır, ölçekler, döndürür ve eğer. Bütün transform fonksiyonlarını, fonksiyon sırasının neden önemli olduğunu, transform-origin'i, ayrı translate, scale ve rotate özelliklerini ve translate(-50%, -50%) ile ortalama hilesini öğren.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

transform ne yapar

transform bir elementin nasıl çizildiğini değiştirir: taşınmış, ölçeklenmiş, döndürülmüş ya da eğilmiş. Aşağıdaki kesikli çerçeveler, her kutunun transform olmadan nerede olacağını gösteriyor:

translate(20px, 10px) mavi kutuyu 20px ileri ve 10px aşağı taşır. scale(1.3) yeşil olanı merkezi etrafında %30 büyütür. rotate(20deg) kehribar rengi olanı saat yönünde döndürür, skewX(-20deg) ise koyu olanı eğer. Her durumda kesikli yuva, yani elementin düzende kapladığı alan, tam olarak olduğu yerde kalır.

Transform fonksiyonları

FonksiyonNe yaparÖrnek
translate(x, y)taşırtranslate(20px, -10px), translate(-50%, -50%)
translateX(x) / translateY(y)tek eksende taşırtranslateY(-4px)
scale(s) / scale(x, y)yeniden boyutlandırır (1 = orijinal, 0.5 = yarı, negatif aynalar)scale(1.1), scale(-1, 1)
scaleX(s) / scaleY(s)tek eksende yeniden boyutlandırırscaleX(0.5)
rotate(angle)saat yönünde döndürür (negatif = saat yönünün tersine)rotate(45deg), rotate(0.25turn)
skew(x, y) / skewX(a) / skewY(a)eğerskewX(-15deg)
matrix(a, b, c, d, e, f)yukarıdakilerin hepsi tek bir matriste, çoğunlukla tarayıcının geri bildirdiği şey
nonetransform yok

translate() içindeki yüzdeler ebeveynin değil, elementin kendi boyutuna göredir. Döndürmenin dereceler, turlar ve dönmeyle birlikte kendi sayfası var: CSS döndürme.

Transform oyun alanı

Kaydırıcıları hareket ettir. İlk satır oluşturduğun transform değeri, ikincisi tarayıcının ondan hesapladığı matris; getComputedStyle her transform için bunu döndürür:

Transform'lar düzeni kaydırmaz

Transform uygulanmış bir element başka bir yere çizilir, ama sayfa transform uygulanmamış gibi yerleştirilir. Komşuları konumlarını korur. Transform'ları hover efektleri ve animasyon için iyi yapan budur: çevrelerindeki hiçbir şey yeniden yerleşmez.

Ortadaki iki kutu da 1,5 kat büyük görünüyor. Ölçeklenen, komşularıyla çakışıyor ve C yerinde kalıyor; width ve height ile büyütülen ise C'yi 40px ileri itiyor.

Birden fazla transform ve sıraları

Birkaç fonksiyonu boşlukla ayırarak tek bir transform içine koy. Sıra sonucu değiştirir, çünkü soldan sağa okunduğunda her fonksiyon kendinden öncekilerin bıraktığı koordinat sisteminde çalışır:

Mavi kutu 120px dümdüz ilerledi ve sonra yerinde döndürüldü. Yeşil kutu önce döndürüldü, bu yüzden "x ekseni" çapraz gösteriyor ve translateX(120px) onu köşegen boyunca aşağı taşıyor. Aynı fonksiyonlar, farklı yer.

Diğer tuzak: ikinci bir transform bildirimi ilkinin yerini alır. Bir kartta transform: rotate(-2deg) varsa ve hover kuralı transform: scale(1.05) diyorsa, hover'da döndürme kaybolur. İkisini de tekrarla (rotate(-2deg) scale(1.05)) ya da aşağıdaki ayrı özellikleri kullan.

transform-origin

Ölçekleme, döndürme ve eğme varsayılan olarak merkez olan sabit bir noktanın, transform origin'in etrafında gerçekleşir. Onu anahtar kelimelerle, uzunluklarla ya da yüzdelerle değiştir:

Üç kutu da 25 derece dönüyor. İlki ortası üzerinde dönüyor, ikincisi sol üst köşesini yuvanın köşesine sabit tutuyor, üçüncüsü sağ alt köşesini. Butonundan büyüyerek açılan bir açılır menü scale() ile transform-origin: top kullanır.

translate, scale ve rotate özellikleri

Modern tarayıcılarda fonksiyonlarla aynı işi yapan ama bağımsız olarak ayarlanıp canlandırılabilen üç ayrı özellik de var:

.card {
  rotate: -2deg;
  transition: scale 0.2s ease-out;
}
.card:hover {
  scale: 1.05;   /* the rotation stays, because it is a different property */
}

Onları hangi sırada bildirirsen bildir, her zaman herhangi bir transform değerinin önünde transform: translate(...) rotate(...) scale(...) yazılmış gibi birleşirler. Söz dizimine dikkat et: translate: 10px 20px ve scale: 1.2 fonksiyon parantezleri olmadan değer alır.

translate(-50%, -50%) ile ortalamak

translate() yüzdeleri elementin kendi boyutuna göre olduğu için top: 50%; left: 50%; transform: translate(-50%, -50%), her boyuttaki absolute konumlu bir elementi ebeveyninde ortalar. Div ortalama sayfası bunu flexbox ve grid ile karşılaştırıyor.

Sık yapılan hatalar

  • İki transform bildirimi. Sonraki tamamen kazanır. Fonksiyonları birleştir ya da rotate, scale ve translate özelliklerini kullan.
  • Satır içi bir elemente transform uygulamak. Düz bir <span> ya da <a>, transform'u yok sayar. Onu inline-block yap.
  • Komşuların kaymasını beklemek. Transform'lar düzeni asla değiştirmez. Yer açmak için width, margin ya da gap değiştir.
  • Yanlış fonksiyon sırası. translate()'ten önce gelen rotate() döndürülmüş eksen boyunca taşır.
  • position: fixed çocuklarla sürprizler. Transform uygulanmış bir element, fixed konumlu torunları için kapsayıcı blok olur, bu yüzden içindeki sabit bir başlık onunla birlikte kayar. Ayrıca z-index için yeni bir stacking context oluşturur.

Sıkça Sorulan Sorular

CSS'te transform ne işe yarar?

Bir elementin nasıl çizildiğini değiştirir: taşınmış (translate), yeniden boyutlandırılmış (scale), döndürülmüş (rotate) ya da eğilmiş (skew). Element düzendeki orijinal yerini korur, bu yüzden çevresindeki elementler kıpırdamaz.

CSS'te birden fazla transform nasıl uygulanır?

Onları tek bir transform değerinde boşlukla ayırarak listele: transform: translateX(50px) rotate(20deg) scale(1.2);. İkinci bir transform bildirimi yazmak ilkine eklenmez, onun yerini alır.

transform fonksiyonlarının sırası önemli mi?

Evet. Soldan sağa okunduğunda her fonksiyon öncekilerin bıraktığı eksenlerde çalışır, bu yüzden rotate(45deg) translateX(100px) elementi döndürülmüş bir eksen boyunca taşır, translateX(100px) rotate(45deg) ise onu düz taşır ve sonra döndürür.

transform-origin nedir?

Ölçekleme, döndürme ve eğmenin etrafında gerçekleştiği sabit noktadır. Varsayılan merkezdir (50% 50%). transform-origin: top left bir elementin sol üst köşesinden büyümesini ya da onun etrafında dönmesini sağlar.

transform span'imde neden çalışmıyor?

Transform'lar düz bir <span> ya da <a> gibi değiştirilmemiş satır içi elementlere uygulanmaz. Elemente display: inline-block ya da block ver, transform çalışır.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA