סקירה כללית
התכונה "מסכת CSS" מאפשרת לחתוך רכיב לצורה מותאמת אישית, למשל להוסיף מגרעת לכרטיס או ליצור גבול בצורה מסוימת. כשמשלבים צורות לפריסות מורכבות, בוחרים את אסטרטגיית המיסוך לפי סוג התוכן שהרכיב מכיל:
| אסטרטגיית מיסוך | מתאים במיוחד עבור | השפעת הטקסט |
|---|---|---|
| מסכת 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 Gradient יחיד לחיתוכים פשוטים
אם אתם צריכים רק חיתוכים גיאומטריים פשוטים (כמו חריץ עליון חצי עגול, שקעים בצדדים או חיתוכים אלכסוניים ישרים), אתם לא צריכים לכתוב או להפנות לקובץ 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יישאר מלבן מלא, ללא מסכה. מכיוון שצבע הרקע של הכרטיס זהה לצבע הרקע של מאגר הטקסט, הכרטיס כולו יוצג כמאגר מלבני רגיל ונקי. - שיפור הדרגתי (progressive enhancement): אם תשאירו את שכבות הטקסט מחוץ למסכה, התוכן שלכם יישאר קריא, מובנה ונגיש לחלוטין בדפדפנים ישנים יותר.