खास जानकारी
सीएसएस मास्किंग की मदद से, किसी एलिमेंट को पसंद के मुताबिक आकार में क्लिप किया जा सकता है. जैसे, किसी कार्ड में नॉच जोड़ना या आकार वाला बॉर्डर बनाना. जटिल लेआउट के लिए आकृतियों को जोड़ते समय, एलिमेंट में मौजूद कॉन्टेंट के टाइप के आधार पर मास्किंग की रणनीति चुनें:
| मास्किंग की रणनीति | इनके लिए सर्वश्रेष्ठ: | टेक्स्ट इफ़ेक्ट |
|---|---|---|
| डायरेक्ट एलिमेंट एसवीजी मास्किंग | इमेज, आइकॉन, सजावटी आकार, जटिल आकार | इसका सुझाव नहीं दिया जाता, क्योंकि इससे टेक्स्ट कट सकता है |
| एक-दूसरे से सटे एलिमेंट की SVG मास्किंग | टेक्स्ट और ज़रूरी कॉन्टेंट वाले कार्ड | टेक्स्ट को पूरी तरह से पढ़ा जा सकता है |
| प्योर सीएसएस ग्रेडिएंट | सामान्य ज्यामितीय आकृतियां | इसका सुझाव नहीं दिया जाता (टेक्स्ट को काटा जा सकता है) |
लागू करना
शेप कटआउट लागू करने के लिए:
SVG मास्क का इस्तेमाल करना
एसवीजी मास्क की मदद से, ऐसे आकार तय किए जा सकते हैं जो सफ़ेद (दिखाएं) और काले (छिपाएं) रंग का इस्तेमाल करके, दिखने वाले हिस्से को घटाते या बढ़ाते हैं.
ल्यूमिनेंस बनाम ऐल्फ़ा मास्किंग: एसवीजी मास्क, डिफ़ॉल्ट रूप से ल्यूमिनेंस (चमक) मोड पर सेट होते हैं. इसलिए, हम हिस्सों को दिखाने के लिए
fill="white"और उन्हें हटाने के लिएfill="black"का इस्तेमाल करते हैं. अगर आपको रंगों के बजाय एसवीजी की पारदर्शिता (ऐल्फ़ा चैनल) का इस्तेमाल करना है, तो सीएसएस मेंmask-type: alpha;या एसवीजी<mask>एलिमेंट परmask-type="alpha"सेट करें.
डायरेक्ट एलिमेंट एसवीजी मास्किंग
जब एलिमेंट में कोई टेक्स्ट न हो, जैसे कि प्रोफ़ाइल अवतार, प्रॉडक्ट की इमेज या इलस्ट्रेशन, तो एसवीजी मास्क को सीधे एलिमेंट पर लागू किया जा सकता है.
एसवीजी मास्क में maskContentUnits="objectBoundingBox" का इस्तेमाल करने से, यह पक्का होता है कि मास्क उस एलिमेंट की चौड़ाई और ऊंचाई के हिसाब से अपने-आप अडजस्ट हो जाए जिस पर इसे लागू किया गया है.
<!-- 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>
सिंपल कटआउट के लिए, सिंगल सीएसएस ग्रेडिएंट का इस्तेमाल करना
जब आपको सिर्फ़ सामान्य ज्यामितीय कटआउट की ज़रूरत हो, जैसे कि सेमी-सर्कुलर टॉप नॉच, साइड इंडेंटेशन या सीधे डायगनल कट, तो आपको बाहरी SVG लिखने या उसका रेफ़रंस देने की ज़रूरत नहीं होती. इसके बजाय, 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एलिमेंट, एक सॉलिड और अनमास्क किया गया रेक्टैंगल बना रहेगा. टेक्स्ट कंटेनर और कार्ड का बैकग्राउंड कलर एक जैसा होने की वजह से, पूरा कार्ड एक स्टैंडर्ड और साफ़ रेक्टैंगल कंटेनर के तौर पर रेंडर होगा. - परतदार वृद्धि: टेक्स्ट लेयर को मास्क से पूरी तरह बाहर रखने पर, यह गारंटी मिलती है कि आपका कॉन्टेंट पुराने ब्राउज़र पर भी पूरी तरह से पढ़ा जा सकेगा, व्यवस्थित रहेगा, और ऐक्सेस किया जा सकेगा.