برش‌های شکل‌دار

ویژگی‌های وب: ماسک‌ها

نمای کلی

«ماسک‌گذاری CSS» به شما امکان می‌دهد عنصری را به شکل سفارشی برش دهید، مثلاً بریدگی به کارت اضافه کنید یا حاشیه شکل‌دار ایجاد کنید. هنگام ترکیب شکل‌ها برای چیدمان‌های پیچیده، استراتژی ماسک‌گذاری خود را براساس نوع محتوایی که عنصر دارد انتخاب کنید:

راهبرد ماسک‌گذاری بهترین برای تأثیر نوشتار
پوشاندن SVG عنصر مستقیم تصاویر، نمادها، شکل‌های تزئینی، شکل‌های پیچیده توصیه نمی‌شود (ممکن است نوشتار برش داده شود)
پوشاندن قالب SVG عنصر مجاور کارت‌های دارای نوشتار، محتوای مهم نوشتار کاملاً خوانا باقی می‌ماند
Pure CSS Gradients شکل‌های هندسی ساده توصیه نمی‌شود (ممکن است نوشتار برش داده شود)

پیاده‌سازی

برای پیاده‌سازی برش‌های شکل‌دار:

استفاده از ماسک SVG

ماسک‌های SVG به شما امکان می‌دهند شکل‌هایی را تعریف کنید که بااستفاده از پر کردن سفید (نمایان کردن) و سیاه (پنهان کردن) از ناحیه رؤیت‌پذیر کم یا به آن اضافه می‌کنند.

ماسک درخشندگی درمقابل ماسک آلفا: ماسک‌های SVG به‌طور پیش‌فرض در حالت درخشندگی (روشنایی) هستند، به همین دلیل است که از fill="white" برای آشکار کردن نواحی و از fill="black" برای برش دادن آن‌ها استفاده می‌کنیم. اگر ترجیح می‌دهید به‌جای رنگ‌ها از شفافیت SVG (کانال آلفا) استفاده کنید، می‌توانید mask-type: alpha; را در CSS یا mask-type="alpha" را در عنصر <mask> SVG تنظیم کنید.

پوشاندن مستقیم عنصر SVG

وقتی نوشتاری درون عنصر وجود ندارد که نگران آن باشید (مانند چهره‌واره‌های نمایه، تصاویر محصول، یا تصویرسازی‌ها)، می‌توانید ماسک SVG را مستقیماً روی عنصر اعمال کنید.

استفاده از maskContentUnits="objectBoundingBox" در ماسک SVG تضمین می‌کند که ماسک به‌طور خودکار با عرض و ارتفاع هر عنصری که روی آن اعمال می‌شود مقیاس‌بندی شود.

<!-- 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>

پوشاندن قالب SVG عنصر مجاور

ماسک را به‌جای عنصر ولی حاوی نوشتار، روی عنصر مجاور اعمال کنید. این کار تضمین می‌کند که نوشتار بریده نشود و خوانا باقی بماند.

برای حل این مشکل، عنصرتان را در چیدمانی دوقسمتی ساختاربندی کنید:

  1. ظرف نوشتاری ایمن و بدون ماسک (.card-body) برای همه محتواهای خواندنی.
  2. یک عنصر تزئینی خالی div (.card-accent) در کنار آن قرار داده شده است که ماسک SVG سفارشی را دریافت می‌کند.

با اختصاص دادن رنگ پس‌زمینه یکسان به هر دو بخش، آن‌ها به‌صورت بصری در یک مؤلفه با شکل سفارشی ادغام می‌شوند.

<!-- 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>

استفاده از یک گرادیان CSS برای برش‌های ساده

وقتی فقط به برش‌های هندسی ساده نیاز دارید (مانند بریدگی بالای نیم‌دایره، فرورفتگی‌های جانبی، یا برش‌های مورب مستقیم)، نیازی به نوشتن یا ارجاع به SVG خارجی ندارید. درعوض، می‌توانید گرادیان شعاعی یا خطی CSS را مستقیماً در ویژگی mask-image تعریف کنید.

<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>

راهبردهای جایگزین

اگر مرورگری از mask-image یا نسخه پیشوندی پشتیبانی نکند:

  • برای تصاویر شکل‌دار: عنصر به‌طور مناسبی تنزل پیدا می‌کند و به‌عنوان یک عنصر مستطیلی معمولی با سبک‌های جایگزین پیش‌فرض نمایش داده می‌شود.
  • برای کارت‌های شکل‌دار: عنصر تزئینی مجاور .card-accent به‌صورت مستطیل توپر و بدون ماسک باقی خواهد ماند. چون رنگ پس‌زمینه آن با ظرف نوشتار یکسان است، کل کارت به‌صورت یک ظرف مستطیلی استاندارد و تمیز نمایش داده می‌شود.
  • ارتقای پیش‌رو: با نگه داشتن لایه‌های نوشتار کاملاً خارج از ماسک، تضمین می‌شود که محتوایتان در مرورگرهای قدیمی‌تر کاملاً خوانا، ساختاریافته، و دردسترس باقی بماند.