SASS'ta Kalıtım
Bu makale SASS'taki kalıtımı açıklar.
SASS'taki kalıtımı pratik örneklerle açıklayacağız.
YouTube Video
SASS'ta Kalıtım
SASS'ta kalıtım (@extend), bir seçicinin stillerini çoğaltmadan başka bir seçiciye uygulamanızı sağlayan bir mekanizmadır. Aynı stiller markup'ta birden fazla öğe için 'birleştirildiği' ve çıktısı alındığı için, oluşan CSS gereksiz tekrar içermez; ancak yanlış kullanıldığında, istenmeyen seçici birleşmelerine yol açabilir.
Temeller: @extend Nasıl Kullanılır
Aşağıda .btn--primary'nin .btn'in stillerini miras aldığı temel bir örnek bulunmaktadır. @extend, hedef seçiciyi genişleten bir direktiftir.
1// Base button styles
2.btn {
3 padding: 0.5rem 1rem;
4 border-radius: 4px;
5 border: 1px solid #ccc;
6 background: white;
7 color: #333;
8}
9
10/* Primary button extends the base .btn */
11.btn--primary {
12 @extend .btn;
13 background: #007bff;
14 color: white;
15}@extendkullanarak,.btn--primarytemel.btnstillerini miras alır ve sadece gerekli yerleri geçersiz kılar.
Oluşan CSS
1.btn, .btn--primary {
2 padding: 0.5rem 1rem;
3 border-radius: 4px;
4 border: 1px solid #ccc;
5 background: white;
6 color: #333;
7}
8
9.btn--primary {
10 background: #007bff;
11 color: white;
12}En İyi Uygulama: Placeholder (%placeholder) Kullanımı
Yer tutucu seçiciler (%name), CSS'ye çıktılanmayan seçicilerdir. Özellikle birden fazla bileşen arasında yalnızca kalıtım için ortak stilleri güvenli bir şekilde paylaşmak istediğinizde yaygın olarak kullanılırlar.
1// %placeholder will not be output directly
2%card-base {
3 padding: 1rem;
4 border-radius: 6px;
5 box-shadow: 0 1px 3px rgba(0,0,0,0.08);
6 background: #fff;
7}
8
9/* Components extend the placeholder */
10.card {
11 @extend %card-base;
12 border: 1px solid #eee;
13}
14
15.panel {
16 @extend %card-base;
17 border: 1px solid #ddd;
18}.cardve.panelher ikisi de%card-base'den miras alır ve bu sayede ortak stilleri paylaşırken gerektiğinde farklılıklar ekleyebilirler.
Oluşan CSS
1.card, .panel {
2 padding: 1rem;
3 border-radius: 6px;
4 box-shadow: 0 1px 3px rgba(0,0,0,0.08);
5 background: #fff;
6}
7
8.card {
9 border: 1px solid #eee;
10}
11
12.panel {
13 border: 1px solid #ddd;
14}Çoklu Kalıtım (Birden Fazla @extend)
Aynı anda birden fazla placeholder veya sınıf miras alabilirsiniz. Stil tekrar kullanılabilirliği artarken, hangi kuralların hangi seçicilerle birleştirildiğini takip etmek önemlidir.
1%btn-base {
2 display: inline-block;
3 padding: 0.5rem 1rem;
4 border-radius: 3px;
5}
6
7%btn-large {
8 padding: 0.75rem 1.5rem;
9 font-size: 1.125rem;
10}
11
12/* Composite button that extends both placeholders */
13.btn--lg {
14 @extend %btn-base;
15 @extend %btn-large;
16 background: #222;
17 color: #fff;
18}- Bu örnekte bir buton, biri 'base' biri 'size' için olmak üzere iki placeholder miras alıyor.
.btn--lg, hem%btn-basehem de%btn-large'ı miras alır ve temel yerleşimi daha büyük boyutla birleştirir.
Oluşan CSS
1.btn--lg {
2 display: inline-block;
3 /* %btn-large overrides the padding from %btn-base */
4 padding: 0.75rem 1.5rem;
5 border-radius: 3px;
6 font-size: 1.125rem;
7 background: #222;
8 color: #fff;
9}@extend Davranışı (Birleştirme Mekanizması) ve 'Seçici Patlaması' Hakkında Uyarılar
@extend, tüm eşleşen seçicileri birleştirerek çıktılar ve bu, bazen istenmeyen seçici birleşimlerine yol açabilir.
Aşağıdaki örnek, aynı temel sınıf birden fazla yerde genişletildiğinde çıktının nasıl artabileceğini gösterir.
1/* Many components extend .utility */
2/* A generic utility class */
3.utility {
4 margin-bottom: 1rem;
5}
6
7/* Nested selectors that extend .utility */
8.header {
9 @extend .utility;
10 .title {
11 font-weight: bold;
12 }
13}
14
15.footer {
16 @extend .utility;
17 .note {
18 color: #888;
19 }
20}
21
22.article {
23 @extend .utility;
24 .content {
25 line-height: 1.6;
26 }
27}
28
29.sidebar {
30 @extend .utility;
31 .section {
32 padding: 1rem;
33 }
34}- Birden fazla bileşen
.utility'yi miras aldığında, seçiciler birleştirilir ve bu, özellikle büyük projelerde CSS'in şişmesine neden olabilir.
Oluşan CSS
1.utility,
2.header,
3.footer,
4.article,
5.sidebar {
6 margin-bottom: 1rem;
7}
8
9.header .title {
10 font-weight: bold;
11}
12
13.footer .note {
14 color: #888;
15}
16
17.article .content {
18 line-height: 1.6;
19}
20
21.sidebar .section {
22 padding: 1rem;
23}@extend ile .class ve Eleman Seçiciler (Etiketler) — Öncelik ve Yan Etkiler
@extend yalnızca sınıflara değil, aynı zamanda eleman seçicilerine de uygulanabilir. Ancak, elemanları genişletmek etkilenen kapsamı artırır ve kuralların istenmeyen yerlerde farkında olmadan uygulanma riskini yükseltir.
Aşağıda bir eleman seçiciyi genişletmenin ve bunun yol açabileceği etkinin bir örneği var.
1/* Extending an element selector (not recommended) */
2h1 {
3 font-size: 2rem;
4 margin-bottom: 0.5rem;
5}
6
7/* If you extend h1, the resulting selector will include your class with h1 */
8.title {
9 @extend h1;
10 color: #333;
11}
12
13/* Output becomes:
14h1, .title { font-size: 2rem; margin-bottom: 0.5rem; }
15*/- Bu örnekte, eleman seçici
h1'in miras alınması,.title'ınh1ile aynı stillerle birleştirilmesine yol açar. - Küçük ölçekli durumlarda kullanışlı gibi görünse de, projeniz büyüdükçe
h1için olan kurallar beklenmedik şekilde.titleile birleşebilir ve bu da stilleri daha karmaşık hale getirip bakımını zorlaştırır. Bu nedenle, stilleri öncelikle sınıflar ve yer tutucular etrafında tasarlamak onların bakımını kolaylaştırır.
Oluşan CSS
1h1,
2.title {
3 font-size: 2rem;
4 margin-bottom: 0.5rem;
5}
6
7.title {
8 color: #333;
9}@extend ve !optional Kullanım Durumları
@extend ile birlikte !optional belirtirseniz, kalıtım hedefi mevcut olmadığında hataları engelleyebilirsiniz. Bu, özellikle kütüphane benzeri kodlarda veya yer tutucuların koşullu olarak tanımlandığı durumlarda faydalıdır.
Aşağıda, var olmayabilecek bir sınıfı !optional ile güvenli şekilde miras alma denemesinin bir örneği vardır.
1/* Try to extend a class that might not exist */
2.component {
3 @extend .maybe-existing !optional;
4 padding: 1rem;
5}- Eğer
.maybe-existingyoksa bir şey olmaz ve atlanır. Bir genişletmeyi güvenli şekilde denemek istediğinizde bunu kullanabilirsiniz.
Oluşan CSS
1.component {
2 padding: 1rem;
3}@extend ve Mixins (@mixin / @include) Karşılaştırması
@extend ve @mixin bazen benzer amaçlara sahip olabilir fakat çıktı ve kullanım durumları farklıdır.
-
@extend- Oluşan CSS, seçicileri birleştirerek tekrarı azaltır.
- Seçiciler çıktı alındıktan sonra birleştirildiği için, istenmeyen birleşimler oluşabilir.
- Parametreler aktarılamaz (ama bu eksiklik, placeholder'ların birleştirilmesiyle telafi edilebilir).
-
@mixin/@include- Her çağrı stilleri çoğaltır (gereksiz çıktıya neden olur).
- Parametre gönderebilir ve şart veya döngü gibi mantık ekleyebilirsiniz.
- Çıktı daha öngörülebilirdir, ancak dosya boyutu büyür.
Aşağıda aynı buton stilini hem @mixin hem de @extend kullanarak karşılaştırma örneği verilmiştir.
1/* Mixin approach */
2@mixin btn-styles($bg, $color) {
3 display: inline-block;
4 padding: 0.5rem 1rem;
5 background: $bg;
6 color: $color;
7 border-radius: 4px;
8}
9
10/* Use mixin */
11.btn {
12 @include btn-styles(white, #333);
13}
14
15.btn--primary {
16 @include btn-styles(#007bff, white);
17}
18
19/* Extend approach (shared placeholder) */
20%btn-base {
21 display: inline-block;
22 padding: 0.5rem 1rem;
23 border-radius: 4px;
24}
25
26.btn2 {
27 @extend %btn-base;
28 background: white;
29 color: #333;
30}
31
32.btn2--primary {
33 @extend %btn-base;
34 background: #007bff;
35 color: white;
36}@mixinstilleri esnek şekilde eklemenizi sağlarken,@extendçıktıyı verimli şekilde birleştirir; böylece kullanım durumuna göre uygun olanı seçebilirsiniz.
Oluşan CSS
@mixin'den Çıktı
1.btn {
2 display: inline-block;
3 padding: 0.5rem 1rem;
4 background: white;
5 color: #333;
6 border-radius: 4px;
7}
8
9.btn--primary {
10 display: inline-block;
11 padding: 0.5rem 1rem;
12 background: #007bff;
13 color: white;
14 border-radius: 4px;
15}@extend'den Çıktı
1.btn2,
2.btn2--primary {
3 display: inline-block;
4 padding: 0.5rem 1rem;
5 border-radius: 4px;
6}
7
8.btn2 {
9 background: white;
10 color: #333;
11}
12
13.btn2--primary {
14 background: #007bff;
15 color: white;
16}Uygulamalı Rehber
SASS kalıtımı, stil tekrar kullanılabilirliğini artırmak için güçlü bir özelliktir. Ancak yanlış kullanım, stil birleştirmeyi karmaşık hale getirip sürdürülebilirliği azaltabilir. Aşağıda kalıtımı güvenli ve verimli bir şekilde kullanmak için önemli noktalar verilmiştir.
- Yalnızca yapı ve düzen gibi tamamen ortak bileşen stilleri için yer tutucular kullanın. Ayrıca, dinamik parametreleştirme gerekiyorsa,
@mixinkullanabilirsiniz. h1gibi HTML elemanlarını doğrudan miras almaktan kaçınmalısınız. İstenmeyen seçici kombinasyonları meydana gelebilir ve bu da beklenmedik CSS'nin oluşturulmasına neden olabilir.- BEM gibi adlandırma kuralları veya net ön ekler kullanmak, her placeholder'ın ne için olduğunu göstermek ve güvenliği korumak açısından yararlıdır.
@extend'i aynı dosya içinde kullanmak daha güvenlidir. Özellikle büyük projelerde, kalıtım ilişkilerini takip etmeyi kolaylaştırmak için kalıtımı her bileşenin kapsamı içinde tasarlamak tavsiye edilir.
Özet
SASS'taki @extend özelliği, ortak stilleri verimli bir şekilde tekrar kullanmak ve tasarım tutarlılığını sağlamak için kullanışlı bir yöntemdir. Ancak, seçici kombinasyonları kolayca karmaşık hale gelebileceğinden, bu özelliğin dikkatli ve sınırlı bir kapsamda kullanılması gereklidir. Ortak stilleri yer tutucu seçiciler (%placeholder) ile gruplandırarak ve dinamik parametre gerektiren bölümler için @mixin kullanarak, basit ve bakım kolay tasarımlar oluşturabilirsiniz.
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.