SASS-এ মিক্সইনসমূহ
এই নিবন্ধে SASS-এ মিক্সইনসমূহ ব্যাখ্যা করা হয়েছে।
আমরা SASS-এ মিক্সইনসমূহ ব্যবহারিক উদাহরণ দিয়ে ব্যাখ্যা করব।
YouTube Video
SASS-এ মিক্সইনসমূহ
পর্যালোচনা – মিক্সইন কী?
মিক্সিন হচ্ছে একটি পদ্ধতি যা আপনাকে সাধারণত ব্যবহৃত স্টাইল প্রোপার্টির সেটগুলো পুনরায় ব্যবহারযোগ্য ফাংশন হিসেবে সংজ্ঞায়িত করতে দেয়, যেগুলো আপনি প্রয়োজনে যেকোনো জায়গায় কল করতে পারেন। আপনার CSS ক্লাস ও একাধিক প্রোপার্টিকে DRY (Don't Repeat Yourself) রাখার জন্য এগুলো খুবই কার্যকর।
উদাহরণ: সবচেয়ে সহজ মিক্সইন
নিম্নে একটি সহজ মিক্সইনের উদাহরণ রয়েছে, যেখানে border-radius ও box-shadow একসঙ্গে পুনরায় ব্যবহার করা হয়েছে। এই মিক্সইন ডাকার মাধ্যমে আপনি একাধিক এলিমেন্টে একই স্টাইল প্রয়োগ করতে পারবেন।
1// Simple mixin that applies border-radius and box-shadow
2@mixin card-style {
3 border-radius: 8px;
4 box-shadow: 0 4px 10px rgba(0, 0, 0, 0.12);
5 background: #fff;
6}
7
8.card {
9 @include card-style;
10 padding: 1rem;
11}- এই মিক্সইন ব্যবহারে একই স্টাইল বারবার পুনরাবৃত্তি করার প্রয়োজন নেই।
- এটি ব্যবহার করতে শুধু একটি লাইন লিখলেই যথেষ্ট:
@include card-style;।
আর্গুমেন্ট (প্যারামিটার) সহ মিক্সইন
ফাংশনের মতো মিক্সইনও আর্গুমেন্ট নিতে পারে। এটির মাধ্যমে আপনি একই লজিক ব্যবহার করে স্টাইল পরিবর্তন করতে পারবেন। পরবর্তী উদাহরণে কালারকে আর্গুমেন্ট হিসাবে নেওয়া হয়েছে।
1// Mixin with parameters: accepts a color and optional radius
2@mixin colored-box($bg-color, $radius: 4px) {
3 background-color: $bg-color;
4 border-radius: $radius;
5 padding: 0.75rem;
6}
7
8.box-primary {
9 @include colored-box(#007acc);
10}
11
12.box-custom {
13 @include colored-box(#ffcc00, 12px);
14}- ডিফল্ট ভ্যালু নির্ধারণের মাধ্যমে আর্গুমেন্ট বাদ দিলে স্টাইল কেমন হবে তা নিয়ন্ত্রণ করা যায়।
- এই উদাহরণে ডিফল্ট রেডিয়াস ব্যবহৃত হয়েছে এবং শুধু ব্যাকগ্রাউন্ড কালার ওভাররাইড করা হয়েছে।
যেসব ক্ষেত্রে ভ্যারিয়াডিক আর্গুমেন্ট (...) ব্যবহৃত হয়
যখন একাধিক মান নিতে চান, তখন variadic argument ($args...) ব্যবহার করতে পারেন। এটি ইউটিলিটি ক্লাস তৈরি বা fallback লিস্ট পাঠাতে উপযোগী।
একাধিক ফন্ট ফ্যামিলি বা একাধিক শ্যাডো ভ্যালু পাঠাতে হলে এটি বেশ উপকারী।
1// Mixin that accepts variable arguments and forwards them to box-shadow
2@mixin multi-shadow($shadows...) {
3 box-shadow: $shadows;
4}
5
6.panel {
7 @include multi-shadow(0 2px 4px rgba(0,0,0,0.08), 0 8px 16px rgba(0,0,0,0.06));
8}- ডাকানোর সময় কমা দিয়ে একাধিক শ্যাডো ভ্যালু নির্ধারণ করা যায়।
- এভাবে একই মিক্সইন দিয়ে সহজ ও জটিল উভয় ধরনের শ্যাডো ব্যবহার করা যায়।
@content সহ মিক্সইন — একটি ব্লক গ্রহণ
@content ব্যবহারে মিক্সইন কলারের কাছ থেকে স্টাইল ব্লক গ্রহণ করতে পারে। এর ফলে মিক্সইন কমন wrapper দিতে পারে, এবং কলার ভিতরের বিস্তারিত নির্ধারণ করতে পারে।
1// Mixin that sets up a responsive container and yields to caller via @content
2@mixin responsive-container($max-width: 1200px) {
3 margin-left: auto;
4 margin-right: auto;
5 padding-left: 1rem;
6 padding-right: 1rem;
7 max-width: $max-width;
8
9 @content; // place where caller's styles are inserted
10}
11
12.header {
13 @include responsive-container(1000px) {
14 display: flex;
15 align-items: center;
16 justify-content: space-between;
17 }
18}- কোড ডাকার সময়
@include-এর মধ্যে একটি ব্লক যুক্ত করে ভিতরের স্টাইল নির্ধারণ করা যায়। - এই প্যাটার্ন গ্রিড, কার্ড, ও ফরম-এর মতো লেআউট wrapper-এ বিশেষ উপযোগী।
শর্ত (conditionals) ও লুপ ব্যবহার করে উন্নত মিক্সইন
@if এবং @for-এর মতো কন্ট্রোল স্ট্রাকচার মিক্সইনের ভিতরে ব্যবহার করা যায়। এগুলো মাধ্যমে ইউটিলিটি অটোমেটেডভাবে বানানো ও রেসপন্সিভ সেটিংস গ্রুপ করা যায়।
নিচে ইউটিলিটি ক্লাসের প্রস্থ (width) স্বয়ংক্রিয়ভাবে তৈরি করার একটি উদাহরণ রয়েছে।
1@use 'sass:math';
2
3// Mixin that generates width utility classes from a list of fractions
4@mixin generate-widths($fractions) {
5 @each $name, $fraction in $fractions {
6 .w-#{$name} {
7 width: math.percentage($fraction);
8 }
9 }
10}
11
12$widths: (
13 '1-4': 0.25,
14 '1-3': 0.3333,
15 '1-2': 0.5,
16 '3-4': 0.75
17);
18
19@include generate-widths($widths);- আপনি কেবল যে ভগ্নাংশগুলো তৈরি করতে চান তার একটি ম্যাপ কল করার সময় দিলে, একসাথে স্বয়ংক্রিয়ভাবে সংশ্লিষ্ট ইউটিলিটি ক্লাসগুলো তৈরি করা যাবে।
- এই উপায় ব্যবহার করার ফলে আপনার ডিজাইনের সামঞ্জস্য বজায় রেখে ম্যানুয়াল স্টাইল সংজ্ঞা কমিয়ে ফেলার সুবিধা পাওয়া যায়।
মিক্সইন বনাম প্লেসহোল্ডার (%placeholder)
মিক্সিন সরাসরি প্রোপার্টির একটি সেট যোগ করে, অপরদিকে প্লেসহোল্ডারগুলো স্টাইল উত্তরাধিকার করার সময় @extend এর সাথে ব্যবহৃত হয়। কিছু ক্ষেত্রে মিক্সিন ব্যবহারে ডুপ্লিকেট CSS তৈরি হতে পারে, কিন্তু নির্দিষ্ট পরিস্থিতিতে @extend আরও সংকুচিত CSS তৈরি করতে সক্ষম।
প্রতিটি পদ্ধতিতে তৈরি হওয়া CSS-এর উদ্দেশ্য ও পার্থক্য বুঝে আপনি সবচেয়ে উপযুক্ত পদ্ধতি বেছে নিতে পারবেন।
1// Placeholder example (for comparison)
2%btn-base {
3 display: inline-block;
4 padding: 0.5rem 1rem;
5 border-radius: 4px;
6}
7
8.btn-primary {
9 @extend %btn-base;
10 background: #007acc;
11 color: #fff;
12}
13
14.btn-secondary {
15 @extend %btn-base;
16 background: #e0e0e0;
17}@extendব্যবহার করে কোনো প্লেসহোল্ডার এক্সটেন্ড করলে বহু সিলেক্টর একটি নিয়মের মধ্যে একত্রিত করা যায়, ফলে CSS আরও সংকুচিত হয়।- অন্যদিকে, মিক্সিন প্রয়োজনে সরাসরি প্রোপার্টি যোগ করায় সেগুলো নমনীয়তা দেয় এবং অপ্রত্যাশিত সিলেক্টর মার্জিং এড়াতে সাহায্য করে।
সাধারণ ব্যবহারিক প্যাটার্ন (রেসপন্সিভ, ভেন্ডর প্রিফিক্স ইত্যাদি)
বাস্তবে, ভেন্ডর প্রিফিক্স বা রেসপন্সিভ ফিচারের মতো সাধারণ প্রসেসিং মিক্সইনে রাখা সুবিধাজনক। নিম্নে transform এবং prefix প্রপার্টি মিলিয়ে একটি উদাহরণ দেওয়া হয়েছে। ব্রাউজার কম্প্যাটিবিলিটির কোড একত্রিত করা যায়, ফলে রক্ষণাবেক্ষণ সহজ হয়।
1// Mixin for transform with vendor prefixes
2@mixin transform($value) {
3 -webkit-transform: $value;
4 -ms-transform: $value;
5 transform: $value;
6}
7
8.icon-rotate {
9 @include transform(rotate(45deg));
10}- এটি ব্যবহার করা সহজ এবং আপনি যেকোনো জায়গায় ব্যবহার করতে পারেন, যেমন
@include transform(rotate(10deg));। - ভবিষ্যতে যদি প্রিফিক্স অপ্রয়োজনীয় হয়ে যায়, তবুও শুধুমাত্র মিক্সিন আপডেট করলেই পুরো কোডবেসে নতুন পরিবর্তন প্রতিফলিত হবে বলে রক্ষণাবেক্ষণ সহজ হয়।
বাস্তব উদাহরণ: কার্ড এবং বোতাম একত্রিত
নীচে একটি উদাহরণ দেওয়া হলো যেখানে কার্ডে ব্যবহৃত বোতামের স্টাইলগুলি একটি মিক্সইনের মাধ্যমে একত্রিত করা হয়েছে, ফলে সেগুলি থিমের রঙ অনুযায়ী পরিবর্তন করা যায়।
এটি সাধারণত ব্যবহৃত 'কার্ড + বোতাম' প্যাটার্ন মিক্সইন ব্যবহার করে গুছিয়ে ফেলা যায়।
1// Simple mixin that applies border-radius and box-shadow
2@mixin card-style {
3 border-radius: 8px;
4 box-shadow: 0 4px 10px rgba(0, 0, 0, 0.12);
5 background: #fff;
6}
7
8// Mixin for transform with vendor prefixes
9@mixin transform($value) {
10 -webkit-transform: $value;
11 -ms-transform: $value;
12 transform: $value;
13}
14
15// Button mixin with theme and size parameters
16@mixin btn($bg, $color: #fff, $padding: 0.5rem 1rem) {
17 display: inline-block;
18 padding: $padding;
19 background: $bg;
20 color: $color;
21 border-radius: 6px;
22 text-decoration: none;
23 cursor: pointer;
24 @include transform(translateY(0)); // reuse earlier transform mixin
25}
26
27// Card mixin that accepts inner button styling via @content
28@mixin card($gap: 1rem) {
29 @include card-style; // reuse earlier card-style mixin
30 padding: $gap;
31 @content;
32}
33
34.card-feature {
35 @include card {
36 .title { font-size: 1.125rem; margin-bottom: 0.5rem; }
37 .cta {
38 @include btn(#007acc);
39 }
40 }
41}
42
43.card-warning {
44 @include card {
45 .title { font-weight: bold; }
46 .cta {
47 @include btn(#ff6600);
48 }
49 }
50}- এই মিক্সইনগুলো ব্যবহার করে আপনি কম্পোনেন্ট সংক্ষিপ্তভাবে লিখতে পারবেন।
পারফরম্যান্স ও উৎপাদিত CSS-এ নজর দিন
কারণ মিক্সইন প্রতিবার ব্যবহারের সময় প্রোপার্টি যুক্ত করে, তাই এক নিয়মে @include অধিক ব্যবহার করলে চূড়ান্ত CSS আকারে বড় হয়ে যেতে পারে। প্রয়োজনে প্লেসহোল্ডার এবং কম্পোনেন্ট ডিজাইনের সঙ্গে সংযুক্ত করে অপ্টিমাইজ করা সম্ভব।
এছাড়াও, নিম্নলিখিত পদক্ষেপগুলি কার্যকর।
- যেসব স্টাইল ঘনঘন ব্যবহৃত হয়, সেগুলো পুনরায় ব্যবহারের জন্য ক্লাস হিসেবে তৈরি করা উচিত।
@contentব্যবহার করে সাধারণ প্যাটার্নগুলো একত্রিত করা উচিত।- জটিল ইউটিলিটিগুলোর জেনারেশন শুধুমাত্র বিল্ড টাইমেই করা উচিত।
সহজ ডিবাগিংয়ের জন্য টিপস
মিক্সইন ব্যবহার করার সময়, ডিবাগিং এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করার উপায় বের করাও গুরুত্বপূর্ণ। পরিষ্কার ভেরিয়েবল নাম ব্যবহার ও মিক্সিনে মন্তব্য যোগ করলে কোড পর্যালোচনা করার সময় পরে সহজে বোঝা যাবে। এছাড়াও, যদি ফাংশনালিটি জটিল হয়, তাহলে মিক্সইনকে ছোট ছোট ইউনিটে ভাগ করলে টেস্টিং সহজ হবে এবং রক্ষণাবেক্ষণ ভাল হবে।
অতিরিক্তভাবে, সোর্স ম্যাপ চালু করলে আপনি সহজেই ট্র্যাক করতে পারবেন কোন মিক্সইন কোন CSS তৈরি করেছে, ফলে সমস্যাগুলো আলাদা করা সহজ হয়।
নীচে একটি সহজে বোঝা যায় এমন মিক্সইনের উদাহরণ দেওয়া হলো, যার মধ্যে ডকুমেন্টেশন কমেন্টও রয়েছে।
1// Example: readable mixin with clear param names and comments
2/// Adds a subtle focus ring for accessibility
3/// $color - ring color
4/// $size - thickness of the ring
5@mixin focus-ring($color: #007acc, $size: 2px) {
6 outline: none;
7 box-shadow: 0 0 0 $size rgba(blue($color), 0.15);
8}- এভাবে গুছানো ডকুমেন্টেশন কমেন্ট থাকলে দলের মধ্যে শেয়ার ও বুঝতে সুবিধা হয়।
- কারণ SASS-এর ডকুমেন্টেশন কমেন্টগুলো উপযুক্ত টুল দিয়ে স্বয়ংক্রিয়ভাবে বের করা যায়, তাই সেগুলো স্টাইল গাইডের মতো ডকুমেন্ট তৈরি করার জন্যও উপযোগী।
সারসংক্ষেপ
মিক্সইন সাধারণভাবে ব্যবহৃত স্টাইলসমূহ প্যাক করে পুনরায় ব্যবহারের সুযোগ দেয়, ফলে কোড ডুপ্লিকেশন কমে ও মেইনটেন্যাবিলিটিতে সহায়তা করে। এছাড়াও, একাধিক সিলেক্টর একি নিয়ম ভাগাভাগি করলে, শুধু মিক্সইন নয় @extend (প্লেসহোল্ডার) ব্যবহারের কথাও ভাবুন। আরও একটি বিষয়—@content দ্বারা লেআউট wrapper ও কনটেন্ট আলাদা করা সহজ হয় ঠিকই, কিন্তু অতিরিক্ত @include ব্যবহারে তৈরি CSS অনেক বড় হতে পারে; তাই সতর্ক থাকা উচিত। জেনেরিক ও সহজে এক্সটেন্ডযোগ্য মিক্সইন ডিজাইনের জন্য আর্গুমেন্ট, ডিফল্ট মান, ও ভ্যারিয়াডিক আর্গুমেন্ট যথাযথভাবে ব্যবহার করা গুরুত্বপূর্ণ।
আপনি আমাদের ইউটিউব চ্যানেলে ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে উপরের নিবন্ধটি অনুসরণ করতে পারেন। দয়া করে ইউটিউব চ্যানেলটিও দেখুন।