نظرة عامة
يتيح لك CSS Masking اقتصاص عنصر إلى شكل مخصّص، مثل إضافة نتوء إلى بطاقة أو إنشاء حدود على شكل معيّن. عند دمج الأشكال لإنشاء تصاميم معقّدة، اختَر استراتيجية القناع استنادًا إلى نوع المحتوى الذي يتضمّنه العنصر:
| استراتيجية الإخفاء | متوافق مع: | Text Impact |
|---|---|---|
| قناع SVG للعنصر المباشر | الصور والرموز والأشكال الزخرفية والأشكال المعقّدة | لا يُنصح به (يمكن اقتصاص النص) |
| إخفاء عناصر SVG المجاورة | بطاقات تحتوي على نص ومحتوى مهم | يظل النص قابلاً للقراءة بالكامل |
| تدرّجات CSS خالصة | أشكال هندسية بسيطة | لا يُنصح به (يمكن اقتصاص النص) |
التنفيذ
لتطبيق ملامح الوجه العائمة:
استخدام قناع SVG
تتيح لك أقنعة SVG تحديد الأشكال التي يتم طرحها من المنطقة المرئية أو إضافتها إليها باستخدام التعبئة باللون الأبيض (إظهار) والأسود (إخفاء).
الفرق بين قناع الإضاءة وقناع ألفا: يتم ضبط أقنعة SVG تلقائيًا على وضع الإضاءة (السطوع)، ولهذا السبب نستخدم اللون
fill="white"لإظهار المناطق واللونfill="black"لإخفائها. إذا كنت تفضّل استخدام شفافية SVG (قناة ألفا) بدلاً من الألوان، يمكنك ضبطmask-type: alpha;في CSS أوmask-type="alpha"على عنصر SVG<mask>.
قناع 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 المجاورة
طبِّق القناع على عنصر مجاور بدلاً من العنصر الرئيسي الذي يحتوي على نص. يضمن ذلك عدم اقتصاص النص وبقاءه قابلاً للقراءة.
لحلّ هذه المشكلة، يمكنك تنظيم المكوّن في تنسيق من جزأين:
- حاوية نصية آمنة وغير مخفية (
.card-body) لجميع المحتوى القابل للقراءة - عنصر
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الزخرفي المجاور مستطيلاً صلبًا غير مقنّع. بما أنّها تتشارك لون الخلفية نفسه مع حاوية النص، ستظهر البطاقة بأكملها كحاوية مستطيلة عادية وواضحة. - التحسين التدريجي: من خلال إبقاء طبقات النص خارج القناع بالكامل، نضمن لك أن يظل المحتوى قابلاً للقراءة ومنظّمًا ويمكن الوصول إليه بالكامل على المتصفحات القديمة.