Genel Bakış
CSS maskeleme, bir öğeyi özel bir şekle kırpmanıza olanak tanır. Örneğin, bir karta çentik ekleyebilir veya şekilli bir kenarlık oluşturabilirsiniz. Karmaşık düzenler için şekilleri birleştirirken maskeleme stratejinizi öğenin içerdiği içerik türüne göre seçin:
| Maskeleme stratejisi | En Uygun Olduğu Durumlar | Metin Etkisi |
|---|---|---|
| Doğrudan öğe SVG maskeleme | Görseller, simgeler, dekoratif şekiller, karmaşık şekiller | Önerilmez (metni kırpabilir) |
| Bitişik Öğe SVG Maskeleme | Metin içeren kartlar, Önemli içerik | Metin tamamen okunabilir durumda kalır. |
| Saf CSS Gradyanları | Basit Geometrik Şekiller | Önerilmez (metni kırpabilir) |
Uygulama
Şekilli kesitleri uygulamak için:
SVG maskesi kullanma
SVG maskeleri, beyaz (göster) ve siyah (gizle) dolgular kullanarak görünür alandan çıkarılan veya bu alana eklenen şekiller tanımlamanıza olanak tanır.
Parlaklık ve Alfa Maskeleme Karşılaştırması: SVG maskeleri varsayılan olarak parlaklık moduna ayarlanır. Bu nedenle, alanları göstermek için
fill="white", kesmek için isefill="black"kullanırız. Renkler yerine SVG'nin şeffaflığını (alfa kanalı) kullanmayı tercih ederseniz CSS'demask-type: alpha;veya SVG<mask>öğesindemask-type="alpha"değerini ayarlayabilirsiniz.
Doğrudan öğe SVG maskeleme
Öğenin içinde endişelenecek bir metin olmadığında (ör. profil avatarları, ürün resimleri veya illüstrasyonlar) SVG maskesini doğrudan öğeye uygulayabilirsiniz.
SVG maskesinde maskContentUnits="objectBoundingBox" kullanıldığında maske, uygulandığı öğenin genişliğine ve yüksekliğine göre otomatik olarak ölçeklendirilir.
<!-- 1. Define the mask in SVG (hidden from view) -->
<svg width="0" height="0" style="position: absolute;" aria-hidden="true">
<defs>
<!-- objectBoundingBox makes the mask scale from 0 to 1 along the element's borders -->
<mask id="splat-mask" maskContentUnits="objectBoundingBox">
<!-- Organic Bezier path defining an artistic paint splat shape -->
<path d="M 0.5 0.05 C 0.58 0.05, 0.58 0.21, 0.67 0.18 C 0.76 0.15, 0.79 0.08, 0.85 0.15 C 0.91 0.22, 0.83 0.32, 0.89 0.38 C 0.95 0.44, 1.03 0.45, 0.99 0.55 C 0.95 0.65, 0.82 0.62, 0.8 0.72 C 0.78 0.82, 0.89 0.92, 0.8 0.97 C 0.71 1.02, 0.64 0.88, 0.55 0.93 C 0.46 0.98, 0.44 1.06, 0.35 1.01 C 0.26 0.96, 0.31 0.81, 0.22 0.79 C 0.13 0.77, 0.01 0.88, 0.01 0.77 C 0.01 0.66, 0.16 0.62, 0.14 0.52 C 0.12 0.42, -0.02 0.39, 0.03 0.29 C 0.08 0.19, 0.23 0.27, 0.29 0.19 C 0.35 0.11, 0.3 0.01, 0.4 0.01 C 0.5 0.01, 0.42 0.05, 0.5 0.05 Z" fill="white" />
</mask>
</defs>
</svg>
<!-- 2. Apply the mask to the image element -->
<img src="avatar.jpg" alt="User Profile" class="shaped-avatar">
<style>
.shaped-avatar {
width: 200px;
height: 200px;
object-fit: cover;
/* Apply the SVG mask ID with standard and webkit-prefixed properties */
-webkit-mask-image: url(#splat-mask);
mask-image: url(#splat-mask);
}
</style>
Bitişik Öğe SVG Maskeleme
Maskeyi, metin içeren üst öğe yerine bitişik bir öğeye uygulayın. Bu sayede metin kırpılmaz ve okunabilir kalır.
Bu sorunu çözmek için bileşeninizi iki bölümlü bir düzende yapılandırın:
- Tüm okunabilir içerikler için güvenli, maskelenmemiş bir metin kapsayıcısı (
.card-body). - Yanına yerleştirilen ve özel SVG maskesini alan boş bir dekoratif
div(.card-accent).
Her iki parçaya da aynı arka plan rengini atayarak bunları görsel olarak özel şekilli tek bir bileşende birleştirebilirsiniz.
<!-- 1. Define the SVG mask (hidden from view) -->
<svg width="0" height="0" style="position: absolute;" aria-hidden="true">
<defs>
<!-- Use objectBoundingBox to make the mask scale with the element -->
<mask id="accent-stencil" maskContentUnits="objectBoundingBox">
<!-- Fill the entire area with white (fully visible) -->
<rect width="1" height="1" fill="white" />
<!-- Draw a black shape to cut out a concave curve. Extending the path to x=1.1 guarantees it fully clears the right edge, preventing subpixel lines -->
<path d="M 1.1,0 C 0.4,0.1 0.4,0.9 1.1,1 L 1.1,0 Z" fill="black" />
</mask>
</defs>
</svg>
<!-- 2. Create the unified card layout -->
<div class="unified-card">
<!-- The text-bearing element remains unmasked and perfectly rectangular -->
<div class="card-body">
<h3>Premium Membership</h3>
<p>Get exclusive weekly updates on modern web standards and premium UI designs.</p>
</div>
<!-- The empty accent element next to it is masked to form the custom shape -->
<div class="card-accent"></div>
</div>
<style>
.unified-card {
display: flex;
width: 400px;
}
.card-body {
flex: 1;
background-color: #1e293b; /* Elegant slate color */
color: #f8fafc;
padding: 24px;
border-top-left-radius: 16px;
border-bottom-left-radius: 16px;
}
.card-accent {
width: 60px;
background-color: #1e293b; /* Same background color so they merge visually without seams */
border-top-right-radius: 16px;
border-bottom-right-radius: 16px;
/* Reference the SVG mask */
-webkit-mask-image: url(#card-accent-mask);
mask-image: url(#card-accent-mask);
}
</style>
Basit Kesikler İçin Tek Bir CSS Gradyanı Kullanma
Yalnızca basit geometrik kesimlere (ör. yarım daire şeklinde üst çentik, yan girintiler veya düz çapraz kesimler) ihtiyacınız olduğunda harici bir SVG yazmanız veya referans vermeniz gerekmez. Bunun yerine, doğrudan mask-image özelliğinin içinde bir CSS radyal veya doğrusal renk geçişi tanımlayabilirsiniz.
<div class="gradient-masked-card">
<h3>Notched Coupon Card</h3>
<p>This card uses a pure CSS radial gradient to cut out a semi-circular notch along its top edge.</p>
</div>
<style>
.gradient-masked-card {
background: linear-gradient(135deg, #3b82f6, #1d4ed8);
color: white;
padding: 40px 24px 24px 24px; /* Extra top padding ensures content clears the notch */
border-radius: 16px;
text-align: center;
/* radial-gradient places a circle at 50% (horizontal center) and 0% (top edge), cutting out a 20px transparent notch */
-webkit-mask-image: radial-gradient(circle at 50% 0%, transparent 20px, black 21px);
mask-image: radial-gradient(circle at 50% 0%, transparent 20px, black 21px);
}
</style>
Yedek stratejiler
Tarayıcı mask-image veya ön ekli sürümü desteklemiyorsa:
- Şekilli resimler için: Öğe, varsayılan yedek stilleriyle normal bir dikdörtgen öğe olarak gösterilerek düzgün bir şekilde bozulur.
- Şekilli kartlar için: Bitişik dekoratif
.card-accentöğesi, düz ve maskelenmemiş bir dikdörtgen olarak kalır. Metin kapsayıcısıyla aynı arka plan rengini paylaştığı için kartın tamamı standart, temiz bir dikdörtgen kapsayıcı olarak oluşturulur. - Progresif geliştirme: Metin katmanlarını tamamen maskenin dışında tutarak içeriğinizin eski tarayıcılarda tamamen okunabilir, yapılandırılmış ve erişilebilir kalmasını sağlayabilirsiniz.