Şekilli Kesimler

Web özellikleri: Maskeler

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 ise fill="black" kullanırız. Renkler yerine SVG'nin şeffaflığını (alfa kanalı) kullanmayı tercih ederseniz CSS'de mask-type: alpha; veya SVG <mask> öğesinde mask-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:

  1. Tüm okunabilir içerikler için güvenli, maskelenmemiş bir metin kapsayıcısı (.card-body).
  2. 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.