সরাসরি পর্বে যান
পর্ব ৫৭ · ৫৯-এর মধ্যে · মডিউল ৮

লিখিত ও মৌখিক (ভাইভা) প্রশ্ন — HTML-CSS মডেল উত্তর ও কৌশল

Written & Viva Questions in HTML and CSS — Model Answers, Classic “Differentiate Between” Tables, Code-Writing Problems and How to Speak in an Oral Exam

Taught in Bangla, this page prepares written and oral exams in HTML and CSS: what examiners look for and how to structure answers by marks, six question banks following modules one to seven with short and long model answers, classic differentiate-between tables such as div versus span and flex versus grid, code-writing problems on paper, viva technique including explaining your own project, and using AI as a checked examiner.

এই পর্বে যা শিখবেন

  • লিখিত উত্তর কোন ক্রমে আর কত বড় লিখলে পরীক্ষক সহজে নম্বর দেন — নম্বর দেখে উত্তরের দৈর্ঘ্য ঠিক করা
  • পুরো HTML-CSS কোর্সের ক্লাসিক তুলনা এক জায়গায় — একই মাপকাঠিতে টেবিল বানিয়ে
  • box model, cascade, positioning, rendering-এর ধাপ চিত্র এঁকে ব্যাখ্যা করা
  • খাতায় বা বোর্ডে নির্ভুল, আধুনিক, অ্যাক্সেসিবল HTML-CSS লেখা — টেবিল, ফর্ম, কার্ড, grid, sticky header
  • ভাইভায় গুছিয়ে কথা বলা, না জানলে সৎ থাকা, নিজের প্রজেক্ট ব্যাখ্যা করা, আর AI-কে পরীক্ষক বানিয়ে তার ভুল ধরা

১ · পরীক্ষক কী দেখেন — আর ভালো লিখিত উত্তরের কাঠামো

আগের দুই পর্বে আপনি পাতা দেখে ফল অনুমান করেছেন আর MCQ অনুশীলন করেছেন। সেখানে উত্তর হয় ঠিক, নয় ভুল। লিখিত পরীক্ষা আর ভাইভা আলাদা। একই তথ্য জানা দুজন প্রার্থীর একজন বেশি নম্বর পান, কারণ তিনি তথ্যটি গুছিয়ে, উদাহরণসহ আর নিজের ভাষায় বলেছেন। ভাবুন বোর্ড পরীক্ষার খাতার কথা — যিনি প্রশ্ন ভাগ করে, শিরোনাম দিয়ে, চিত্র এঁকে লেখেন, পরীক্ষক তাঁর খাতায় নম্বর খুঁজে পান সহজে।

HTML-CSS-এর লিখিত প্রশ্ন সাধারণত পাঁচ ধরনের হয়। সংজ্ঞা — “semantic HTML কী? উদাহরণ দিন।” পার্থক্য — “em আর rem-এর পার্থক্য লিখুন।” চিত্রসহ ব্যাখ্যা — “box model চিত্রসহ ব্যাখ্যা করুন।” কোড লিখুন — “একটি রেজিস্ট্রেশন ফর্মের HTML লিখুন” বা “একটি কার্ড মাঝখানে বসানোর CSS লিখুন।” আর পরিস্থিতি — “ফোনে পাতাটি পাশে সরে যাচ্ছে; কারণ কী, কীভাবে ঠিক করবেন?” এই বিষয়ে পার্থক্যের প্রশ্ন খুব বেশি আসে, কারণ HTML আর CSS-এ কাছাকাছি দেখতে অনেক জোড়া আছে।

যেকোনো লিখিত উত্তর পড়ার সময় একজন পরীক্ষক মনে মনে চারটি জিনিস খোঁজেন:

নির্ভুল সংজ্ঞা

প্রথম এক–দুই বাক্যে মূল কথা। “HTML = HyperText Markup Language” শুধু পূর্ণ নাম, সংজ্ঞা নয় — HTML কী কাজ করে, সেটাই সংজ্ঞা।

শুরু

সঠিক, আধুনিক কোড

৫–১৫ লাইনের পরিষ্কার কোড। <center>, <font>, টেবিল-লেআউট লিখলে বোঝা যায় আপনি পুরোনো বই থেকে শিখেছেন।

উদাহরণ

ব্রাউজার কী ভাবে

নিয়মটি কেন এমন — cascade কীভাবে জয়ী বাছে, box-এর মাপ কীভাবে হিসাব হয়। মুখস্থ সংজ্ঞার বাইরে যা বলবেন, সেটাই বোঝার প্রমাণ।

ব্যাখ্যা

কখন কোনটি, আর সীমা

সুবিধা, ফাঁদ, অ্যাক্সেসিবিলিটি আর ব্রাউজার সাপোর্ট — এই অংশটি সাধারণ উত্তরকে ভালো উত্তরে নেয়।

উপসংহার

পাঁচ অংশের কাঠামো

সংজ্ঞা → ব্যাখ্যা (ব্রাউজার কী করে) → উদাহরণ বা কোড → চিত্র → উপসংহার (কখন কোনটি, সীমা)

একে একটি দালানের মতো ভাবুন। সংজ্ঞা হলো ভিত, ব্যাখ্যা হলো কলাম, কোড হলো দেয়াল, চিত্র হলো জানালা — যা দিয়ে ভেতরটা দেখা যায় — আর উপসংহার হলো ছাদ। ছোট প্রশ্নে সব অংশ লাগে না; বড় প্রশ্নে কোনোটি বাদ দিলে নম্বরের একটি ভাগ ফাঁকা থাকে। ধরা যাক প্রশ্নটি “box model চিত্রসহ ব্যাখ্যা করুন” (৫ নম্বর)। নিচের ডায়াগ্রামে “পরে” চাপুন — প্রতিটি ধাপে উত্তরপত্রে একটি নতুন অংশ যোগ হবে।

  1. সংজ্ঞাদুই বাক্য
  2. ব্যাখ্যাচার স্তর
  3. কোডহিসাবসহ
  4. চিত্রলেবেলসহ
  5. উপসংহারএক লাইন
উত্তরপত্রধাপ ১ — সংজ্ঞা
Box model: ব্রাউজার পাতার প্রতিটি element-কে একটি
আয়তাকার বাক্স হিসেবে সাজায় ও আঁকে। বাক্সটির চারটি
স্তর — ভেতর থেকে বাইরে: content, padding, border, margin.
উত্তরপত্রধাপ ২ — ব্যাখ্যা
… (সংজ্ঞা) …
content — আসল লেখা বা ছবি; width/height এর মাপ।
padding — content আর border-এর মাঝের ফাঁক;
          background এখানেও দেখা যায়।
border  — বাক্সের সীমানা-রেখা।
margin  — বাইরের স্বচ্ছ ফাঁক; পাশের বাক্স থেকে দূরত্ব।
          ওপর-নিচের দুই margin মিলে এক হতে পারে
          (margin collapsing).
উত্তরপত্রধাপ ৩ — কোড আর হিসাব
… (সংজ্ঞা, ব্যাখ্যা) …
.card { width: 200px; padding: 20px;
        border: 5px solid; margin: 10px; }

content-box (ডিফল্ট): দৃশ্যমান চওড়া
  = 200 + 20×2 + 5×2 = 250px
  margin-সহ জায়গা = 250 + 10×2 = 270px
box-sizing: border-box দিলে দৃশ্যমান চওড়া = 200px
  (content নিজে কমে 150px হয়)
উত্তরপত্রধাপ ৪ — চিত্র
… (সংজ্ঞা, ব্যাখ্যা, কোড) …
┌──────────── margin (10) ────────────┐
│  ┌───────── border (5) ──────────┐  │
│  │  ┌────── padding (20) ─────┐  │  │
│  │  │                         │  │  │
│  │  │   content (200 × auto)  │  │  │
│  │  │                         │  │  │
│  │  └─────────────────────────┘  │  │
│  └───────────────────────────────┘  │
└─────────────────────────────────────┘
উত্তরপত্রধাপ ৫ — সম্পূর্ণ উত্তর
… (সংজ্ঞা, ব্যাখ্যা, কোড, চিত্র) …
উপসংহার: লেআউটের প্রায় সব মাপের হিসাব box model থেকে
আসে। আধুনিক CSS-এ শুরুতেই
  *, *::before, *::after { box-sizing: border-box; }
লেখা প্রচলিত, যাতে width-এর মানই দৃশ্যমান চওড়া হয়।
DevTools-এর Computed প্যানেলে বাক্সের ছবিতে প্রতিটি
স্তরের মাপ দেখে যাচাই করা যায়।
  1. ধাপ ১ — সংজ্ঞা। দুই বাক্যে মূল কথা: “প্রতিটি element একটি বাক্স, তার চারটি স্তর”. স্তরগুলোর নাম ভেতর থেকে বাইরে, সঠিক ক্রমে। এই এক বাক্যেই পরীক্ষক বোঝেন আপনি জানেন।
  2. ধাপ ২ — ব্যাখ্যা। প্রতিটি স্তর এক লাইনে, সাথে একটি সূক্ষ্ম তথ্য — padding-এ background দেখা যায়, margin স্বচ্ছ, ওপর-নিচের margin মিলে যেতে পারে। এই সূক্ষ্ম তথ্যগুলোই মুখস্থ আর বোঝার পার্থক্য দেখায়।
  3. ধাপ ৩ — কোড আর হিসাব। একটি ছোট CSS নিয়ম আর তার পুরো হিসাব। box-sizing-এর দুই মানে ফল দেখালে উত্তরটি “ব্যাখ্যা করুন” থেকে “বুঝেছি” স্তরে ওঠে।
  4. ধাপ ৪ — চিত্র। চারটি ঘেরা বাক্স, প্রতিটিতে নাম আর মাপ। খাতায় পেনসিলে আঁকুন, স্কেল দরকার নেই — কিন্তু লেবেল অবশ্যই দিন। লেবেলহীন সুন্দর ছবির চেয়ে লেবেলসহ কাঁচা ছবি বেশি নম্বর পায়।
  5. ধাপ ৫ — উপসংহার। এক–দুই বাক্যে বাস্তব ব্যবহার: border-box রীতি আর DevTools-এ যাচাই। এখন উত্তরটি সম্পূর্ণ — পাঁচটি অংশ, কোনো নম্বর-ভাগে ফাঁক নেই।

নম্বর দেখে উত্তরের দৈর্ঘ্য

সবচেয়ে সাধারণ ভুল দুটি: ২ নম্বরের প্রশ্নে দেড় পাতা লেখা (সময় নষ্ট), আর ১০ নম্বরের প্রশ্নে চার লাইন লেখা (নম্বর নষ্ট)। নিচের হিসাবটি আমাদের পরামর্শ — পরীক্ষাভেদে নম্বর-ভাগ আলাদা হতে পারে, তবে অনুপাতটা কাজে লাগে।

নম্বরকী কী থাকবেমোটামুটি দৈর্ঘ্য
১–২ (সংক্ষিপ্ত)এক–দুই বাক্যের সংজ্ঞা + এক লাইনের উদাহরণ বা কোড৩–৫ লাইন
৩–৫ (ছোট প্রশ্ন)সংজ্ঞা, ছোট ব্যাখ্যা, ৫–১০ লাইনের কোড, দরকার হলে ছোট চিত্র; পার্থক্যের প্রশ্নে ৪–৫ সারির টেবিলআধা থেকে এক পৃষ্ঠা
৮–১০ (বড় প্রশ্ন)পাঁচ অংশই: সংজ্ঞা, ধাপে ধাপে ব্যাখ্যা, সম্পূর্ণ কোড, লেবেলসহ চিত্র, তুলনা বা সুবিধা-সীমা, উপসংহারদেড় থেকে আড়াই পৃষ্ঠা
কোড লিখুনএক লাইনে পরিকল্পনা, সম্পূর্ণ কোড, ফলের ছোট স্কেচ, অ্যাক্সেসিবিলিটি বা রেসপন্সিভ নিয়ে এক লাইননম্বর অনুযায়ী

সময়ের হিসাব সহজ: মোট মিনিটকে মোট নম্বর দিয়ে ভাগ করলে পাবেন প্রতি নম্বরে কত মিনিট। তিন ঘণ্টায় ১০০ নম্বর হলে প্রতি নম্বরে মোটামুটি দুই মিনিট — ১০ নম্বরের প্রশ্নে ১৮–২০ মিনিট, এর বেশি নয়।

খাতায় বা বোর্ডে HTML-CSS লেখার সাত নিয়ম

  1. ছোট হাতের অক্ষরে ট্যাগ, attribute-এর মান উদ্ধৃতিতে: <img src="logo.png" alt="...">. HTML বড়-ছোট অক্ষর আলাদা করে না, কিন্তু ছোট হাতের লেখাই আজকের রীতি।
  2. প্রতিটি স্তরে দুই ঘর ভেতরে (indent): nesting এক নজরে বোঝা যায়, আর বন্ধ না হওয়া ট্যাগ নিজের চোখেই ধরা পড়ে।
  3. প্রতিটি ট্যাগ বন্ধ করুন: void element (<img>, <br>, <input>) ছাড়া। <br />-এর স্ল্যাশ বৈধ, কিন্তু অর্থহীন।
  4. semantic আগে: <header>, <nav>, <main>, <button>, <label> — div-এর স্তূপ নয়।
  5. আধুনিক CSS: লেআউট flexbox বা grid দিয়ে; float, টেবিল-লেআউট, <center> শুধু ইতিহাস বলতে।
  6. মন্তব্যে লেবেল: /* ফোন: এক কলাম */ — পরীক্ষক আপনার চিন্তা দেখতে পান।
  7. ফলের স্কেচ: কোডের পাশে ছোট একটি বাক্স-চিত্র — পাতাটি দেখতে কেমন হবে। এটি দেখায় আপনি মনে মনে কোডটি ব্রাউজারে চালিয়েছেন।

এই পাতার প্রশ্নগুলো কোর্সের মডিউল অনুযায়ী সাজানো। কোনো অংশে বারবার আটকালে টেবিলের পর্বগুলো আবার পড়ুন:

কোর্সের মডিউলপর্বলিখিত প্রশ্নভাইভা প্রশ্ন
১ · ওয়েব ও HTML-এর ভিত্তি০১–০৭অংশ ২ (ক-০১–ক-১১)ভ-০১–ভ-০৬
২ · গঠন, ফর্ম ও অ্যাক্সেসিবিলিটি০৮–১৫অংশ ৩ (খ-০১–খ-১১)ভ-০৭–ভ-১২
৩ · CSS-এর ভিত্তি১৬–২২অংশ ৪ (গ-০১–গ-১১)ভ-১৩–ভ-১৮
৪ · লেআউট২৩–২৯অংশ ৫ (ঘ-০১–ঘ-১০)ভ-১৯–ভ-২৪
৫–৬ · রেসপন্সিভ, আধুনিক CSS, মোশন ও পলিশ৩০–৪৫অংশ ৬ (ঙ-০১–ঙ-১৩)ভ-২৫–ভ-৩১
৭ · পেশাদার কাজের ধারা৪৬–৫৪অংশ ৭ (চ-০১–চ-১০)ভ-৩২–ভ-৩৬
কোড লেখার প্রশ্নসব মডিউলঅংশ ৮ (কো-০১–কো-০৯)—

এই পাতার কোনো প্রশ্ন কোনো নির্দিষ্ট পরীক্ষার প্রশ্নপত্র বা কোনো প্রতিষ্ঠানের ইন্টারভিউ থেকে নেওয়া নয়। এগুলো এমন ধরনের প্রশ্ন, যা বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় প্রায়ই আসে। সিলেবাস, নম্বর বণ্টন আর সময় সবসময় নিজের পরীক্ষার সর্বশেষ বিজ্ঞপ্তি থেকে মিলিয়ে নিন। ব্রাউজার সাপোর্টের কথা বলা হয়েছে ২০২৫–২৬ সালের অবস্থা ধরে, “Baseline” শব্দে — Newly available মানে সব প্রধান ব্রাউজারের নতুন সংস্করণে সদ্য এসেছে, Widely available মানে তার প্রায় আড়াই বছর পরের নিশ্চিন্ত অবস্থা।

২ · অংশ ক — ওয়েব ও HTML-এর ভিত্তি (মডিউল ১)

রিভিশনের জন্য: পর্ব ০১, পর্ব ০২, পর্ব ০৩, পর্ব ০৪, পর্ব ০৫, পর্ব ০৬, পর্ব ০৭.

প্রতিটি প্রশ্ন পড়ে আগে নিজে খাতায় উত্তর লিখুন, তারপর প্রশ্নে চেপে মেলান। মডেল উত্তরগুলো সংক্ষিপ্ত কিন্তু সম্পূর্ণ — বড় প্রশ্নে অংশ ১-এর পাঁচ অংশের কাঠামো মেনে চিত্র ও কোড যোগ করুন।

ক-০১HTML, CSS আর JavaScript-এর ভূমিকা লিখুন। একটি উপমা দিন। — ৩ নম্বর (সহজ)

সংজ্ঞা: HTML একটি markup ভাষা — পাতার বিষয়বস্তু আর তার অর্থ বলে: কোনটি শিরোনাম, কোনটি অনুচ্ছেদ, কোনটি লিংক, কোনটি ফর্ম। CSS বলে সেই বিষয়বস্তু দেখতে কেমন হবে — রং, ফন্ট, ফাঁক, লেআউট। JavaScript একটি প্রোগ্রামিং ভাষা, যা পাতাকে আচরণ দেয় — ক্লিকে সাড়া, ডেটা আনা, পাতা বদলানো।

উপমা: একটি বাড়ি। HTML হলো কাঠামো — দেয়াল, দরজা, ঘর; CSS হলো রং, টাইলস, পর্দা; JavaScript হলো বিদ্যুৎ-সংযোগ — সুইচ টিপলে বাতি জ্বলে, ফ্যান ঘোরে।

যোগ করুন: তিনটি আলাদা রাখার নাম separation of concerns. রং বদলাতে HTML ছুঁতে হয় না, আর CSS বা JavaScript লোড না হলেও HTML-এর লেখা পড়া যায় — এটাই progressive enhancement-এর ভিত্তি।

ঝালিয়ে নিন: পর্ব ০১ · ওয়েব কীভাবে চলে

ক-০২ব্রাউজারে একটি URL লিখে Enter চাপার পর পাতা দেখা পর্যন্ত কী কী ঘটে — চিত্রসহ ব্যাখ্যা করুন। — ১০ নম্বর (কঠিন)

সংজ্ঞা: পাতা দেখানো দুই ভাগের কাজ — নেটওয়ার্ক ভাগে ব্রাউজার সার্ভার থেকে ফাইল আনে, আর রেন্ডারিং ভাগে সেই ফাইল থেকে পর্দার ছবি বানায়।

ধাপে ধাপে ব্যাখ্যা:

  1. URL ভাঙা ও cache দেখা: scheme (https), domain, path আলাদা হয়; ফাইলটি আগে থেকে cache-এ থাকলে নেটওয়ার্কে যাওয়ার দরকারই পড়ে না।
  2. DNS: domain নাম (যেমন abcltech.com) থেকে সার্ভারের IP address খোঁজা — ফোনবুকে নাম দেখে নম্বর বের করার মতো।
  3. সংযোগ: সার্ভারের সাথে সংযোগ, আর HTTPS হলে TLS দিয়ে এনক্রিপশনের চুক্তি।
  4. HTTP request ও response: ব্রাউজার GET /index.html পাঠায়; সার্ভার status code (200 OK, 404 …), header আর HTML ফেরত দেয়।
  5. Parse: HTML পড়ে DOM গাছ, CSS পড়ে CSSOM. পথে পাওয়া CSS, ছবি, ফন্ট, স্ক্রিপ্টের জন্য নতুন request যায়। defer ছাড়া সাধারণ <script> parsing থামিয়ে রাখে, আর head-এর stylesheet প্রথম ছবি আঁকা আটকে রাখে।
  6. Render tree: DOM আর CSSOM মিলিয়ে শুধু দৃশ্যমান অংশের গাছ — display: none দেওয়া element এখানে থাকে না।
  7. Layout: প্রতিটি বাক্সের অবস্থান আর মাপের হিসাব।
  8. Paint ও compositing: রং, লেখা, ছায়া আঁকা; তারপর স্তরগুলো জুড়ে পর্দায় দেখানো।

চিত্র:

URL ─► DNS ─► সংযোগ (TCP/QUIC + TLS) ─► HTTP request
                                           │
            HTML, CSS, ছবি ◄── response ◄──┘
                 │
     HTML ─► DOM ──┐
                   ├─► render tree ─► layout ─► paint ─► composite ─► পর্দা
     CSS ─► CSSOM ─┘

উপসংহার: পাতা দ্রুত দেখাতে এই পথের প্রতিটি ধাপ ছোট করতে হয় — কম ও ছোট ফাইল, render-blocking CSS কম, ছবির মাপ আগে থেকে দেওয়া (পর্ব ৪৯)। পরবর্তী যেকোনো বদলে (যেমন JavaScript দিয়ে class যোগ) ব্রাউজার আবার style → layout → paint-এর যতটুকু দরকার, ততটুকু চালায়।

ঝালিয়ে নিন: পর্ব ০১, পর্ব ৪৯ · পারফরম্যান্স; নেটওয়ার্কের দিক বিস্তারিত: ইন্টারনেট কীভাবে কাজ করে

ক-০৩HTML, XHTML আর HTML5-এর পার্থক্য লিখুন। আজকের HTML-কে “HTML5” বলা কতটা ঠিক? — ৫ নম্বর (মাঝারি)

সংজ্ঞা: HTML 4.01 (১৯৯৯) ছিল ক্ষমাশীল নিয়মের markup ভাষা। XHTML 1.0 (W3C, ২০০০) সেই একই ট্যাগ XML-এর কড়া নিয়মে লেখার রূপ। HTML5 হলো WHATWG-এর নেতৃত্বে HTML-এর বড় পুনর্গঠন (W3C Recommendation ২০১৪), যা নতুন element আর ভুল HTML পড়ার নির্দিষ্ট নিয়ম আনে।

বিষয়HTML 4.01XHTML 1.0HTML5 / Living Standard
লেখার নিয়মঢিলেঢালা; কিছু বন্ধ-ট্যাগ ঐচ্ছিককড়া: ছোট হাতের ট্যাগ, সব বন্ধ, attribute-এ উদ্ধৃতি ও মানঢিলেঢালা লেখা বৈধ, কিন্তু ভুল HTML কীভাবে পড়তে হবে তা নির্দিষ্ট
ভুল পেলেপ্রতিটি ব্রাউজার নিজের মতো সামলায়XML হিসেবে পাঠালে একটি ভুলেই পাতা দেখায় নাসব ব্রাউজার একই parsing অ্যালগরিদমে একই DOM বানায়
DOCTYPEলম্বা DTD-যুক্তলম্বা DTD-যুক্ত<!DOCTYPE html>
নতুন ক্ষমতা——<header>, <nav>, <main>, <video>, <canvas>, নতুন input type
দেখভালW3CW3CWHATWG (২০১৯ থেকে একমাত্র মানদণ্ড)

উপসংহার: আজকের HTML একটি Living Standard — কোনো সংস্করণ নম্বর নেই, নিয়মিত হালনাগাদ হয়। তাই “HTML5” শব্দটি প্রচলিত নাম হিসেবে ঠিক, কিন্তু প্রযুক্তিগতভাবে আমরা WHATWG-এর HTML Living Standard মেনে লিখি। একটি সূক্ষ্ম তথ্য যোগ করুন: XHTML লেখা বেশিরভাগ পাতা আসলে text/html হিসেবে পাঠানো হতো, তাই ব্রাউজার সেগুলো সাধারণ HTML হিসেবেই পড়ত — কড়া নিয়মের সুফল বাস্তবে প্রায় মেলেনি।

ঝালিয়ে নিন: পর্ব ০১, পর্ব ০৩

ক-০৪Tag, element আর attribute-এর পার্থক্য উদাহরণসহ লিখুন। void element কী? — ৩ নম্বর (সহজ)

Tag হলো কোণ-বন্ধনীর চিহ্ন — শুরুর <a> আর শেষের </a>. Element হলো পুরো জিনিসটি — শুরুর tag, ভেতরের বিষয়বস্তু আর শেষের tag; DOM-এ প্রতিটি element একটি node. Attribute শুরুর tag-এর ভেতরে বাড়তি তথ্য, নাম="মান" আকারে।

<a href="contact.html" class="btn">যোগাযোগ</a>
 └tag┘ └─attribute─┘  └attribute┘ └বিষয়┘ └tag┘
└──────────────── পুরোটা একটি element ────────────────┘

Void element: যার ভেতরে কোনো বিষয়বস্তু থাকতে পারে না, তাই শেষের tag-ও নেই — <img>, <br>, <hr>, <input>, <meta>, <link>. <br />-এর স্ল্যাশ XHTML-এর অভ্যাস — HTML-এ বৈধ, কিন্তু প্রভাবহীন। আর <div /> লিখলে div বন্ধ হয় না.

ঝালিয়ে নিন: পর্ব ০৩ · প্রথম HTML পেজ

ক-০৫<!DOCTYPE html> কেন লেখা হয়? না লিখলে কী হয়? — ২ নম্বর (মাঝারি)

DOCTYPE ব্রাউজারকে বলে পাতাটি আধুনিক নিয়মে, অর্থাৎ standards mode-এ দেখাতে। এটি কোনো element নয়, শুধু একটি নির্দেশ। না লিখলে ব্রাউজার quirks mode-এ যায় — ১৯৯০-এর দশকের পুরোনো ব্রাউজারের কিছু ভুল আচরণ নকল করে, যেমন টেবিলের ভেতরে font-size উত্তরাধিকার সূত্রে না আসা বা কিছু মাপের হিসাব আলাদা হওয়া। ফলে একই CSS অপ্রত্যাশিত দেখায়। JavaScript-এ document.compatMode দেখলে standards mode-এ "CSS1Compat" আর quirks mode-এ "BackCompat" পাওয়া যায়।

ঝালিয়ে নিন: পর্ব ০৩

ক-০৬<div> আর <span>-এর পার্থক্য লিখুন। block আর inline element-এর পার্থক্যও দেখান। — ৫ নম্বর (সহজ)

সংজ্ঞা: দুটিই অর্থহীন (generic) পাত্র — কোনো অর্থ যোগ করে না, শুধু CSS বা JavaScript-এর জন্য অংশ আলাদা করে। <div> বড় অংশ ঘিরে রাখে আর ডিফল্টে block; <span> লাইনের ভেতরের ছোট অংশ ঘিরে রাখে আর ডিফল্টে inline. মনে রাখুন, “block” আর “inline” আসলে CSS-এর display-এর মান, যা ব্রাউজারের ডিফল্ট stylesheet দেয় — CSS দিয়ে বদলানো যায়।

বিষয়block (যেমন div, p, h1, ul)inline (যেমন span, a, strong, em)
লাইননতুন লাইনে শুরু হয়, পরেরটিও নতুন লাইনেলেখার লাইনের ভেতরেই বসে
চওড়াপাত্রের পুরো চওড়া নেয়শুধু নিজের লেখার সমান
width/heightকাজ করেউপেক্ষিত হয়
ওপর-নিচের marginপাশের বাক্সকে সরায়লাইনের ওপর কোনো প্রভাব ফেলে না
ভেতরে কী রাখা যায়অন্য block ও inline (div-এর ভেতরে প্রায় সব)শুধু লেখা ও অন্য inline (phrasing content)
<style>
  div  { background: #dbeafe; width: 220px; margin: 8px 0; }
  span { background: #fde68a; width: 220px; margin: 20px; }
</style>
<div>প্রথম div — নিজের লাইনে</div>
<div>দ্বিতীয় div — আবার নতুন লাইনে</div>
<p>এই বাক্যের <span>এই অংশটি span</span> আর <span>এটিও span</span> — লাইন ভাঙেনি।</p>

দুটি নীল div দুই লাইনে, প্রতিটি ২২০ পিক্সেল চওড়া। হলুদ span দুটি বাক্যের ভেতরেই বসেছে — width: 220px দেওয়া সত্ত্বেও লেখার সমান চওড়া, আর margin: 20px-এর শুধু ডান-বাঁয়ের অংশ ফাঁক তৈরি করেছে, ওপর-নিচের অংশ লাইনকে সরায়নি। চেষ্টা করুন: span-এর নিয়মে display: inline-block; যোগ করুন — এবার width আর ওপর-নিচের margin দুটোই কাজ করবে।

উপসংহার: অর্থবহ element (<nav>, <button>, <strong>) না মিললে তবেই div বা span. সব জায়গায় div লিখলে তাকে বলে div soup — screen reader আর সার্চ ইঞ্জিন কাঠামো বোঝে না।

ঝালিয়ে নিন: পর্ব ০৪, পর্ব ২৩ · display আর normal flow

ক-০৭Semantic HTML কী? <strong> ও <b>, এবং <em> ও <i>-এর পার্থক্য লিখুন। — ৫ নম্বর (মাঝারি)

সংজ্ঞা: Semantic HTML মানে চেহারা নয়, অর্থ দেখে element বাছা — শিরোনামে <h1>–<h6>, তালিকায় <ul>, বোতামে <button>. লাভ তিনটি: screen reader কাঠামো শোনায়, সার্চ ইঞ্জিন বিষয় বোঝে, আর কোড পড়া সহজ হয়।

elementঅর্থউদাহরণ
<strong>গুরুত্ব, জরুরি বা সতর্কতা“পাসওয়ার্ড কাউকে বলবেন না।”
<b>বাড়তি গুরুত্ব ছাড়া শুধু চোখ টানাপণ্যের নাম, লেখার মূল শব্দ
<em>উচ্চারণের জোর — জোর সরালে বাক্যের মানে বদলায়“আমি আজ যাব” (কাল নয়)
<i>ভিন্ন স্বরের লেখা — পরিভাষা, বিদেশি শব্দ, জাহাজের নামviva voce

সীমা যোগ করুন: চোখে strong আর b দুটোই মোটা — পার্থক্য শুধু অর্থে। বেশিরভাগ screen reader ডিফল্টে এদের আলাদা স্বরে পড়ে না, তাই অর্থের জন্য শুধু এই ট্যাগের ওপর ভরসা না করে লেখাতেও স্পষ্ট বলুন। মোটা করার জন্যই মোটা করতে চাইলে CSS-এর font-weight.

ঝালিয়ে নিন: পর্ব ০৪ · লেখা ও অর্থবহ ট্যাগ

ক-০৮Absolute আর relative path-এর পার্থক্য উদাহরণসহ লিখুন। — ৫ নম্বর (সহজ)

সংজ্ঞা: Absolute URL পুরো ঠিকানা — scheme, domain আর path সব লেখা থাকে, তাই যেকোনো জায়গা থেকে একই ফাইল বোঝায়। Relative path বর্তমান ফাইলের অবস্থান থেকে পথ বলে — ঠিকানার শুরুর অংশ ব্রাউজার নিজে বসিয়ে নেয়। ধরুন ফাইল-গঠন এমন:

site/
├── index.html
├── css/style.css
├── images/logo.png
└── blog/post.html      ← আমরা এখানে আছি
ধরনpost.html থেকে লোগোকখন
absolute URLhttps://example.com/images/logo.pngঅন্য সাইটের ফাইল; ইমেইল, সোশ্যাল শেয়ার, canonical
relative (এক ধাপ ওপরে)../images/logo.pngনিজের সাইটের ভেতরে; ফোল্ডার সরালেও একসাথে কাজ করে
root-relative/images/logo.pngসাইটের মূল থেকে; সার্ভারে চলে, কিন্তু ফাইল সরাসরি খুললে (file://) ড্রাইভের মূল ধরে ভাঙে
একই ফোল্ডারেother.html বা ./other.htmlপাশের ফাইল

উপসংহার: নিজের সাইটের ভেতরের লিংকে relative, বাইরের সাইটে absolute. সাধারণ ভুল: Windows-এর মতো \ দিয়ে পথ লেখা বা C:\Users\... লিখে ফেলা — ওয়েবে সবসময় /, আর সার্ভারে বড়-ছোট অক্ষর আলাদা ধরা হতে পারে (Logo.png ≠ logo.png).

ঝালিয়ে নিন: পর্ব ০৫ · লিংক আর path

ক-০৯<img>-এ alt, width আর height কেন জরুরি? — ৪ নম্বর (মাঝারি)

alt: ছবিটি দেখা না গেলে তার জায়গায় যে লেখা কাজ করবে — screen reader পড়ে, ছবি লোড না হলে দেখায়, সার্চ ইঞ্জিন ছবি বোঝে। ছবির কাজ লিখুন, “ছবি” শব্দটি নয়: লোগো-লিংকে “ABCL TECH — হোম”. শুধু সাজের ছবিতে alt="" — screen reader তখন এড়িয়ে যায়। alt একেবারে না দিলে অনেক screen reader ফাইলের নাম পড়ে ফেলে।

width/height: ছবি আসার আগেই ব্রাউজার এই দুই মান থেকে অনুপাত বুঝে জায়গা রেখে দেয়। না দিলে ছবি আসার পর নিচের লেখা ধাক্কা খেয়ে সরে যায় — একে বলে layout shift, যা CLS নম্বর খারাপ করে। CSS-এ max-width: 100%; height: auto; দিলে ছবি রেসপন্সিভও থাকে, অনুপাতও ঠিক থাকে।

যোগ করুন: প্রথম পর্দার নিচের ছবিতে loading="lazy", কিন্তু প্রধান (hero) ছবিতে নয় — সেটি দেরিতে এলে LCP খারাপ হয়।

ঝালিয়ে নিন: পর্ব ০৬, পর্ব ১২

ক-১০ul, ol আর dl-এর পার্থক্য লিখুন। একটি অ্যাক্সেসিবল ডেটা টেবিলের অংশগুলোর নাম দিন। — ৫ নম্বর (মাঝারি)

তালিকা: ক্রম অর্থের অংশ না হলে <ul> (বাজারের ফর্দ), ক্রম জরুরি হলে <ol> (রান্নার ধাপ; start, reversed, type attribute আছে), আর নাম-বিবরণের জোড়ায় <dl> — ভেতরে <dt> (নাম) আর <dd> (বিবরণ)। ul আর ol-এর সরাসরি সন্তান শুধু <li>.

টেবিল: শুধু সারি-কলামের ডেটার জন্য — লেআউটের জন্য নয়। অংশগুলো: <caption> (নাম), <thead>, <tbody>, <tfoot>, শিরোনাম-ঘর <th> আর ডেটা-ঘর <td>. <th>-এ scope="col" বা scope="row" বলে শিরোনামটি কলামের না সারির — তখন screen reader প্রতিটি ঘরের সাথে তার শিরোনামও পড়ে। ঘর জোড়া লাগাতে colspan আর rowspan. সম্পূর্ণ মডেল কোড অংশ ৮-এর কো-০১-এ।

ঝালিয়ে নিন: পর্ব ০৭ · তালিকা আর টেবিল

ক-১১<video>, <audio> আর <iframe> নিয়ে সংক্ষেপে লিখুন। ভিডিওতে caption কেন দেবেন? — ৫ নম্বর (মাঝারি)

HTML5 থেকে ভিডিও আর অডিও চলে কোনো plugin ছাড়াই। একাধিক <source> দিলে ব্রাউজার প্রথম যেটি চালাতে পারে সেটিই নেয়; শেষে থাকে fallback লেখা।

<video controls width="640" height="360" poster="cover.jpg" preload="metadata">
  <source src="class.webm" type="video/webm">
  <source src="class.mp4" type="video/mp4">
  <track kind="captions" src="class.bn.vtt" srclang="bn" label="বাংলা">
  আপনার ব্রাউজার ভিডিও চালাতে পারে না। <a href="class.mp4">ভিডিওটি নামিয়ে নিন</a>.
</video>

Caption কেন: যাঁরা শুনতে পান না, যাঁরা বাসে বা অফিসে শব্দ বন্ধ রেখে দেখেন, আর যাঁদের ভাষাটি দুর্বল — সবার জন্য। <track> ফাইলটি WebVTT আকারে লেখা হয়। মনে রাখুন, ব্রাউজারের autoplay নিয়ম অনুযায়ী শব্দসহ ভিডিও নিজে থেকে চলে না — autoplay সাধারণত muted-এর সাথেই কাজ করে।

<iframe>: অন্য একটি পাতা নিজের পাতার ভেতরে বসায় — YouTube ভিডিও, Google Map. সবসময় title দিন (screen reader-এ নাম), নিচের দিকে হলে loading="lazy", আর অচেনা বিষয়বস্তুতে sandbox দিয়ে ক্ষমতা সীমিত করুন।

ঝালিয়ে নিন: পর্ব ০৬ · ছবি, অডিও, ভিডিও আর iframe

৩ · অংশ খ — গঠন, ফর্ম ও অ্যাক্সেসিবিলিটি (মডিউল ২)

রিভিশনের জন্য: পর্ব ০৮, পর্ব ০৯, পর্ব ১০, পর্ব ১১, পর্ব ১২, পর্ব ১৩, পর্ব ১৪, পর্ব ১৫.

খ-০১HTML ফর্মে GET আর POST method-এর পার্থক্য লিখুন। কোনটি কখন ব্যবহার করবেন? — ৫ নম্বর (মাঝারি)

সংজ্ঞা: <form>-এর action বলে ডেটা কোন ঠিকানায় যাবে, আর method বলে কীভাবে যাবে। GET ডেটাকে URL-এর query string-এ জুড়ে দেয়; POST ডেটা পাঠায় request-এর ভেতরে (body). কিছু না লিখলে method হয় GET, আর action না দিলে ডেটা যায় বর্তমান পাতার ঠিকানাতেই।

বিষয়GETPOST
ডেটা কোথায়URL-এ: /search?q=shirt&size=Mrequest body-তে
দেখা যায়, বুকমার্ক হয়?হ্যাঁ — history, সার্ভার log আর শেয়ার করা লিংকে থাকেURL-এ দেখা যায় না, বুকমার্ক হয় না
আকারURL-এর দৈর্ঘ্যের ব্যবহারিক সীমায় বাঁধাবড় ডেটা আর ফাইল পাঠানো যায় (enctype="multipart/form-data")
অর্থ“তথ্য আনো” — সার্ভারের কিছু বদলানোর কথা নয়“কিছু করো” — নতুন অ্যাকাউন্ট, অর্ডার, পেমেন্ট
cache ও রিলোডcache হতে পারে; রিলোডে নিরাপদসাধারণত cache হয় না; রিলোডে ব্রাউজার আবার পাঠানোর আগে জিজ্ঞেস করে
উদাহরণসার্চ, ফিল্টার, পাতা নম্বরলগইন, রেজিস্ট্রেশন, ফাইল আপলোড

সাধারণ ভুল ধারণা: “POST নিরাপদ, কারণ এনক্রিপ্ট করা” — ভুল। POST-এর ডেটা শুধু URL-এ দেখা যায় না; এনক্রিপশন আসে HTTPS থেকে, দুই method-এর জন্যই। পাসওয়ার্ড কখনো GET-এ পাঠাবেন না, কারণ URL ব্রাউজারের history আর সার্ভারের log-এ থেকে যায়।

ঝালিয়ে নিন: পর্ব ০৮ · ফর্মের ভিত্তি

খ-০২ফর্মে <label> কেন দরকার? placeholder কি label-এর বিকল্প? — ৩ নম্বর (সহজ)

<label> ঘরটির নাম দেয় — screen reader ঘরে ঢুকলেই নামটি পড়ে, আর label-এ ক্লিক করলে ঘরটি focus হয় (checkbox-এ টিক পড়ে), ফলে ফোনে চাপার জায়গাও বড় হয়। দুই উপায়: <label for="phone"> আর <input id="phone"> জোড়া, অথবা input-কে label-এর ভেতরে রাখা।

Placeholder label-এর বিকল্প নয়: লিখতে শুরু করলেই মুছে যায় (কী লিখছিলেন মনে থাকে না), রং সাধারণত হালকা (পড়া কঠিন), আর অনেক অবস্থায় accessible name হিসেবে ভরসাযোগ্য নয়। placeholder শুধু উদাহরণ দেখাতে: placeholder="01XXXXXXXXX".

ঝালিয়ে নিন: পর্ব ০৮, পর্ব ৪৩

খ-০৩HTML-এর built-in form validation কী? client-side validation থাকলেও server-side validation কেন লাগে? — ৫ নম্বর (মাঝারি)

সংজ্ঞা: JavaScript ছাড়াই ব্রাউজার ফর্ম জমার আগে ঘরের মান যাচাই করে — একে বলে constraint validation. ভুল থাকলে জমা থামে আর ব্রাউজার নিজের বার্তা দেখায়।

  • required — ঘর খালি রাখা যাবে না
  • type="email", type="url", type="number" — ধরন যাচাই; ফোনে ঠিক কি-বোর্ডও খোলে
  • min, max, step, minlength, maxlength — সীমা
  • pattern="01[3-9][0-9]{8}" — regular expression দিয়ে নিজস্ব নিয়ম (এখানে বাংলাদেশের ১১ অঙ্কের মোবাইল নম্বরের ধাঁচ)
  • CSS-এ :user-invalid — ব্যবহারকারী ঘরটি ছোঁয়ার পরেই লাল দাগ (Baseline Widely available)

কেন server-side লাগে: client-side validation শুধু ব্যবহারকারীর সুবিধা — দ্রুত ভুল দেখায়। কিন্তু যে কেউ DevTools-এ required মুছে দিতে পারেন, বা ব্রাউজার ছাড়াই সরাসরি সার্ভারে request পাঠাতে পারেন। তাই নিরাপত্তা আর ডেটার শুদ্ধতার জন্য server-side validation বাধ্যতামূলক। এক লাইনে: “client-side সুবিধার জন্য, server-side নিরাপত্তার জন্য।”

ঝালিয়ে নিন: পর্ব ০৯ · ফর্মের কন্ট্রোল আর validation

খ-০৪Radio button আর checkbox-এর পার্থক্য লিখুন। — ৩ নম্বর (সহজ)
বিষয়radiocheckbox
বাছাইএকটি দলে একটিইপ্রতিটি স্বাধীন — যতগুলো খুশি
দল কীভাবে হয়একই name দিলেদল দরকার নেই; একই name-এ একাধিক মানও যেতে পারে
একবার বাছলেক্লিক করে আর খালি করা যায় না (অন্যটি বাছতে হয়)আবার ক্লিকে টিক ওঠে
উদাহরণলিঙ্গ, পেমেন্ট পদ্ধতি (bKash / Nagad / কার্ড)“শর্তে রাজি”, আগ্রহের বিষয়

দুই ক্ষেত্রেই দলটিকে <fieldset> আর <legend>-এ মুড়ে দিন — screen reader তখন প্রশ্নটিও পড়ে (“পেমেন্ট পদ্ধতি, bKash, radio button”). আর মনে রাখুন, টিক না দেওয়া checkbox ফর্মের ডেটায় যায়ই না।

ঝালিয়ে নিন: পর্ব ০৯

খ-০৫HTML5-এর semantic layout element-গুলো লিখুন। <article> আর <section>-এর পার্থক্য কী? — ৮ নম্বর (মাঝারি)

সংজ্ঞা: এই element-গুলো পাতার বড় অংশগুলোর ভূমিকা বলে। screen reader এদের landmark হিসেবে চেনে, তাই ব্যবহারকারী এক চাপে “মূল অংশ” বা “মেনু”-তে লাফাতে পারেন।

elementকাজlandmark
<header>পাতা বা অংশের শুরুর অংশ — লোগো, শিরোনামপাতার শীর্ষে হলে banner
<nav>প্রধান লিংকের দলnavigation
<main>পাতার মূল বিষয়; একটি পাতায় দৃশ্যমান একটিইmain
<article>নিজে সম্পূর্ণ, আলাদা করেও অর্থবহ(article ভূমিকা)
<section>একটি বিষয়ের অংশ, সাধারণত শিরোনামসহনাম (accessible name) থাকলে region
<aside>পাশের প্রাসঙ্গিক তথ্যcomplementary
<footer>শেষের অংশ — কপিরাইট, যোগাযোগপাতার শেষে হলে contentinfo

article বনাম section: পরীক্ষা হলো “এটা কি আলাদা করে অন্য সাইটে বা RSS-এ ছাপলেও অর্থবহ?” হ্যাঁ হলে <article> — একটি খবর, ব্লগ পোস্ট, পণ্যের কার্ড, একটি মন্তব্য। না হলে, অর্থাৎ বড় কিছুর একটি অধ্যায় হলে <section> — “আমাদের সেবা”, “প্রশ্নোত্তর”. একটি article-এর ভেতরে section থাকতে পারে, আবার একটি section-এর ভেতরে কয়েকটি article-ও। শুধু CSS-এর জন্য মোড়ক লাগলে কোনোটিই নয় — <div>.

উপসংহার: semantic element নিজে চেহারা দেয় না; এদের দাম কাঠামোয় — অ্যাক্সেসিবিলিটি, SEO আর কোড পড়ার সহজতা। ছোট একটি কঙ্কালের মডেল কোড অংশ ৮-এর কো-০৩-এ।

ঝালিয়ে নিন: পর্ব ১০ · Semantic layout

খ-০৬JavaScript ছাড়া HTML দিয়ে খোলা-বন্ধের তিনটি উপায় — details, dialog আর popover — তুলনা করুন। — ৫ নম্বর (মাঝারি)
বিষয়<details><dialog> (modal)popover
কীdisclosure — জায়গাতেই খোলেmodal জানালা; বাকি পাতা ব্যবহার করা যায় নাপাতার ওপরে ভাসমান, কিন্তু বাকি পাতাও চলে
খোলে কীভাবে<summary>-এ ক্লিকshowModal() (বা নতুন invoker command)popovertarget দেওয়া বোতাম
বন্ধআবার ক্লিকEsc, <form method="dialog">Esc বা বাইরে ক্লিক (light dismiss)
উদাহরণFAQ, “আরও দেখুন”“অর্ডার বাতিল করবেন?” নিশ্চিতকরণমেনু, ছোট তথ্য-বাক্স
সাপোর্টWidely available; একই name-এ accordion — Newly availableWidely availableNewly available

dialog আর popover দুটোই top layer-এ বসে, তাই কোনো z-index যুদ্ধ লাগে না। modal dialog খুললে বাকি পাতা inert হয়ে যায় — কি-বোর্ডের focus বাইরে যায় না। এগুলো নিজে থেকেই কি-বোর্ড আর screen reader সামলায় — এখানেই হাতে বানানো div-modal-এর চেয়ে এদের জোর।

ঝালিয়ে নিন: পর্ব ১১ · details, dialog আর popover

খ-০৭ওয়েব অ্যাক্সেসিবিলিটি কী? WCAG-এর চার নীতি (POUR) আর ARIA ব্যবহারের প্রথম নিয়ম ব্যাখ্যা করুন। — ১০ নম্বর (কঠিন)

সংজ্ঞা: Accessibility মানে পাতাটি সবাই ব্যবহার করতে পারবেন — দৃষ্টি, শ্রবণ, চলাফেরা বা বোধের প্রতিবন্ধিতা থাকলেও, আর ভাঙা হাত বা রোদে ঝলসানো পর্দার মতো সাময়িক অবস্থাতেও। আন্তর্জাতিক মানদণ্ড WCAG (বর্তমান সংস্করণ 2.2), তিন স্তরে: A, AA, AAA — সাধারণ লক্ষ্য AA.

চার নীতি — POUR:

  1. Perceivable (বোঝার মতো করে পৌঁছানো): ছবিতে alt, ভিডিওতে caption, লেখা আর পটভূমির পর্যাপ্ত contrast (সাধারণ লেখায় অন্তত 4.5:1).
  2. Operable (চালানো যায়): সব কাজ শুধু কি-বোর্ডে; দৃশ্যমান focus; চলমান জিনিস থামানোর উপায়; যথেষ্ট বড় চাপার জায়গা।
  3. Understandable (বোধগম্য): lang দেওয়া, পরিষ্কার label আর error বার্তা, সব পাতায় একই রকম নেভিগেশন।
  4. Robust (টেকসই): বৈধ, অর্থবহ HTML, যাতে ব্রাউজার আর সহায়ক প্রযুক্তি ঠিকভাবে বোঝে।

ব্রাউজার কী করে: HTML থেকে ব্রাউজার একটি accessibility tree বানায় — প্রতিটি অংশের role (ভূমিকা), name (নাম) আর state (অবস্থা)। screen reader সেই গাছ পড়ে। <button> নিজেই role “button”, Tab-এ আসে, Enter আর Space-এ চলে; একটি <div onclick>-এর এসবের কিছুই নেই।

ARIA-র প্রথম নিয়ম: ARIA (WAI-ARIA) হলো এমন attribute (role, aria-label, aria-expanded …), যা accessibility tree-তে তথ্য যোগ বা বদল করে — কিন্তু কোনো আচরণ যোগ করে না। প্রথম নিয়ম: যে কাজের জন্য আসল HTML element আছে, সেটিই ব্যবহার করুন; ARIA দিয়ে অন্য element-কে সেই ভূমিকায় সাজাবেন না।

<!-- ভুল: role দিলেও Tab, Enter, Space কিছুই নিজে কাজ করে না -->
<div role="button" onclick="save()">সংরক্ষণ</div>

<!-- ঠিক: সব আচরণ বিনা খরচে -->
<button type="button" onclick="save()">সংরক্ষণ</button>

উপসংহার: ভুল ARIA, ARIA না থাকার চেয়েও খারাপ — কারণ সে screen reader-কে মিথ্যা বলে। যাচাইয়ে তিন স্তর: শুধু কি-বোর্ডে পুরো পাতা চালানো, Lighthouse বা axe-এর মতো স্বয়ংক্রিয় পরীক্ষা (যা সব সমস্যা ধরে না), আর একটি আসল screen reader (যেমন NVDA) দিয়ে শোনা।

ঝালিয়ে নিন: পর্ব ১২ · অ্যাক্সেসিবিলিটি, পর্ব ৪৫ · অ্যাক্সেসিবল CSS

খ-০৮tabindex-এর মান 0, -1 আর ধনাত্মক সংখ্যার পার্থক্য লিখুন। — ৩ নম্বর (মাঝারি)

tabindex ঠিক করে একটি element কি-বোর্ডের focus পাবে কি না, আর কোন ক্রমে।

  • tabindex="0" — সাধারণভাবে focus পায় না এমন element (যেমন স্ক্রল করা একটি টেবিলের পাত্র) Tab-এর স্বাভাবিক ক্রমে যোগ হয়।
  • tabindex="-1" — Tab-এ আসে না, কিন্তু JavaScript-এর focus() দিয়ে focus দেওয়া যায় (যেমন error-এর সারাংশে বা dialog-এর শিরোনামে)।
  • ধনাত্মক (1, 2 …) — পাতার বাকি সবকিছুর আগে আসে, স্বাভাবিক ক্রম ভেঙে যায়। এড়িয়ে চলুন; ক্রম ঠিক করুন HTML-এর ক্রম ঠিক করে।

বোতাম, লিংক, input নিজেরাই focus পায় — তাদের tabindex লাগে না।

ঝালিয়ে নিন: পর্ব ১২

খ-০৯<head>-এ কোন কোন meta tag জরুরি? SEO আর সোশ্যাল শেয়ারে এদের ভূমিকা কী? — ৫ নম্বর (মাঝারি)
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>বাংলায় HTML শিখুন | ABCL TECH</title>
  <meta name="description" content="শুরু থেকে আধুনিক HTML…">
  <link rel="canonical" href="https://example.com/html/">
  <meta property="og:title" content="বাংলায় HTML শিখুন">
  <meta property="og:image" content="https://example.com/share.jpg">
  <link rel="icon" href="/favicon.ico">
</head>
  • charset — UTF-8; ফাইলের একেবারে শুরুর দিকে, নইলে বাংলা ভাঙতে পারে।
  • viewport — ফোনে পাতাকে ডেস্কটপের মাপে ছোট করে দেখানো বন্ধ করে; রেসপন্সিভ ডিজাইনের প্রথম শর্ত।
  • title — ট্যাবের নাম আর সার্চ ফলাফলের নীল শিরোনাম; প্রতিটি পাতায় আলাদা।
  • description — সার্চ ফলাফলের নিচের ছোট বিবরণ হিসেবে প্রায়ই দেখানো হয়; সরাসরি র‍্যাংক বাড়ায় না, কিন্তু ক্লিক টানে।
  • canonical — একই বিষয়ের কয়েকটি URL থাকলে কোনটি আসল।
  • Open Graph — Facebook, WhatsApp, LinkedIn-এ লিংক শেয়ার করলে যে ছবি-শিরোনাম-বিবরণের কার্ড দেখায়।

<meta name="keywords"> লিখলে ক্ষতি নেই, কিন্তু Google বহু বছর ধরে এটি র‍্যাংকিংয়ে ব্যবহার করে না — পরীক্ষায় এটিকে “SEO-র প্রধান tag” লিখবেন না।

ঝালিয়ে নিন: পর্ব ১৩ · head, meta, SEO

খ-১০ওয়েব পাতায় বাংলা ঠিকভাবে দেখাতে কী কী করতে হয়? — ৫ নম্বর (মাঝারি)
  1. UTF-8: ফাইল UTF-8-এ সেভ, আর <meta charset="utf-8">. নইলে লেখা অর্থহীন চিহ্নে বদলে যায় (mojibake).
  2. lang: <html lang="bn"> — screen reader বাংলা উচ্চারণ বাছে, ব্রাউজার ঠিক ফন্ট আর hyphenation বোঝে, সার্চ ইঞ্জিন ভাষা চেনে। মাঝে ইংরেজি অনুচ্ছেদ থাকলে সেখানে lang="en".
  3. Unicode, ANSI নয়: বিজয়ের মতো পুরোনো ANSI ফন্টে লেখা আসলে ইংরেজি অক্ষরের ওপর বাংলা চেহারা — সার্চে পাওয়া যায় না, কপি করলে উল্টাপাল্টা হয়, screen reader পড়তে পারে না।
  4. ফন্ট: বাংলা web font (যেমন Noto Sans Bengali, Hind Siliguri), সাথে fallback stack; font-display: swap; বাংলার জন্য সাধারণত ইংরেজির চেয়ে বড় line-height (১.৬–১.৮), কারণ মাত্রা, কার আর যুক্তাক্ষর ওপর-নিচে জায়গা নেয়।
  5. সাবধানতা: বাংলা লেখায় letter-spacing দিলে যুক্তাক্ষর আর কারের গঠন ভাঙতে পারে।

ঝালিয়ে নিন: পর্ব ১৪ · ওয়েবে বাংলা; টাইপিং-এর দিক: বাংলা টাইপিং ও Unicode

খ-১১কয়েক পাতার একটি HTML ওয়েবসাইটের ফোল্ডার-গঠন আর প্রতিটি পাতার কঙ্কাল কেমন হবে? — ৫ নম্বর (সহজ)
coaching-site/
├── index.html        (হোম)
├── courses.html      (কোর্স ও ফি)
├── contact.html      (যোগাযোগ ফর্ম)
├── css/style.css
└── images/

প্রতিটি পাতায় একই কঙ্কাল: <!DOCTYPE html>, <html lang="bn">, নিজস্ব <title> ও description, একটি skip link, <header>-এর ভেতরে <nav>, একটি <main> আর তাতে একটি <h1>, শেষে <footer>. মেনুতে বর্তমান পাতার লিংকে aria-current="page" — screen reader “বর্তমান পাতা” বলে, আর CSS দিয়ে আলাদা চেহারাও দেওয়া যায়। ফাইলের নাম ছোট হাতের, ফাঁকা জায়গা ছাড়া (contact-us.html, Contact Us.html নয়)।

যোগ করুন: সব পাতায় হাতে একই header কপি করলে একটিতে ভুল থেকে যায় — বড় সাইটে template, server-side include বা static site generator লাগে। শেষে validator.w3.org-এ প্রতিটি পাতা যাচাই।

ঝালিয়ে নিন: পর্ব ১৫ · মাইলস্টোন

৪ · অংশ গ — CSS-এর ভিত্তি (মডিউল ৩)

রিভিশনের জন্য: পর্ব ১৬, পর্ব ১৭, পর্ব ১৮, পর্ব ১৯, পর্ব ২০, পর্ব ২১, পর্ব ২২.

গ-০১HTML-এ CSS যোগ করার তিনটি উপায় লিখুন। কোনটি কখন ভালো? — ৩ নম্বর (সহজ)
<!-- ১. inline: element-এর style attribute -->
<p style="color: green;">…</p>

<!-- ২. internal: head-এর <style> -->
<style> p { color: green; } </style>

<!-- ৩. external: আলাদা ফাইল -->
<link rel="stylesheet" href="css/style.css">

External সবচেয়ে ভালো — এক ফাইল বদলালে পুরো সাইট বদলায়, আর ব্রাউজার ফাইলটি cache করে রাখে বলে পরের পাতা দ্রুত খোলে। Internal এক পাতার বিশেষ নিয়ম বা ইমেইলের মতো জায়গায়; দক্ষ সাইটে প্রথম পর্দার জরুরি CSS (critical CSS) এভাবে বসানো হয়। Inline এড়িয়ে চলুন — বারবার একই কথা লিখতে হয়, আর selector দিয়ে হারানো কঠিন।

সাধারণ ভুল ধারণা: “internal সবসময় external-কে হারায়” — না। একই specificity হলে যে নিয়ম পরে আসে সে জেতে; <link>টি <style>-এর পরে থাকলে external জিতবে। inline style আলাদা: সে প্রায় সব selector-কে হারায় (শুধু !important তাকে হারাতে পারে)।

ঝালিয়ে নিন: পর্ব ১৬ · CSS-এর সাথে পরিচয়

গ-০২একটি CSS rule-এর অংশগুলো চিত্রসহ লিখুন। — ২ নম্বর (সহজ)
   selector        declaration block
  ┌───┴───┐ ┌──────────────┴───────────────┐
  .price   {  color: crimson;  font-size: 1.25rem;  }
             └─┬─┘  └──┬──┘   └───────┬────────┘
            property  value     আরেকটি declaration

Selector বলে কোন element; declaration block-এর ভেতরের প্রতিটি declaration একটি property আর তার value, মাঝে কোলন, শেষে সেমিকোলন। ভুল বানানের declaration ব্রাউজার চুপচাপ বাদ দেয় — বাকিগুলো চলতে থাকে।

ঝালিয়ে নিন: পর্ব ১৬

গ-০৩id আর class-এর পার্থক্য লিখুন। স্টাইলের জন্য কোনটি ভালো? — ৫ নম্বর (সহজ)
বিষয়idclass
পাতায় কয়বারএকটি পাতায় একটিই (অনন্য)যত খুশি element-এ
একটি element-এ কয়টিএকটিঅনেকগুলো, ফাঁকা দিয়ে: class="btn btn-primary"
CSS selector#cart.btn
specificity(1,0,0) — খুব ভারী(0,1,0)
অন্য কাজপাতার ভেতরে লাফ (href="#faq"), <label for>, aria-labelledby, getElementByIdদলবদ্ধ স্টাইল, JavaScript-এ অবস্থা বদল (classList)

উপসংহার: স্টাইলের জন্য class. id-র specificity এত বেশি যে পরে তাকে হারাতে আরও ভারী selector বা !important লাগে — একে বলে specificity-র যুদ্ধ। id রাখুন লিংক, label আর JavaScript-এর জন্য।

ঝালিয়ে নিন: পর্ব ১৭ · Selector

গ-০৪CSS combinator কী? চার ধরনের combinator উদাহরণসহ লিখুন। — ৪ নম্বর (মাঝারি)

Combinator দুটি selector-এর মধ্যে সম্পর্ক বলে — HTML গাছে কে কার ভেতরে বা পাশে।

নামচিহ্নউদাহরণকাকে ধরে
descendantফাঁকা জায়গাnav anav-এর ভেতরে যেকোনো গভীরতার a
child>ul > liul-এর সরাসরি সন্তান li
next sibling+h2 + ph2-এর ঠিক পরের p
subsequent sibling~h2 ~ ph2-এর পরের সব ভাই-বোন p

লক্ষ করুন, combinator নিজে specificity যোগ করে না — ul > li-এর specificity (0,0,2), দুটি type selector-এর যোগফল। আর sibling combinator শুধু পরের দিকে দেখে; আগের ভাই-বোনকে ধরতে লাগে :has() (পর্ব ৩৪)।

ঝালিয়ে নিন: পর্ব ১৭

গ-০৫Cascade, specificity আর inheritance ব্যাখ্যা করুন। একই element-এ দুটি নিয়ম লাগলে কোনটি জেতে? — ১০ নম্বর (কঠিন)

সংজ্ঞা: একই element-এর একই property-তে কয়েকটি declaration লাগলে ব্রাউজার একটি নির্দিষ্ট ক্রমে বিচার করে একটিকে জয়ী বাছে — এই প্রক্রিয়ার নাম cascade. আর কোনো property-তে কোনো declaration-ই না লাগলে কিছু property মা-বাবার মান নিয়ে নেয় — একে বলে inheritance.

Cascade-এর বিচারের ক্রম (আগের ধাপে মীমাংসা হলে পরের ধাপে যায় না):

  1. উৎস ও গুরুত্ব: ব্রাউজারের ডিফল্ট < ব্যবহারকারীর < লেখকের (আপনার) CSS; !important দিলে ক্রম উল্টে যায়।
  2. element-এর নিজের style attribute — selector-ভিত্তিক নিয়মকে হারায়।
  3. Cascade layer (@layer): পরে ঘোষিত layer জেতে; layer-এর বাইরের সাধারণ CSS সব layer-কে হারায়।
  4. Specificity: selector কত নির্দিষ্ট — তিন ঘরের সংখ্যা (A, B, C).
  5. উৎসের ক্রম: সব সমান হলে যে পরে লেখা, সে জেতে।

Specificity গোনা: A = id-এর সংখ্যা; B = class, attribute selector আর pseudo-class; C = type selector আর pseudo-element. * আর combinator শূন্য; :where() সবসময় শূন্য; :is(), :not(), :has() নেয় তাদের ভেতরের সবচেয়ে ভারী selector-এর মান। তুলনা হয় বাঁ থেকে — (1,0,0) সবসময় (0,15,0)-কে হারায়।

<style>
  p              { color: gray; }    /* (0,0,1) */
  .note          { color: green; }   /* (0,1,0) */
  #tip           { color: blue; }    /* (1,0,0) */
  article p.note { color: orange; }  /* (0,1,2) */
  p.note         { color: red; }     /* (0,1,1) — সবার শেষে লেখা */
</style>
<article>
  <p id="tip" class="note">প্রথম লেখা — কোন রং?</p>
  <p class="note">দ্বিতীয় লেখা — কোন রং?</p>
  <p>তৃতীয় লেখা — কোন রং?</p>
</article>
<script>
  document.querySelectorAll('p').forEach((p, i) =>
    console.log('p' + (i + 1) + ':', getComputedStyle(p).color));
</script>

প্রথম লেখা নীল — id-র (1,0,0) বাকি সবাইকে হারায়। দ্বিতীয় লেখা কমলা: তিনটি প্রার্থী .note (0,1,0), article p.note (0,1,2) আর p.note (0,1,1); শেষেরটি পরে লেখা হলেও specificity আগে বিচার হয়, তাই (0,1,2) জেতে। তৃতীয়টি ধূসর। নিচের লগে তিনটি রং rgb(...) আকারে দেখা যাবে। চেষ্টা করুন: .note-এর নিয়মে green-এর পরে !important যোগ করুন — এবার প্রথম দুটি লেখাই সবুজ, কারণ গুরুত্ব specificity-র আগে বিচার হয়।

Inheritance: লেখা-সংক্রান্ত property — color, font-family, font-size, line-height — সাধারণত উত্তরাধিকার সূত্রে আসে; বাক্স-সংক্রান্ত — margin, padding, border, background — আসে না। জোর করে আনতে inherit, property-র প্রাথমিক মানে (ব্রাউজারের ডিফল্ট stylesheet-এর মান নয় — যেমন div-এ display: initial দিলে inline হয়) ফেরাতে initial, স্বাভাবিক আচরণে ফেরাতে unset. মনে রাখুন: উত্তরাধিকারের মান সবচেয়ে দুর্বল — element-এ সরাসরি লাগা p { color: gray; }-এর মতো সাধারণ নিয়মও মা-বাবার #id থেকে আসা রংকে হারায়।

উপসংহার: বড় প্রজেক্টে specificity কম ও সমান রাখুন (একটি class-ভিত্তিক নিয়ম), ক্রম সামলান @layer দিয়ে, আর !important রাখুন শুধু utility বা অ্যাক্সেসিবিলিটির জরুরি ক্ষেত্রে। DevTools-এর Styles প্যানেলে কাটা দাগ দেওয়া declaration দেখায় কে হেরেছে।

ঝালিয়ে নিন: পর্ব ১৮ · Cascade, specificity আর inheritance, পর্ব ৩৫ · @layer

গ-০৬box-sizing: content-box আর border-box-এর পার্থক্য হিসাবসহ দেখান। — ৫ নম্বর (মাঝারি)

অংশ ১-এর ডায়াগ্রামে box model-এর পুরো উত্তর আছে। এখানে মূল পার্থক্য: content-box (ডিফল্ট)-এ width শুধু content-এর মাপ, padding আর border তার বাইরে যোগ হয়। border-box-এ width border পর্যন্ত পুরো বাক্সের মাপ, padding আর border তার ভেতর থেকে জায়গা নেয়। margin দুই ক্ষেত্রেই বাইরে।

<style>
  .box { width: 200px; padding: 20px; border: 5px solid #2563eb;
         margin: 10px 0; background: #dbeafe; }
  .bb  { box-sizing: border-box; }
</style>
<div class="box">content-box</div>
<div class="box bb">border-box</div>
<script>
  (function m() {
    if (!document.body.offsetWidth) return setTimeout(m, 50);
    document.querySelectorAll('.box').forEach(b =>
      console.log(b.textContent + ': ' + b.offsetWidth + 'px'));
  })();
</script>

প্রথম বাক্স চওড়ায় বড় — লগে content-box: 250px (200 + 20×2 + 5×2). দ্বিতীয়টি border-box: 200px — লেখার জায়গা কমে 150px হয়েছে। চেষ্টা করুন: padding-কে 40px করুন — প্রথম বাক্স 290px হবে, দ্বিতীয়টি তখনো 200px.

এ কারণেই আধুনিক CSS-এর শুরুতে প্রায় সবাই লেখেন *, *::before, *::after { box-sizing: border-box; } — width: 50% দিলে padding যোগ করেও বাক্স ঠিক অর্ধেকই থাকে।

ঝালিয়ে নিন: পর্ব ১৯ · Box model

গ-০৭Margin collapsing কী? কখন হয় আর কখন হয় না? — ৪ নম্বর (মাঝারি)

সংজ্ঞা: normal flow-তে ওপর-নিচে পাশাপাশি দুটি block-এর vertical margin যোগ না হয়ে মিলে একটি হয় — বড়টির মাপে। একটি <p>-এর margin-bottom: 20px আর পরেরটির margin-top: 30px হলে মাঝের ফাঁক 50px নয়, 30px. একে বলে margin collapsing.

আরেক রূপ: মা-বাবার কোনো border, padding বা নতুন formatting context না থাকলে প্রথম সন্তানের margin-top মা-বাবার বাইরে “বেরিয়ে” যায় — মনে হয় মা-বাবাই নিচে নেমেছে।

যেখানে হয় না: পাশাপাশি (horizontal) margin; flex বা grid-এর item; float আর absolute element; inline-block. মা-বাবায় padding বা border দিলে, বা display: flow-root দিয়ে নতুন block formatting context বানালে বেরিয়ে যাওয়া থামে। আধুনিক সমাধান: ফাঁক দিতে flex বা grid-এ gap.

ঝালিয়ে নিন: পর্ব ১৯

গ-০৮em আর rem-এর পার্থক্য উদাহরণসহ লিখুন। — ৫ নম্বর (সহজ)
বিষয়emrem
কিসের সাপেক্ষেelement-এর নিজের font-size (font-size-এ ব্যবহার করলে মা-বাবার font-size)root element — <html>-এর font-size
nesting-এগুণ হয়ে বাড়ে-কমে (1.2em-এর ভেতরে 1.2em = 1.44 গুণ)সবসময় এক — নেস্টিং-এ বদলায় না
ব্রাউজারের ডিফল্ট ১৬px ধরেনির্ভর করে কোথায় বসানো1.5rem = 24px, পাতার সব জায়গায়
ভালো ব্যবহারযা নিজের লেখার মাপের সাথে বাড়বে — বোতামের padding, আইকনপাতাজুড়ে লেখার মাপ, ফাঁকের মাপ
<style>
  .card { font-size: 20px; }
  .em   { font-size: 1.5em;  padding: 1em;  background: #fde68a; }
  .rem  { font-size: 1.5rem; padding: 1rem; background: #bbf7d0; }
</style>
<div class="card">
  <p class="em">1.5em লেখা</p>
  <p class="rem">1.5rem লেখা</p>
</div>
<script>
  for (const c of ['em', 'rem']) {
    const s = getComputedStyle(document.querySelector('.' + c));
    console.log(c + ' → font-size ' + s.fontSize + ', padding ' + s.paddingTop);
  }
</script>

হলুদ লেখাটি বড়: লগে em → font-size 30px, padding 30px. font-size-এ em মা-বাবার (20px) সাপেক্ষে — 1.5 × 20 = 30px; আর padding-এর em element-এর নিজের নতুন font-size (30px) ধরে। সবুজটি rem → font-size 24px, padding 16px — .card-এর 20px তাকে ছোঁয়নি (ব্রাউজারের ডিফল্ট ১৬px ধরে)। চেষ্টা করুন: .card-এর font-size 30px করুন — শুধু হলুদটি বদলাবে।

যোগ করুন: font-size px-এ স্থির করলে ব্যবহারকারী ব্রাউজারের সেটিংসে ডিফল্ট লেখা বড় করলেও তা মানে না; rem বা em মানে। তাই লেখার মাপে rem অ্যাক্সেসিবিলিটির দিক থেকেও ভালো।

ঝালিয়ে নিন: পর্ব ২০ · একক আর রং

গ-০৯px আর %-এর পার্থক্য লিখুন। % সবসময় কিসের শতাংশ? — ৪ নম্বর (মাঝারি)

px একটি স্থির (absolute) একক — তবে এটি পর্দার আসল বিন্দু নয়, CSS pixel; উচ্চ-ঘনত্বের ফোনে একটি CSS pixel কয়েকটি আসল বিন্দু (device pixel ratio) জুড়ে আঁকা হয়। % একটি আপেক্ষিক একক — অন্য কোনো মাপের শতাংশ, আর কোন মাপের তা property অনুযায়ী বদলায়:

property% কিসের
width, left/rightcontaining block-এর চওড়া
padding ও margin — ওপর-নিচেরওcontaining block-এর চওড়া (উচ্চতা নয় — পরীক্ষার প্রিয় ফাঁদ)
heightcontaining block-এর উচ্চতা — কিন্তু সেটি নির্দিষ্ট না থাকলে auto-র মতো আচরণ
font-sizeমা-বাবার font-size
transform: translate()element-এর নিজের বাক্স

কখন কোনটি: border, ছায়া, ছোট স্থির মাপে px; চওড়া যাতে পাত্রের সাথে বাড়ে-কমে সেখানে % (সাথে max-width); লেখায় rem.

ঝালিয়ে নিন: পর্ব ২০

গ-১০CSS-এ রং লেখার উপায়গুলো লিখুন। oklch() কেন জনপ্রিয় হচ্ছে, আর রঙে অ্যাক্সেসিবিলিটির শর্ত কী? — ৫ নম্বর (মাঝারি)
color: crimson;                  /* নাম */
color: #0d6efd;                  /* hex — #RRGGBB, ছোট রূপ #RGB, স্বচ্ছতাসহ #RRGGBBAA */
color: rgb(13 110 253 / 80%);    /* লাল, সবুজ, নীল / alpha */
color: hsl(216 98% 52%);         /* hue, saturation, lightness */
color: oklch(60% 0.2 260);       /* lightness, chroma, hue */
border-color: currentColor;      /* নিজের color-এর মান */

oklch(): HSL-এ একই lightness-এর হলুদ আর নীল চোখে মোটেই সমান উজ্জ্বল দেখায় না। oklch মানুষের চোখের অনুভূতির কাছাকাছি করে বানানো (perceptually uniform) — L একই রাখলে রং বদলালেও উজ্জ্বলতা প্রায় একই থাকে, তাই রঙের সিঁড়ি (palette) বানানো সহজ; আর এটি sRGB-র বাইরের উজ্জ্বল রংও প্রকাশ করতে পারে। ২০২৬ সালের হিসাবে এটি Baseline Widely available.

অ্যাক্সেসিবিলিটি: WCAG AA-তে সাধারণ লেখা আর পটভূমির contrast ratio অন্তত 4.5:1, বড় লেখায় 3:1; আর শুধু রং দিয়ে তথ্য বোঝাবেন না (“লাল ঘরগুলো ভুল” — সাথে আইকন বা লেখাও দিন)।

ঝালিয়ে নিন: পর্ব ২০, পর্ব ৪৫

গ-১১Web font কীভাবে যোগ করবেন? font-display: swap আর font stack কেন দরকার? — ৫ নম্বর (মাঝারি)
@font-face {
  font-family: "Hind Siliguri";
  src: url("fonts/hind-siliguri-400.woff2") format("woff2");
  font-weight: 400;
  font-display: swap;
}
body { font-family: "Hind Siliguri", "Noto Sans Bengali", system-ui, sans-serif; }

@font-face ব্রাউজারকে ফন্ট ফাইলের ঠিকানা দেয়; আধুনিক ফরম্যাট WOFF2 (সবচেয়ে ছোট)। ফন্ট নামতে সময় লাগে — font-display: swap বলে ততক্ষণ fallback ফন্টে লেখা দেখাও, ফন্ট এলে বদলে দাও। না দিলে কিছু ব্রাউজার কিছুক্ষণ লেখা অদৃশ্য রাখে (FOIT). Font stack হলো পছন্দের তালিকা — প্রথমটি না পেলে পরেরটি, শেষে একটি generic family (sans-serif).

যোগ করুন: শুধু দরকারি weight আনুন (৪০০ আর ৭০০), বাংলা-ইংরেজির আলাদা unicode-range subset দিন, আর Google Fonts ব্যবহার করলেও নিজের সার্ভারে রাখার (self-hosting) বিকল্পটি জানুন।

ঝালিয়ে নিন: পর্ব ২১ · টাইপোগ্রাফি আর ওয়েব ফন্ট, পর্ব ১৪

আরও গভীরে: ব্রাউজার selector ডান থেকে বাঁয়ে মেলায়। nav ul li a দেখলে সে প্রথমে পাতার প্রতিটি a নেয় (একে বলে key selector), তারপর ওপরের দিকে গাছ বেয়ে দেখে তার কোনো পূর্বপুরুষ li, ul, nav কি না — কারণ বেশিরভাগ element কোনো নিয়মে মেলে না, আর ডান দিক থেকে শুরু করলে দ্রুত বাদ দেওয়া যায়। এই ওপরে-চড়া দ্রুত করতে ইঞ্জিনগুলো পূর্বপুরুষদের class আর id-র একটি সংক্ষিপ্ত ছাপ (bloom filter) রাখে। cascade-এর বিচারের ক্রম — উৎস, context, style attribute, layer, specificity, ক্রম — লেখা আছে W3C-র CSS Cascading and Inheritance Level 5 স্পেসিফিকেশনে; লিখিত পরীক্ষায় এই নামটি উল্লেখ করলে উত্তর বইয়ের মানে ওঠে।

৫ · অংশ ঘ — লেআউট (মডিউল ৪)

রিভিশনের জন্য: পর্ব ২৩, পর্ব ২৪, পর্ব ২৫, পর্ব ২৬, পর্ব ২৭, পর্ব ২৮, পর্ব ২৯.

ঘ-০১Normal flow কী? display-এর প্রধান মানগুলো লিখুন। — ৫ নম্বর (মাঝারি)

Normal flow: কোনো লেআউট-CSS না দিলে ব্রাউজার যেভাবে সাজায় — block-গুলো ওপর থেকে নিচে একটির পর একটি, আর inline-গুলো বাঁ থেকে ডানে লেখার লাইনে, জায়গা ফুরালে পরের লাইনে। ভালো লেআউট normal flow-এর বিরুদ্ধে নয়, তার ওপর গড়ে ওঠে।

মানআচরণ
blockনতুন লাইন, পুরো চওড়া
inlineলাইনের ভেতরে; width/height চলে না
inline-blockলাইনের ভেতরে বসে, কিন্তু width, height আর পূর্ণ margin চলে
noneবাক্সই তৈরি হয় না
flex / gridনিজে block, ভেতরের সন্তানদের flex বা grid নিয়মে সাজায়
inline-flex / inline-gridনিজে inline, ভেতরে flex বা grid
flow-rootblock, সাথে নতুন formatting context (float ধরে রাখে, margin বেরোতে দেয় না)
contentsনিজের বাক্স মুছে সন্তানদের সরাসরি মা-বাবার কাছে তুলে দেয়

আরও গভীরে বলতে চাইলে: আধুনিক spec-এ display আসলে দুই অংশের — বাইরের আচরণ (block না inline) আর ভেতরের সাজ (flow, flex, grid). display: inline flex লেখা inline-flex-এর সমান (two-value display).

ঝালিয়ে নিন: পর্ব ২৩ · Normal flow, display আর overflow

ঘ-০২visibility: hidden আর display: none-এর পার্থক্য লিখুন। opacity: 0 কোথায় আলাদা? — ৫ নম্বর (সহজ)
<style>
  .row span { display: inline-block; width: 64px; padding: 8px 0;
              text-align: center; background: #bfdbfe; }
  .row .vh { visibility: hidden; }
  .row .dn { display: none; }
  .row .op { opacity: 0; }
</style>
<p class="row">visibility: <span>ক</span><span class="vh">খ</span><span>গ</span></p>
<p class="row">display: <span>ক</span><span class="dn">খ</span><span>গ</span></p>
<p class="row">opacity: <span>ক</span><span class="op">খ</span><span>গ</span></p>

প্রথম আর তৃতীয় সারিতে “ক” আর “গ”-এর মাঝে একটি ফাঁকা ঘর — “খ” অদৃশ্য, কিন্তু তার জায়গা রয়ে গেছে। দ্বিতীয় সারিতে “ক” আর “গ” গায়ে গায়ে — display: none বাক্সটিকেই মুছে দিয়েছে। লক্ষ করুন, লুকানোর নিয়মগুলো .row .dn আকারে লেখা: শুধু .dn (0,1,0) লিখলে .row span-এর (0,1,1) specificity জিতত, আর display: inline-block ফিরে এসে “খ” দেখা যেত — নিজেই .row .dn থেকে .row অংশটি মুছে দেখুন। আরও চেষ্টা করুন: .row .op-এ opacity: 0.3 দিন।

বিষয়display: nonevisibility: hiddenopacity: 0
জায়গাথাকে না — বাকিরা সরে আসেথাকেথাকে
ক্লিক বা চাপনানাহ্যাঁ — অদৃশ্য অবস্থায়ও ক্লিক নেয়
Tab-এ focusনানাহ্যাঁ
screen readerপড়ে নাপড়ে নাপড়ে
সন্তান আবার দেখা যাবে?নাহ্যাঁ, সন্তানে visibility: visible দিলেনা
transitionসাধারণভাবে লাফায় (নতুন allow-discrete ছাড়া)লাফিয়ে বদলায়, তবে transition-এর পুরো সময় দৃশ্যমান থাকে — তাই opacity-র fade-এর সাথে মেলানো যায়মসৃণ fade

উপসংহার: একেবারে সরাতে display: none (বা HTML-এর hidden attribute); জায়গা রেখে লুকাতে visibility; fade-এর জন্য opacity, তবে শেষে visibility বা display দিয়ে ক্লিক আর focus বন্ধ করুন। চোখ থেকে লুকিয়ে শুধু screen reader-এর জন্য রাখতে চাইলে এগুলোর কোনোটিই নয় — visually-hidden class.

ঝালিয়ে নিন: পর্ব ২৩, পর্ব ১২

ঘ-০৩CSS-এর পাঁচটি position মান — static, relative, absolute, fixed, sticky — চিত্র ও উদাহরণসহ ব্যাখ্যা করুন। — ১০ নম্বর (কঠিন)

সংজ্ঞা: position ঠিক করে একটি element normal flow-তে থাকবে কি না, আর top, right, bottom, left (একসাথে inset) কিসের সাপেক্ষে মাপা হবে।

মানflow-তে জায়গাকিসের সাপেক্ষেসাধারণ ব্যবহার
static (ডিফল্ট)থাকেtop/left কাজ করে নাসাধারণ লেখা
relativeথাকে — পুরোনো জায়গা ফাঁকা থাকেনিজের স্বাভাবিক জায়গাসামান্য সরানো; absolute সন্তানের ভিত্তি
absoluteথাকে নাসবচেয়ে কাছের positioned পূর্বপুরুষ (static নয় এমন); না থাকলে প্রাথমিক containing blockকার্ডের কোণে badge, dropdown
fixedথাকে নাviewport — স্ক্রল করলেও স্থিরchat বোতাম, cookie-বার্তা
stickyথাকেস্ক্রল করে সীমায় (যেমন top: 0) পৌঁছানো পর্যন্ত স্বাভাবিক, তারপর আটকে থাকে — মা-বাবার বাক্সের ভেতরেইটেবিলের শিরোনাম, পাতার header
.card  { position: relative; }              ┌──────── .card ────────┐
.badge { position: absolute;                │                  [NEW]│ ← top: 8px
         top: 8px; right: 8px; }            │   product photo       │   right: 8px
                                            │   Tk 450              │
                                            └───────────────────────┘
badge flow থেকে বেরিয়ে গেছে — কার্ডের লেখা তার জন্য জায়গা রাখে না।

সূক্ষ্ম তথ্য (এখানেই বেশি নম্বর): (১) কোনো পূর্বপুরুষে transform, filter বা কিছু contain মান থাকলে সে-ই absolute আর এমনকি fixed সন্তানের containing block হয়ে যায় — তখন fixed আর পর্দায় স্থির থাকে না। (২) sticky কাজ না করার সাধারণ কারণ: top-এর মতো কোনো সীমা দেওয়া হয়নি, বা কোনো পূর্বপুরুষে overflow: hidden/auto আছে, ফলে সে সেই পূর্বপুরুষের ভেতরেই আটকায়। (৩) position static নয় এমন element-এ z-index কাজ করে (flex ও grid item-এও)।

উপসংহার: পাতার লেআউট position দিয়ে নয় — flex আর grid দিয়ে; position রাখুন স্তরের ওপর ভাসানো ছোট জিনিসের জন্য। আর fixed বা sticky header যেন লেখা ঢেকে না দেয়, সেজন্য scroll-padding-top. মডেল কোড: অংশ ৮-এর কো-০৬।

ঝালিয়ে নিন: পর্ব ২৪ · position আর z-index

ঘ-০৪z-index: 9999 দেওয়ার পরও একটি element অন্যটির ওপরে আসছে না। কেন? stacking context ব্যাখ্যা করুন। — ৫ নম্বর (কঠিন)

Stacking context হলো স্তরের একটি আলাদা দল। একটি দলের ভেতরের element-গুলো নিজেদের মধ্যে z-index অনুযায়ী সাজে, কিন্তু পুরো দলটি বাইরের জগতে একটিই স্তর হিসেবে বসে। তাই মা-বাবার z-index 1 হলে ভেতরের সন্তানের z-index 9999 হলেও সে z-index 2 থাকা মা-বাবার ভাইয়ের ওপরে উঠতে পারে না — যেমন একটি দালানের পাঁচতলা কখনো পাশের উঁচু দালানের দশতলার ওপরে ওঠে না।

নতুন stacking context তৈরি করে: <html>; position দেওয়া আর z-index auto নয় এমন element; position: fixed বা sticky; opacity ১-এর কম; transform, filter; isolation: isolate; z-index দেওয়া flex/grid item ইত্যাদি।

সমাধান: DevTools-এ দেখুন কোন পূর্বপুরুষ context বানাচ্ছে; z-index দিন context-এর মূলে, ভেতরে নয়; অথবা modal আর মেনুর জন্য <dialog> বা popover ব্যবহার করুন — তারা top layer-এ বসে, সব context-এর ওপরে। z-index-এর জন্য ছোট একটি মাপের সিঁড়ি (১, ১০, ১০০) রাখুন, ৯৯৯৯-এর প্রতিযোগিতা নয়।

ঝালিয়ে নিন: পর্ব ২৪

ঘ-০৫overflow-এর মানগুলো লিখুন। লম্বা লেখার শেষে “…” কীভাবে দেখাবেন? — ৩ নম্বর (সহজ)

overflow ঠিক করে বাক্সের বাইরে উপচে পড়া বিষয়বস্তুর কী হবে: visible (ডিফল্ট — বাইরে দেখা যায়), hidden (কেটে যায়, তবে স্ক্রিপ্টে স্ক্রল করা যায়), clip (একেবারে কাটা, স্ক্রল-পাত্রও হয় না), scroll (সবসময় স্ক্রলবার), auto (দরকার হলে স্ক্রলবার)। overflow-x আর overflow-y আলাদা করেও দেওয়া যায়।

.title {
  white-space: nowrap;      /* এক লাইনে রাখো */
  overflow: hidden;         /* বাড়তিটা কাটো */
  text-overflow: ellipsis;  /* কাটা জায়গায় … */
}

একাধিক লাইনের পর “…” দিতে line-clamp কৌশল (পর্ব ২৩)। সাবধান: hidden বা auto দিলে বাক্সটি স্ক্রল-পাত্র হয়ে যায়, আর তার ভেতরের position: sticky তখন পাতার নয়, এই বাক্সের স্ক্রলের সাপেক্ষে আটকায়।

ঝালিয়ে নিন: পর্ব ২৩

ঘ-০৬Flexbox-এর main axis আর cross axis কী? justify-content আর align-items-এর পার্থক্য লিখুন। — ৫ নম্বর (মাঝারি)

Flexbox এক দিকে সাজানোর লেআউট। পাত্রে display: flex দিলে সরাসরি সন্তানেরা হয় flex item, আর তারা সাজে main axis বরাবর — flex-direction: row-এ বাঁ থেকে ডানে (বাংলা-ইংরেজির মতো বাঁ-থেকে-ডান লেখায়), column-এ ওপর থেকে নিচে। তার আড়াআড়ি দিকটি cross axis.

flex-direction: row
            main axis ─────────────►
  ┌────────────────────────────────────┐  ▲
  │ [Logo]  [Home] [Courses] [Contact] │  │ cross axis
  └────────────────────────────────────┘  ▼
  • justify-content — main axis বরাবর বাড়তি জায়গা ভাগ: flex-start, center, space-between, space-around, space-evenly.
  • align-items — cross axis বরাবর প্রতিটি item-এর অবস্থান: stretch (ডিফল্ট), flex-start, center, baseline.

ফাঁদ: flex-direction: column দিলে অক্ষ দুটি অদলবদল হয় — তখন justify-content কাজ করে ওপর-নিচে, align-items ডানে-বাঁয়ে। আর item-গুলোর মাঝে ফাঁক দিতে margin নয়, gap.

ঝালিয়ে নিন: পর্ব ২৫ · Flexbox

ঘ-০৭flex: 1 লিখলে আসলে কী হয়? flex-grow, flex-shrink, flex-basis ব্যাখ্যা করুন। — ৫ নম্বর (মাঝারি)

flex তিনটি property-র সংক্ষিপ্ত রূপ: flex-grow (বাড়তি জায়গার কত ভাগ নেবে), flex-shrink (জায়গা কম পড়লে কত ভাগ ছাড়বে), flex-basis (ভাগাভাগির আগে শুরুর মাপ)।

লিখলেমানেফল
(কিছু না — প্রাথমিক মান)0 1 autoনিজের মাপে; বাড়ে না, দরকারে ছোট হয়
flex: 11 1 0%শুরুর মাপ শূন্য ধরে পুরো জায়গা সমান ভাগ — লেখা যত বড়ই হোক, সমান চওড়া
flex: auto1 1 autoনিজের মাপের পর বাড়তি জায়গা সমান ভাগ — বড় লেখার item বড়ই থাকে
flex: none0 0 autoএকেবারে স্থির

পরীক্ষার প্রিয় ফাঁদ: flex: 1 দেওয়া item-এর ভেতরে লম্বা URL বা চওড়া টেবিল থাকলে সে ছোট হতে চায় না, পাতা পাশে সরে যায়। কারণ flex item-এর min-width-এর ডিফল্ট auto — সে নিজের ভেতরের সবচেয়ে চওড়া জিনিসের (min-content) চেয়ে ছোট হয় না। সমাধান: item-এ min-width: 0.

ঝালিয়ে নিন: পর্ব ২৫, পর্ব ২৬

ঘ-০৮Flexbox আর CSS Grid-এর পার্থক্য লিখুন। কখন কোনটি ব্যবহার করবেন? — ৮ নম্বর (মাঝারি)

সংজ্ঞা: Flexbox এক মাত্রার লেআউট — একবারে একটি সারি অথবা একটি কলাম। CSS Grid দুই মাত্রার — সারি আর কলাম একসাথে, যেন একটি ছকে ঘর ভাগ করা।

বিষয়FlexboxGrid
মাত্রাএক (row বা column)দুই (row ও column)
ভাবনার দিকবিষয়বস্তু থেকে বাইরে — item-এর মাপ দেখে জায়গা ভাগলেআউট থেকে ভেতরে — আগে ছক, পরে item বসানো
wrap হলেপ্রতিটি লাইন স্বাধীন — নিচের item ওপরের সাথে কলামে মেলে নাসব সারির কলাম একই রেখায়
নির্দিষ্ট ঘরে বসানোসহজ নয়grid-column, grid-area, grid-template-areas
একইgap, justify-*/align-* দিয়ে সাজানো, দুটিই Baseline Widely available
ভালো কাজnavbar, বোতামের সারি, কার্ডের ভেতরের সাজ, মাঝখানে বসানোপুরো পাতার কাঠামো, কার্ডের গ্যালারি, ড্যাশবোর্ড, ফর্মের লেবেল-ঘর
<style>
  .flex, .grid { width: 320px; gap: 8px; margin-bottom: 12px; }
  .flex { display: flex; flex-wrap: wrap; }
  .flex div { flex: 1 1 80px; }
  .grid { display: grid; grid-template-columns: repeat(3, 1fr); }
  .flex div, .grid div { background: #c7d2fe; padding: 8px; }
</style>
<p>flex + wrap:</p>
<div class="flex"><div>চাল</div><div>ডাল</div><div>তেল</div><div>লবণ</div><div>চিনি</div></div>
<p>grid, ৩ কলাম:</p>
<div class="grid"><div>চাল</div><div>ডাল</div><div>তেল</div><div>লবণ</div><div>চিনি</div></div>

ওপরে flex: প্রথম লাইনে তিনটি, দ্বিতীয় লাইনে “লবণ” আর “চিনি” বেড়ে পুরো লাইন ভাগ করে নিয়েছে — ওপরের কলামের সাথে মেলেনি, কারণ flex-এর প্রতিটি লাইন স্বাধীন। নিচে grid: দ্বিতীয় সারির দুটি ঘর ঠিক ওপরের প্রথম দুই কলামের নিচে, তৃতীয় ঘর খালি। চেষ্টা করুন: .flex div-এ flex: 0 0 80px দিন — flex-ও দেখতে ছকের মতো হবে, কিন্তু চওড়া হাতে ঠিক করে দিতে হলো।

উপসংহার: প্রতিযোগিতা নয়, সহযোগিতা — পাতার কাঠামো grid-এ, প্রতিটি কার্ডের ভেতরের সারি flex-এ। এক লাইনে মনে রাখুন: “এক দিকে সাজাতে flex, ছকে বসাতে grid.”

ঝালিয়ে নিন: পর্ব ২৫, পর্ব ২৭, পর্ব ২৯

ঘ-০৯Grid-এ fr, repeat(), minmax() ব্যাখ্যা করুন। auto-fill আর auto-fit-এর পার্থক্য কী? — ৮ নম্বর (কঠিন)
  • fr — স্থির মাপের track বসানোর পর বাকি জায়গার এক ভাগ। 200px 1fr 2fr: প্রথম কলাম 200px, বাকি জায়গার এক-তৃতীয়াংশ দ্বিতীয়টি, দুই-তৃতীয়াংশ তৃতীয়টি।
  • repeat(3, 1fr) — একই track বারবার না লিখে।
  • minmax(200px, 1fr) — track অন্তত 200px, জায়গা থাকলে এক ভাগ পর্যন্ত বাড়বে।
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
  gap: 1rem;
}

এই এক লাইনেই media query ছাড়া রেসপন্সিভ গ্যালারি: যত কলাম ২০০px করে ধরে, ততটি; ফোনে একটি। min(200px, 100%) খুব সরু পর্দায় 200px-এর চেয়ে ছোট পাত্রেও উপচে পড়া আটকায়।

auto-fill বনাম auto-fit: দুটিই যতগুলো কলাম ধরে ততগুলো বানায়। পার্থক্য দেখা যায় শুধু item কম হলে — ধরুন ১০০০px চওড়া পাত্রে মাত্র দুটি কার্ড। auto-fill খালি কলামগুলোও রেখে দেয়, তাই দুটি কার্ড বাঁয়ে ২০০px-এর কাছাকাছি চওড়ায় বসে, ডানে ফাঁকা। auto-fit খালি কলামগুলোকে শূন্যে গুটিয়ে ফেলে, তাই দুটি কার্ড বেড়ে পুরো চওড়া ভাগ করে নেয়। কার্ড বেশি হলে দুটি একই রকম দেখায়।

ঝালিয়ে নিন: পর্ব ২৭, পর্ব ২৮ · auto-fit, minmax আর subgrid

ঘ-১০float কী কাজে এসেছিল? আজ পাতার লেআউটে float ব্যবহার করা কি ঠিক? — ৩ নম্বর (সহজ)

float এসেছিল পত্রিকার মতো লেখা ছবির চারপাশে ঘোরানোর জন্য — ছবি বাঁয়ে, লেখা তার ডানে আর নিচে বয়ে চলে। ২০০০-এর দশকে আর কোনো ভালো উপায় না থাকায় ডেভেলপাররা float দিয়েই কলাম-লেআউট বানাতেন; float-এর পরে মা-বাবার উচ্চতা ভেঙে পড়ত, তাই লাগত clearfix-এর মতো কৌশল।

আজ লেআউটের জন্য float ঠিক নয় — flexbox আর grid পরিষ্কার, রেসপন্সিভ আর অ্যাক্সেসিবল। float-এর নিজের আসল কাজটি অবশ্য এখনো বৈধ: লেখার ভেতরে ছবি ঘোরানো, আর shape-outside দিয়ে গোল বা বাঁকা আকারে লেখা বওয়ানো। পরীক্ষায় float-ভিত্তিক লেআউট লিখলে তা পুরোনো অভ্যাস হিসেবে ধরা হতে পারে।

ঝালিয়ে নিন: পর্ব ২৩

৬ · অংশ ঙ — রেসপন্সিভ, আধুনিক CSS, মোশন ও পলিশ (মডিউল ৫–৬)

রিভিশনের জন্য — মডিউল ৫: পর্ব ৩০, পর্ব ৩১, পর্ব ৩২, পর্ব ৩৩, পর্ব ৩৪, পর্ব ৩৫, পর্ব ৩৬, পর্ব ৩৭. মডিউল ৬: পর্ব ৩৮, পর্ব ৩৯, পর্ব ৪০, পর্ব ৪১, পর্ব ৪২, পর্ব ৪৩, পর্ব ৪৪, পর্ব ৪৫.

ঙ-০১Responsive web design কী? viewport meta tag আর mobile-first পদ্ধতি ব্যাখ্যা করুন। — ৮ নম্বর (মাঝারি)

সংজ্ঞা: Responsive design মানে একই HTML আর CSS দিয়ে বানানো পাতা ফোন, ট্যাবলেট, ল্যাপটপ — সব পর্দায় নিজেকে মানিয়ে নেয়; আলাদা “মোবাইল সাইট” লাগে না। ২০১০ সালে Ethan Marcotte শব্দটি জনপ্রিয় করেন, তিনটি উপাদান দিয়ে: নমনীয় (fluid) গ্রিড, নমনীয় ছবি আর media query. আজ এর সাথে যোগ হয়েছে flexbox, grid, container query আর clamp().

Viewport meta: <meta name="viewport" content="width=device-width, initial-scale=1">. এটি না থাকলে ফোনের ব্রাউজার ধরে নেয় পাতাটি ডেস্কটপের জন্য — প্রায় ৯৮০px চওড়ায় সাজিয়ে পুরোটা ছোট করে দেখায়; লেখা পিঁপড়ের মতো, আর কোনো media query ঠিকমতো কাজ করে না। কখনো user-scalable=no দেবেন না — যাঁদের লেখা বড় করে পড়তে হয়, তাঁদের আটকে দেয়।

Mobile-first: আগে ছোট পর্দার সরল CSS লিখুন (এক কলাম), তারপর min-width media query দিয়ে বড় পর্দায় ধাপে ধাপে যোগ করুন।

.grid { display: grid; gap: 1rem; }                 /* ফোন: এক কলাম */
@media (min-width: 40em) {                          /* ≈ 640px */
  .grid { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 64em) {                          /* ≈ 1024px */
  .grid { grid-template-columns: repeat(3, 1fr); }
}

কেন mobile-first: বাংলাদেশে অনেক মানুষের প্রথম — অনেকের একমাত্র — ইন্টারনেট ডিভাইস ফোন; সবচেয়ে সীমিত পরিবেশ আগে ভাবলে বিষয়বস্তুর অগ্রাধিকার পরিষ্কার হয়; আর ফোন কম CSS নিয়ম পড়ে। breakpoint বাছুন বিষয়বস্তু দেখে — যেখানে নকশা ভাঙে — কোনো নির্দিষ্ট ফোনের নাম দেখে নয়।

ঝালিয়ে নিন: পর্ব ৩০ · রেসপন্সিভ ডিজাইন

ঙ-০২Media query আর container query-র পার্থক্য লিখুন। — ৫ নম্বর (মাঝারি)
বিষয়Media queryContainer query
কী দেখেপুরো viewport আর ডিভাইস — চওড়া, orientation, hover, prefers-color-scheme, printকাছের container-এর মাপ (চওড়া/উচ্চতা)
লেখা@media (width >= 600px) { … }পাত্রে container-type: inline-size; তারপর @container (width >= 400px) { … }
প্রশ্নটি“পর্দা কত বড়?”“আমাকে কত জায়গা দেওয়া হয়েছে?”
ভালো কাজপাতার কাঠামো, মানুষের পছন্দ (dark mode, কম মোশন)পুনর্ব্যবহারযোগ্য component — একই কার্ড sidebar-এ সরু, main-এ চওড়া
এককvw, vh, dvhcqi, cqw …
সাপোর্টবহু বছর ধরে সব জায়গায়size query Baseline Widely available; style query আর scroll-state query এখনো Baseline নয়

উপসংহার: দুটি একে অপরের বিকল্প নয়। পাতা আর মানুষের পছন্দের জন্য media query, component-এর জন্য container query. একটি সতর্কতা: container নিজের মাপ সন্তানের মাপ থেকে নিতে পারে না — তাই যার ওপর container-type দিচ্ছেন, তার চওড়া বাইরের লেআউট থেকেই আসতে হবে।

ঝালিয়ে নিন: পর্ব ৩১ · Media query আর container query

ঙ-০৩রেসপন্সিভ ছবির জন্য srcset, sizes আর <picture> ব্যাখ্যা করুন। — ৮ নম্বর (কঠিন)

সমস্যা: ২০০০px চওড়া একটি ছবি ৩৬০px-এর ফোনেও নামলে ডেটা আর সময় নষ্ট; আবার ছোট ছবি বড় পর্দায় ঝাপসা। সমাধান দুই ধরনের: একই ছবির কয়েকটি মাপ থেকে ব্রাউজারকে বাছতে দেওয়া (resolution switching), আর পর্দা অনুযায়ী আলাদা কাটা বা ফরম্যাটের ছবি দেওয়া (art direction).

<img src="saree-800.jpg"
     srcset="saree-400.jpg 400w, saree-800.jpg 800w, saree-1600.jpg 1600w"
     sizes="(min-width: 64em) 33vw, 100vw"
     width="800" height="600" alt="লাল জামদানি শাড়ি" loading="lazy">
  • srcset — কোন কোন ফাইল আছে, প্রতিটি কত পিক্সেল চওড়া (w); বা স্থির মাপের ছবিতে 1x, 2x.
  • sizes — পাতায় ছবিটি কত চওড়া দেখাবে: বড় পর্দায় viewport-এর এক-তৃতীয়াংশ, নইলে পুরো। ব্রাউজার এই মাপকে পর্দার pixel ঘনত্ব দিয়ে গুণ করে সবচেয়ে মানানসই ফাইল বাছে — CSS লোড হওয়ার আগেই, তাই sizes-এর তথ্য দরকার।
  • src — যে ব্রাউজার srcset বোঝে না, তার জন্য।
<picture>
  <source media="(width < 40em)" srcset="hero-square.jpg">
  <source type="image/avif" srcset="hero.avif">
  <source type="image/webp" srcset="hero.webp">
  <img src="hero.jpg" width="1200" height="600" alt="…" fetchpriority="high">
</picture>

<picture>-এ ব্রাউজার ওপর থেকে প্রথম মেলা <source> নেয়, আর কিছু না মিললে <img>. তাই media-যুক্ত source সবার আগে লিখুন — AVIF-এর source আগে থাকলে AVIF-চেনা ব্রাউজার সেটিই নিয়ে নেয়, ফোনের বর্গাকার ছবিটি আর কখনো আসে না। alt, width, height সবসময় <img>-এ — picture নিজে কিছু দেখায় না।

উপসংহার: প্রধান (hero) ছবিতে lazy নয়, fetchpriority="high" (Baseline Newly available — না চিনলে চুপচাপ উপেক্ষা); নিচের ছবিতে loading="lazy"; সব ছবিতে width আর height. AVIF আর WebP দুটিই এখন Baseline.

ঝালিয়ে নিন: পর্ব ৩২ · রেসপন্সিভ ছবি

ঙ-০৪CSS custom property (CSS variable) কী? উদাহরণসহ লিখুন। — ৫ নম্বর (মাঝারি)

সংজ্ঞা: Custom property হলো -- দিয়ে শুরু হওয়া নিজের বানানো property, যার মান var() দিয়ে অন্য জায়গায় ব্যবহার করা যায়। একবার লিখে বারবার ব্যবহার — রং বদলাতে একটি জায়গাই বদলাতে হয়।

:root {
  --brand: oklch(55% 0.2 260);
  --space: 1rem;
}
.btn { background: var(--brand); padding: var(--space) calc(var(--space) * 2); }
.btn.danger { --brand: crimson; }          /* শুধু এই বোতামে বদল */
.note { color: var(--note-color, gray); }  /* না থাকলে fallback: gray */

কীভাবে কাজ করে: এরা সাধারণ property-র মতোই cascade আর inheritance মানে — :root-এ দিলে সব element পায়, আর ভেতরের কোনো element-এ নতুন মান দিলে শুধু সেই শাখায় বদলায়। মান ঠিক হয় ব্রাউজারে, পাতা চলার সময়, তাই media query, :hover, dark mode বা JavaScript-এর style.setProperty('--brand', …) দিয়ে চলন্ত অবস্থায় বদলানো যায়।

সীমা: ভুল মান হলে ব্রাউজার আগে থেকে ধরতে পারে না — ব্যবহারের জায়গায় declaration-টি অকার্যকর হয়ে প্রাথমিক বা উত্তরাধিকারের মানে ফেরে। টাইপ দিতে চাইলে @property (Baseline Newly available). আর media query-র শর্তের ভেতরে (@media (width >= var(--bp))) var() চলে না।

ঝালিয়ে নিন: পর্ব ৩৩ · CSS variable

ঙ-০৫Pseudo-class আর pseudo-element-এর পার্থক্য লিখুন। — ৫ নম্বর (সহজ)
বিষয়Pseudo-classPseudo-element
কী বোঝায়element-এর একটি অবস্থা বা অবস্থানelement-এর একটি অংশ, বা নতুন বানানো অংশ
চিহ্নএক কোলন :দুই কোলন :: (পুরোনো চারটিতে এক কোলনও চলে)
উদাহরণ:hover, :focus-visible, :checked, :nth-child(2n), :has()::before, ::after, ::first-line, ::placeholder, ::marker, ::selection
specificityclass-এর সমান (0,1,0)type-এর সমান (0,0,1)
DOM-এ আছে?element তো আছেইনা — ব্রাউজার আঁকার সময় বানায়; ::before/::after-এ content বাধ্যতামূলক

সতর্কতা: ::before-এ দেওয়া লেখা অনেক screen reader পড়ে, কিন্তু কপি বা নির্বাচন করা যায় না। জরুরি তথ্য তাই HTML-এ রাখুন; সাজের চিহ্নের জন্য alt text দিতে content: "★" / ""; লেখা যায়।

ঝালিয়ে নিন: পর্ব ৩৪ · Pseudo-class আর pseudo-element

ঙ-০৬:has()-কে “parent selector” বলা হয় কেন? দুটি ব্যবহার দেখান। — ৪ নম্বর (মাঝারি)

বহু বছর CSS-এ শুধু নিচের বা পরের দিকে দেখা যেত — “এই element-এর ভেতরে কী আছে তা দেখে এই element-কে সাজাও” বলা যেত না, তাই JavaScript দিয়ে class বসাতে হতো। :has() সেটি সম্ভব করেছে: বাইরের element-টি ধরা পড়ে, যদি তার ভেতরে (বা পরে) বন্ধনীর selector মেলে।

/* ছবি আছে এমন কার্ড দুই কলামে */
.card:has(img) { display: grid; grid-template-columns: 120px 1fr; }

/* ফর্মের কোনো ঘর ভুল হলে জমার বোতাম ফ্যাকাশে */
form:has(:user-invalid) button[type="submit"] { opacity: .6; }

/* required ঘরের ঠিক আগের label-এ তারকা */
label:has(+ input:required)::after { content: " *"; }

Safari আর Chrome ২০২২-এ, Firefox ২০২৩-এর ডিসেম্বরে যোগ দেয় — এখন Baseline Widely available. specificity নেয় বন্ধনীর ভেতরের সবচেয়ে ভারী selector-এর মান।

ঝালিয়ে নিন: পর্ব ৩৪

ঙ-০৭আধুনিক CSS-এর তিনটি সুবিধা — clamp(), logical property আর nesting — উদাহরণসহ লিখুন। — ৫ নম্বর (মাঝারি)
  • clamp(min, পছন্দ, max): font-size: clamp(1.25rem, 1rem + 2vw, 2.5rem); — পর্দার সাথে শিরোনাম মসৃণভাবে বাড়ে, কিন্তু কখনো ২০px-এর কম বা ৪০px-এর বেশি নয়; media query ছাড়াই fluid typography. মাঝের মানে rem রাখুন, যাতে ব্যবহারকারী zoom করলেও লেখা বাড়ে। Widely available.
  • Logical property: margin-inline, padding-block, inline-size — বাঁ-ডান নয়, লেখার দিক অনুযায়ী শুরু-শেষ। একই CSS আরবি বা উর্দুর মতো ডান-থেকে-বাঁ ভাষাতেও ঠিক থাকে। Widely available.
  • Nesting: Sass ছাড়াই নিয়মের ভেতরে নিয়ম —
.card {
  padding: 1rem;
  &:hover { box-shadow: 0 4px 12px rgb(0 0 0 / .15); }
  .title { font-weight: 700; }      /* = .card .title */
}

Nesting ২০২৩-এর ডিসেম্বরে Baseline Newly available হয়; প্রায় আড়াই বছরের হিসাবে ২০২৬-এর মাঝামাঝি Widely available. খুব পুরোনো ব্রাউজার লক্ষ্য হলে build টুল দিয়ে সমতল করে নিন।

ঝালিয়ে নিন: পর্ব ৩৫ · আধুনিক CSS

ঙ-০৮একটি সাইটে dark mode কীভাবে যোগ করবেন? — ৫ নম্বর (মাঝারি)
:root {
  color-scheme: light dark;            /* ফর্মের ঘর, scrollbar-ও মানাবে */
  --surface: #ffffff;  --text: #1f2937;
}
@media (prefers-color-scheme: dark) {
  :root { --surface: #121417; --text: #e5e7eb; }
}
body { background: var(--surface); color: var(--text); }
  1. color-scheme ব্রাউজারকে জানায় পাতা দুই থিমই সামলায়।
  2. অর্থবহ variable (--surface, --text) — থিম বদল মানে শুধু এদের মান বদল।
  3. prefers-color-scheme দিয়ে সিস্টেমের পছন্দ মানা; আধুনিক বিকল্প light-dark(#fff, #121417) (Baseline Newly available).
  4. নিজের বোতাম: <html data-theme="dark"> বসানো আর পছন্দটি localStorage-এ রাখা — কাজটি head-এর ছোট script-এ CSS আঁকার আগেই, নইলে খোলার মুহূর্তে সাদা ঝলক দেখা যায়।
  5. নকশা: খাঁটি কালো নয়, গাঢ় ধূসর; কম উজ্জ্বল রং; আর দুই থিমেই আলাদা করে contrast যাচাই।

ঝালিয়ে নিন: পর্ব ৩৬ · Dark mode আর থিম

ঙ-০৯CSS transition আর animation-এর পার্থক্য লিখুন। — ৫ নম্বর (মাঝারি)
বিষয়TransitionAnimation
শুরু হয় কীভাবেকোনো মান বদলালে — hover, focus, class যোগনিজে থেকেই, নিয়মটি লাগার সাথে সাথে
ধাপদুটি — আগের মান থেকে নতুন মানযতগুলো খুশি — @keyframes-এ 0%, 50%, 100% …
পুনরাবৃত্তিনা — একবার যায়, অবস্থা ফিরলে ফেরেanimation-iteration-count: infinite, alternate
নিয়ন্ত্রণproperty, duration, timing function, delayএগুলো ছাড়াও direction, fill-mode, play-state (থামানো)
ভালো কাজবোতামের hover, মেনু খোলা-বন্ধলোডার, skeleton screen, মনোযোগ টানা
.btn {
  padding: .6rem 1.2rem; border: 0; border-radius: 8px;
  background: #2563eb; color: #fff; font: inherit;
  transition: background-color .3s ease, transform .3s ease;
}
.btn:hover, .btn:focus-visible { background: #1e40af; transform: translateY(-3px); }

.dot {
  display: inline-block; width: 14px; height: 14px; margin: 0 .5rem 0 2rem;
  border-radius: 50%; background: #16a34a;
  animation: pulse .8s ease-in-out infinite alternate;
}
@keyframes pulse { from { transform: scale(1); } to { transform: scale(1.6); } }

@media (prefers-reduced-motion: reduce) {
  .btn { transition: none; }
  .dot { animation: none; }
}

বাঁয়ে নীল বোতাম, ডানে একটি সবুজ বিন্দু যা নিজে থেকেই বড়-ছোট হচ্ছে — animation কোনো ঘটনার অপেক্ষা করে না। বোতামটি স্থির; মাউস রাখলে বা Tab দিয়ে focus দিলে তবেই ৩০০ মিলিসেকেন্ডে গাঢ় নীল হয়ে একটু ওপরে ওঠে — transition. আপনার কম্পিউটারে “কম মোশন” (reduce motion) চালু থাকলে দুটিই থেমে থাকবে। চেষ্টা করুন: .3s-কে 1.5s করুন, আর alternate মুছে দেখুন বিন্দুটি কেমন লাফিয়ে ফেরে।

উপসংহার: দুটিতেই সস্তায় মসৃণ চলে transform আর opacity; আর দুটিতেই prefers-reduced-motion মানা বাধ্যতামূলক অভ্যাস।

ঝালিয়ে নিন: পর্ব ৩৮ · Transition, পর্ব ৩৯ · Keyframe animation

ঙ-১০অ্যানিমেশনে left/top না বদলে transform ব্যবহার করতে বলা হয় কেন? — ৫ নম্বর (কঠিন)

প্রতিটি ফ্রেমে ব্রাউজারের কাজের ধাপ: style → layout → paint → composite. মসৃণ ৬০ fps-এ প্রতি ফ্রেমের জন্য সময় মাত্র ১৬.৭ মিলিসেকেন্ডের মতো।

  • left, top, width, margin বদলালে প্রতি ফ্রেমে আবার layout — আশপাশের বাক্সের মাপও নতুন করে হিসাব — তারপর paint. কম দামের ফোনে ফ্রেম পড়ে যায়, অ্যানিমেশন হোঁচট খায় (jank).
  • transform আর opacity লেআউটে কোনো প্রভাব ফেলে না — আশপাশের কিছু সরে না। ব্রাউজার প্রায়ই element-টিকে আলাদা স্তরে রেখে শুধু composite ধাপে GPU দিয়ে সরায়, যা main thread ব্যস্ত থাকলেও চলতে পারে (compositor thread).

সীমা: will-change: transform দিয়ে আগাম স্তর বানানো যায়, কিন্তু সব জায়গায় দিলে মেমরি খরচ বাড়ে — শুধু সত্যিই সমস্যা হলে, মেপে। আর filter বা box-shadow-এর বড় অ্যানিমেশন paint-ভারী। DevTools-এর Performance প্যানেলে মেপে নিশ্চিত হোন।

ঝালিয়ে নিন: পর্ব ৪০ · Transform, পর্ব ৩৮

ঙ-১১SVG আর <canvas>-এর পার্থক্য লিখুন। — ৫ নম্বর (মাঝারি)
বিষয়SVGcanvas
ধরনvector — XML-এ লেখা আকারের বর্ণনাraster — JavaScript দিয়ে পিক্সেলে আঁকা ছবি
DOM-এপ্রতিটি আকার একটি element (ব্রাউজার মনে রাখে — retained mode)একটিই element; ভেতরে কী আঁকা তা ব্রাউজার জানে না (immediate mode)
বড় করলেযেকোনো মাপে ঝকঝকেঝাপসা, যদি না নতুন মাপে আবার আঁকা হয়
CSS ও ঘটনাfill, stroke, :hover, প্রতিটি আকারে clickCSS দিয়ে ভেতরটা সাজানো যায় না; কোন বিন্দুতে ক্লিক, তা হাতে হিসাব
অ্যাক্সেসিবিলিটি<title>, লেখা নির্বাচনযোগ্যনিজে থেকে কিছু নেই — fallback লেখা বা ARIA লাগে
পারফরম্যান্সহাজার হাজার আকারে ধীর হয়লাখো বিন্দু বা প্রতি ফ্রেমে নতুন ছবিতে ভালো
ভালো কাজলোগো, আইকন, মানচিত্র, সরল চার্টগেম, ছবি সম্পাদনা, বিশাল ডেটার চার্ট

ঝালিয়ে নিন: পর্ব ৪৪ · SVG আর আইকন

ঙ-১২CSS লেখার সময় অ্যাক্সেসিবিলিটির কোন কোন দিক মাথায় রাখবেন? — ৮ নম্বর (মাঝারি)
  1. Focus দেখা যাক: outline: none দিয়ে বিকল্প না দিলে কি-বোর্ডের ব্যবহারকারী জানেন না কোথায় আছেন। :focus-visible দিয়ে স্পষ্ট দাগ দিন — কি-বোর্ডে দেখাবে, মাউস-ক্লিকে সাধারণত নয়।
  2. Contrast: সাধারণ লেখা 4.5:1, বড় লেখা ও বোতামের সীমানার মতো অ-লেখা অংশ 3:1.
  3. কম মোশন: @media (prefers-reduced-motion: reduce)-এ বড় নড়াচড়া বন্ধ বা ছোট — বড় নড়াচড়ায় কারো কারো মাথা ঘোরে।
  4. বড় লেখা ও zoom: লেখা rem-এ, যাতে ২০০% পর্যন্ত বড় করলেও কিছু না কাটে; ৩২০ CSS pixel চওড়ায়ও পাশে স্ক্রল ছাড়া পড়া যায় (WCAG-এর reflow শর্ত)।
  5. চাপার জায়গা: WCAG 2.2-এ AA স্তরে অন্তত ২৪×২৪ CSS pixel-এর লক্ষ্য (বা যথেষ্ট ফাঁক)।
  6. শুধু রঙে নয়: ভুল ঘর লাল করার সাথে বার্তা বা আইকন; লিংক শুধু রঙে নয়, underline-এও চেনা যাক।
  7. লুকানোর ঠিক উপায়: চোখে লুকিয়ে screen reader-এ রাখতে visually-hidden class; উচ্চ-contrast মোডে (forced colors) নকশা ভাঙছে কি না দেখা।

ঝালিয়ে নিন: পর্ব ৪৫ · অ্যাক্সেসিবল CSS, পর্ব ৪৩

ঙ-১৩সংক্ষেপে: cookie, localStorage আর sessionStorage-এর পার্থক্য কী? — ৩ নম্বর (সহজ)
বিষয়CookielocalStoragesessionStorage
সার্ভারে যায়?হ্যাঁ — সেই সাইটের প্রতিটি request-এ নিজে থেকেনানা
আকারপ্রতিটি মোটামুটি ৪ KBকয়েক MB (ব্রাউজারভেদে আলাদা)কয়েক MB
কতদিন থাকেমেয়াদ (Max-Age/Expires) পর্যন্ত, বা ব্রাউজার বন্ধ পর্যন্তমুছে না ফেলা পর্যন্তট্যাবটি বন্ধ হওয়া পর্যন্ত
JavaScript পড়তে পারে?হ্যাঁ, যদি না HttpOnlyহ্যাঁ — একই originহ্যাঁ — একই origin, একই ট্যাব
উদাহরণলগইন session (HttpOnly; Secure; SameSite)dark mode-এর পছন্দএক ট্যাবে ফর্মের খসড়া

লগইন token localStorage-এ রাখবেন না — পাতায় কোনো XSS দুর্বলতা থাকলে যেকোনো script সেটি পড়তে পারে। বিস্তারিত JavaScript কোর্সে: Web Storage পর্ব.

ঝালিয়ে নিন: পর্ব ৩৬ (পছন্দ মনে রাখা)

৭ · অংশ চ — পেশাদার কাজের ধারা (মডিউল ৭)

রিভিশনের জন্য: পর্ব ৪৬, পর্ব ৪৭, পর্ব ৪৮, পর্ব ৪৯, পর্ব ৫০, পর্ব ৫১, পর্ব ৫২, পর্ব ৫৩, পর্ব ৫৪.

চ-০১BEM কী? একটি উদাহরণ দিন। এর সুবিধা কী? — ৪ নম্বর (সহজ)

BEM (Block, Element, Modifier) class-এর নাম রাখার একটি নিয়ম। Block — স্বাধীন component (.card); Element — তার অংশ, দুই underscore দিয়ে (.card__title); Modifier — রূপভেদ, দুই হাইফেন দিয়ে (.card--featured).

<article class="card card--featured">
  <h3 class="card__title">জামদানি শাড়ি</h3>
  <p class="card__price">৳ ৪,৫০০</p>
</article>

সুবিধা: সব selector একটি class — specificity সমান ও কম, তাই যুদ্ধ নেই; নাম দেখেই বোঝা যায় কোন অংশ কোন component-এর; এক component-এর CSS আরেকটিতে চুইয়ে পড়ে না। সীমা: নাম লম্বা হয়। বিকল্প: utility class (Tailwind), CSS Modules, আর নতুন @scope.

ঝালিয়ে নিন: পর্ব ৪৬ · CSS architecture

চ-০২একটি element-এ CSS কাজ করছে না। DevTools দিয়ে ধাপে ধাপে কীভাবে কারণ খুঁজবেন? — ৫ নম্বর (মাঝারি)
  1. ঠিক element বেছেছেন? ডান-ক্লিক → Inspect; DevTools-এর Elements প্যানেলে দেখুন class-এর বানান ঠিক আছে কি না, আর element-টি আসলে কোথায়।
  2. নিয়মটি আদৌ লাগছে? Styles প্যানেলে নিয়মটি না দেখালে selector মেলেনি, বা CSS ফাইলই লোড হয়নি (Network প্যানেলে 404?)।
  3. কেটে দেওয়া? declaration-এর ওপর দাগ মানে অন্য নিয়ম জিতেছে — specificity বা ক্রম দেখুন। হলুদ সতর্ক-চিহ্ন মানে ভুল মান বা বানান।
  4. অকার্যকর? ধূসর হয়ে থাকা declaration-এর পাশের তথ্য-চিহ্ন বলে কেন কাজ করছে না — যেমন inline element-এ width, বা flex পাত্র ছাড়া justify-content.
  5. Computed প্যানেল: শেষ পর্যন্ত কোন মান বসল আর কোন নিয়ম থেকে; box model-এর ছবিতে মাপ।
  6. অবস্থা ও লেআউট: :hover/:focus জোর করে চালু করে দেখা; flex আর grid-এর overlay; ফোনের মাপে device toolbar.

তাও না মিললে সমস্যাটিকে সবচেয়ে ছোট কোডে নামিয়ে আনুন (minimal reproduction) — প্রায়ই সেখানেই কারণ বেরিয়ে পড়ে।

ঝালিয়ে নিন: পর্ব ৪৭ · DevTools দিয়ে debugging

চ-০৩Progressive enhancement আর graceful degradation-এর পার্থক্য লিখুন। — ৫ নম্বর (মাঝারি)
বিষয়Progressive enhancementGraceful degradation
শুরু কোথা থেকেসবার জন্য কাজ করা মূল HTMLনতুনতম ব্রাউজারের পূর্ণ নকশা
দিকনিচ থেকে ওপরে — স্তরে স্তরে যোগওপর থেকে নিচে — পুরোনোয় কম ভাঙার ব্যবস্থা
পুরোনো ব্রাউজারেমূল কাজ নিশ্চিত, শুধু সাজ বা সুবিধা কমযতটা সম্ভব চলে; কিছু অংশ ভাঙতে পারে
উদাহরণআসল <form> জমা হয়; JavaScript থাকলে পাতা না বদলেই জমাঅ্যানিমেশন-ভরা পাতা; পুরোনো ব্রাউজারে স্থির ছবি দেখানো
CSS-এআগে সাধারণ নিয়ম, তারপর @supports (display: grid) { … }নতুন নিয়ম লিখে পরে পুরোনোর জন্য fallback যোগ

উপসংহার: আজকের সুপারিশ progressive enhancement — কারণ ধীর নেটওয়ার্কে JavaScript দেরিতে এলে বা ব্যর্থ হলে, পুরোনো ফোনে, বা সহায়ক প্রযুক্তিতেও মূল কাজ টিকে থাকে। CSS নিজেই এতে সাহায্য করে: না চেনা declaration ব্রাউজার চুপচাপ বাদ দেয়, তাই আগে fallback, পরে নতুন মান লেখা যায়। @supports দিয়ে শর্তসাপেক্ষ নিয়ম।

ঝালিয়ে নিন: পর্ব ৪৮ · ব্রাউজার সাপোর্ট

চ-০৪Vendor prefix কী? আজকাল কি হাতে prefix লিখতে হয়? “Baseline” বলতে কী বোঝায়? — ৪ নম্বর (সহজ)

Vendor prefix হলো ব্রাউজারের নিজস্ব পরীক্ষামূলক সংস্করণের চিহ্ন — -webkit- (Safari, পুরোনো Chrome), -moz- (Firefox), -ms- (পুরোনো IE/Edge). ২০০০–২০১০-এর দশকে নতুন feature আগে prefix দিয়ে আসত; সমস্যা হলো সবাই prefix-যুক্ত রূপের ওপর নির্ভর করে ফেলেছিল। এখন ব্রাউজারগুলো সাধারণত নতুন feature পরীক্ষা করে সেটিংসের পতাকার (flag) পেছনে বা সীমিত পরীক্ষায়, prefix দিয়ে নয়।

হাতে লিখবেন না — দরকার হলে Autoprefixer (PostCSS) আপনার লক্ষ্য-ব্রাউজারের তালিকা দেখে নিজেই যোগ করে। Baseline: কোনো feature যেদিন সব প্রধান ব্রাউজারের (Chrome, Edge, Firefox, Safari — ডেস্কটপ ও মোবাইল) সর্বশেষ সংস্করণে আসে, সেদিন সে Newly available; তার ৩০ মাস পর Widely available. যাচাই করবেন Can I use আর MDN-এর Baseline চিহ্নে।

ঝালিয়ে নিন: পর্ব ৪৮, পর্ব ৫০

চ-০৫Core Web Vitals কী? HTML আর CSS দিয়ে এগুলোর উন্নতি কীভাবে করবেন? — ৮ নম্বর (মাঝারি)

সংজ্ঞা: Core Web Vitals হলো আসল ব্যবহারকারীর অভিজ্ঞতা মাপার তিনটি সংখ্যা, যা Google প্রচার করে আর সার্চ র‍্যাংকিংয়ের সংকেতগুলোর একটি হিসেবে ব্যবহার করে। “ভালো” ধরা হয় যদি পরিদর্শনের অন্তত ৭৫ শতাংশে সীমার ভেতরে থাকে।

মাপকী মাপেভালো সীমাHTML-CSS-এর দিক থেকে উন্নতি
LCPপ্রধান (সবচেয়ে বড়) অংশ কত দ্রুত দেখা যায়≤ ২.৫ সেকেন্ডhero ছবি ছোট ও আধুনিক ফরম্যাটে, fetchpriority="high", lazy নয়; render-blocking CSS কম; critical CSS
INPচাপ বা ক্লিকে পাতা কত দ্রুত সাড়া দেয়≤ ২০০ মিলিসেকেন্ডভারী JavaScript কম; JavaScript-এর বদলে details, dialog, popover-এর মতো নিজস্ব HTML
CLSপাতা কতটা অপ্রত্যাশিতভাবে লাফায়≤ 0.1ছবি ও iframe-এ width/height বা aspect-ratio; বিজ্ঞাপনের জায়গা আগে থেকে রাখা; font-display আর মানানসই fallback ফন্ট

INP ২০২৪ সালের মার্চে আগের মাপ FID-এর জায়গা নিয়েছে। মাপার দুই ধরন: Lighthouse-এর মতো ল্যাবের মাপ (lab data), আর আসল ব্যবহারকারীদের মাপ (field data, যেমন CrUX); PageSpeed Insights দুটোই দেখায়। আগে মাপুন, তারপর ঠিক করুন, আবার মাপুন।

ঝালিয়ে নিন: পর্ব ৪৯ · পারফরম্যান্স

চ-০৬Sass variable আর CSS variable (custom property)-এর পার্থক্য লিখুন। — ৫ নম্বর (মাঝারি)
বিষয়Sass variable ($brand)CSS variable (--brand)
মান কখন ঠিক হয়compile-এর সময়, আপনার কম্পিউটারে — ব্রাউজার $brand কখনো দেখে নাপাতা চলার সময়, ব্রাউজারে
চলন্ত অবস্থায় বদলঅসম্ভবmedia query, :hover, dark mode, JavaScript দিয়ে সম্ভব
scopeফাইল আর ব্লকের লেখার কাঠামো (lexical)DOM গাছ — cascade আর inheritance মানে
build টুললাগেলাগে না
আর যা পারেloop, mixin, function, map দিয়ে CSS বানানোশুধু মান রাখা; হিসাব calc()-এ

উপসংহার: থিম আর চলন্ত বদলের জন্য CSS variable; CSS তৈরির কাজে (যেমন map থেকে loop চালিয়ে দশটি রঙের utility বানানো) Sass. দুটি একসাথেও চলে — Sass-এর map থেকে :root-এ custom property তৈরি করা প্রচলিত কৌশল। Sass-এর বর্তমান সংস্করণ Dart Sass, যেখানে @import deprecated — নতুন কাজে @use.

ঝালিয়ে নিন: পর্ব ৫০ · Sass আর PostCSS, পর্ব ৩৩

চ-০৭Bootstrap আর Tailwind CSS-এর পার্থক্য লিখুন। কোন প্রজেক্টে কোনটি বাছবেন? — ৮ নম্বর (মাঝারি)
বিষয়BootstrapTailwind CSS
দর্শনতৈরি component — .btn, .card, .navbar, .modalutility-first — ছোট এক-কাজের class: p-4, flex, md:grid-cols-3
লেআউট১২ কলামের grid: .container / .row / .col-md-4flex ও grid-এর utility সরাসরি HTML-এ
JavaScriptmodal, dropdown, carousel-এর নিজস্ব JS (v5 থেকে jQuery নেই)শুধু CSS — আচরণ নিজে বা অন্য লাইব্রেরিতে
চেহারাতৈরি, চেনা চেহারা — না বদলালে “Bootstrap সাইট” বোঝা যায়নিজস্ব কোনো চেহারা নেই — নকশা আপনার
কাস্টমাইজSass variable বা --bs-* CSS variablev4-এ CSS-এর @theme-এ নকশার মান
ফাইলের আকারপুরো CSS নিলে বড়; দরকারি অংশ বেছে compile করা যায়build টুল শুধু ব্যবহৃত class-এর CSS বানায় — সাধারণত ছোট
শুরুCDN-এর একটি লিংকেই শুরুবাস্তব কাজে build ধাপ লাগে
HTML দেখতেকম classলম্বা class-এর সারি

কখন কোনটি: দ্রুত, প্রচলিত চেহারার admin প্যানেল বা ছোট অফিস-সাইটে Bootstrap; নিজস্ব নকশা আর component-ভিত্তিক JavaScript প্রজেক্টে (React, Vue) Tailwind; খুব ছোট সাইটে হয়তো কোনো framework-ই নয়। আর যেটিই বাছুন, শেষ পর্যন্ত সব class সাধারণ CSS — flexbox, grid, cascade না বুঝলে framework-এর ভুল ধরা যায় না।

ঝালিয়ে নিন: পর্ব ৫১ · CSS framework

চ-০৮Web Components কী? এর তিনটি মূল প্রযুক্তি ব্যাখ্যা করুন। — ৮ নম্বর (কঠিন)

সংজ্ঞা: Web Components হলো কোনো framework ছাড়াই ব্রাউজারের নিজস্ব প্রযুক্তি দিয়ে নিজের HTML ট্যাগ বানানোর উপায় — যেমন <price-tag>, যা যেকোনো সাইটে বা framework-এ চলে।

  1. Custom element: JavaScript-এর class দিয়ে নতুন ট্যাগ নিবন্ধন — customElements.define('price-tag', PriceTag). নামে হাইফেন বাধ্যতামূলক, যাতে ভবিষ্যতের HTML ট্যাগের সাথে নাম না মেলে। connectedCallback চলে পাতায় বসানোর সময়।
  2. Shadow DOM: element-এর ভেতরে আলাদা একটি লুকানো DOM-গাছ, যার CSS বাইরে চুইয়ে যায় না, বাইরের CSS-ও ভেতরে ঢোকে না। দেয়াল পেরিয়ে আসে শুধু উত্তরাধিকারী property (যেমন color, font), CSS variable আর ::part().
  3. <template> ও <slot>: template-এর ভেতরের HTML পার্স হয় কিন্তু দেখায় না — ছাঁচ হিসেবে কপি করা হয়; slot হলো সেই জায়গা, যেখানে ব্যবহারকারীর দেওয়া বিষয়বস্তু বসে।

সীমা ও পরামর্শ: custom element নিজে কোনো বোতাম বা লিংক নয় — ভেতরে আসল <button> বা <a> রাখুন, নইলে কি-বোর্ড আর screen reader-এর সব কাজ হাতে করতে হয়। সবচেয়ে টেকসই ধরন: যে component আগে থেকে কাজ করা HTML-কে শুধু উন্নত করে (progressive enhancement).

ঝালিয়ে নিন: পর্ব ৫২ · DOM, template আর Web Components, JavaScript কোর্সের DOM পর্ব

চ-০৯Git-এর মূল কাজের ধারা লিখুন। একটি static সাইট কীভাবে প্রকাশ করবেন? — ৫ নম্বর (সহজ)
git init                        # ফোল্ডারকে repository বানাও
git add index.html css/         # staging-এ তোলো
git commit -m "Add contact page"  # নাম-সময়-কারণসহ সংরক্ষণ
git remote add origin https://github.com/<user>/portfolio.git
git push -u origin main         # GitHub-এ পাঠাও

তিন জায়গা: কাজের ফোল্ডার → git add → staging → git commit → repository. git status সবসময় বলে আপনি কোথায়। পাসওয়ার্ড, API key বা .env কখনো commit নয় — .gitignore আগে।

প্রকাশের পথ: GitHub Pages (repository থেকে সরাসরি), Netlify বা Cloudflare Pages-এর মতো সেবা (repository যুক্ত করলে প্রতি push-এ নতুন সংস্করণ), অথবা হোস্টিংয়ের cPanel-এর File Manager বা SFTP দিয়ে public_html-এ তোলা। তারপর নিজের domain, HTTPS, কাস্টম 404, favicon আর Lighthouse যাচাই।

ঝালিয়ে নিন: পর্ব ৫৩ · Git, GitHub আর প্রকাশ, ডোমেইন ও হোস্টিং

চ-১০একটি রেসপন্সিভ পোর্টফোলিও সাইট বানানোর পরিকল্পনা থেকে প্রকাশ পর্যন্ত ধাপগুলো লিখুন। — ১০ নম্বর (মাঝারি)
  1. পরিকল্পনা: লক্ষ্য (চাকরি না ফ্রিল্যান্স ক্লায়েন্ট), পাঠক কে, কোন বিষয়বস্তু লাগবে (content inventory), কয়টি পাতা (সাইটম্যাপ), আর কাগজে মোটা দাগের নকশা (wireframe).
  2. Design system: রং (oklch, contrast যাচাই করা), লেখার মাপ (clamp()), ফাঁক আর কোণের মাপ — সব custom property-তে; light-dark() দিয়ে দুই থিম।
  3. কাঠামো আগে: landmark, skip link, একটি <h1>, পূর্ণ head আর Open Graph; তারপর header-মেনু, hero, প্রজেক্টের কার্ড, “আমার সম্পর্কে”, যোগাযোগ ফর্ম আর footer.
  4. রেসপন্সিভ: পাতার কাঠামো media query-তে, কার্ড নিজের জায়গা দেখে container query-তে, গ্যালারি repeat(auto-fit, minmax(…))-এ।
  5. যাচাই: শুধু কি-বোর্ডে পুরো সাইট, validator, Lighthouse-এর অ্যাক্সেসিবিলিটি ও পারফরম্যান্স, ৩২০px চওড়ায় পাশে স্ক্রল নেই, ছবিতে alt ও মাপ।
  6. প্রকাশ: Git দিয়ে GitHub-এ, তারপর GitHub Pages; README-তে কী, কেন, কীভাবে।
  7. মূল্যায়ন: একটি রুব্রিক ধরে নিজেকে নম্বর দেওয়া — কাঠামো, রেসপন্সিভ, অ্যাক্সেসিবিলিটি, পারফরম্যান্স, কোডের পরিচ্ছন্নতা।

উপসংহার: পরীক্ষকেরা ফল নয়, সিদ্ধান্তের কারণ শুনতে চান — “কেন container query”, “কেন popover-এ মেনু”. এই প্রশ্নের ভাইভা-রূপ অংশ ৯-এ।

ঝালিয়ে নিন: পর্ব ৫৪ · ক্যাপস্টোন

৮ · কোড লেখার প্রশ্ন — খাতায় HTML আর CSS

“কোড লিখুন” প্রশ্নে পরীক্ষক তিনটি জিনিস দেখেন: কোডটি সঠিক কি না (ট্যাগ বন্ধ, বানান ঠিক), আধুনিক কি না (flex, grid, semantic element), আর সবার জন্য কি না (label, alt, focus, ফোনের পর্দা)। উত্তরের শুরুতে এক লাইনে পরিকল্পনা লিখুন, তারপর কোড, শেষে ফলের একটি ছোট স্কেচ আর এক লাইনে কেন এভাবে লিখলেন। নিচের প্রতিটি মডেল উত্তর লাইভ এডিটরে — কোড বদলালেই প্রিভিউ বদলাবে।

রিভিশনের জন্য: পর্ব ০৭, পর্ব ০৮, পর্ব ১০, পর্ব ২৪, পর্ব ২৬, পর্ব ২৮, পর্ব ২৯, পর্ব ৩০.

কো-০১একটি দোকানের শাখাভিত্তিক বিক্রির টেবিলের HTML লিখুন — caption, দুই সারির শিরোনাম (colspan ও rowspan) আর মোটের সারিসহ। — ৫ নম্বর (মাঝারি)

পরিকল্পনা: caption-এ নাম; thead-এর প্রথম সারিতে “শাখা” আর “মোট” দুই সারি জুড়ে (rowspan="2"), “পণ্য” দুই কলাম জুড়ে (colspan="2"); প্রতিটি সারির শুরুতে th scope="row"; শেষে tfoot.

<style>
  table { border-collapse: collapse; }
  th, td { border: 1px solid #999; padding: 4px 12px; }
  td { text-align: right; }
</style>
<table>
  <caption>অক্টোবরের বিক্রি, শাখা অনুযায়ী (পিস, উদাহরণ)</caption>
  <thead>
    <tr>
      <th scope="col" rowspan="2">শাখা</th>
      <th scope="colgroup" colspan="2">পণ্য</th>
      <th scope="col" rowspan="2">মোট</th>
    </tr>
    <tr><th scope="col">শাড়ি</th><th scope="col">পাঞ্জাবি</th></tr>
  </thead>
  <tbody>
    <tr><th scope="row">ঢাকা</th><td>১২০</td><td>৮০</td><td>২০০</td></tr>
    <tr><th scope="row">চট্টগ্রাম</th><td>৯০</td><td>৬০</td><td>১৫০</td></tr>
    <tr><th scope="row">রাজশাহী</th><td>৪০</td><td>৩৫</td><td>৭৫</td></tr>
  </tbody>
  <tfoot>
    <tr><th scope="row">সব শাখা</th><td>২৫০</td><td>১৭৫</td><td>৪২৫</td></tr>
  </tfoot>
</table>

ওপরে caption, তার নিচে দুই সারির শিরোনাম: “শাখা” আর “মোট” দুই সারি উঁচু, “পণ্য” শাড়ি-পাঞ্জাবির ওপরে দুই কলাম চওড়া। সংখ্যাগুলো ডানে সাজানো — মিলিয়ে পড়তে সহজ। চেষ্টা করুন: tbody-তে “সিলেট” শাখার একটি সারি যোগ করুন; তারপর tfoot-এর মোটও বদলাতে হবে — HTML নিজে হিসাব করে না। আর প্রথম সারির একটি rowspan="2" মুছে দেখুন, ঘরগুলো কীভাবে সরে যায়।

যোগ করুন: CSS ছাড়া টেবিলে কোনো দাগই থাকে না, তাই border CSS-এ — HTML-এর পুরোনো border="1" attribute নয়। ফোনে চওড়া টেবিল একটি স্ক্রল-পাত্রে মুড়ে দিন (overflow-x: auto).

কো-০২একটি কোচিং সেন্টারের রেজিস্ট্রেশন ফর্মের HTML লিখুন — নাম, মোবাইল, ইমেইল, পাসওয়ার্ড, ব্যাচের সময় (radio), জেলা (select), শর্তে সম্মতি আর জমার বোতাম; built-in validation-সহ। — ৮ নম্বর (মাঝারি)
<style> label { display: block; margin-top: .6rem; } </style>
<form action="/register" method="post">
  <label for="name">পূর্ণ নাম</label>
  <input id="name" name="name" autocomplete="name" required>

  <label for="phone">মোবাইল নম্বর</label>
  <input id="phone" name="phone" type="tel" inputmode="numeric" autocomplete="tel"
         pattern="01[3-9][0-9]{8}" placeholder="01XXXXXXXXX" required>

  <label for="email">ইমেইল (ঐচ্ছিক)</label>
  <input id="email" name="email" type="email" autocomplete="email">

  <label for="pw">পাসওয়ার্ড (অন্তত ৮ অক্ষর)</label>
  <input id="pw" name="password" type="password" minlength="8" autocomplete="new-password" required>

  <fieldset>
    <legend>ব্যাচের সময়</legend>
    <label><input type="radio" name="batch" value="morning" required> সকাল</label>
    <label><input type="radio" name="batch" value="evening"> বিকাল</label>
  </fieldset>

  <label for="district">জেলা</label>
  <select id="district" name="district" required>
    <option value="">— বেছে নিন —</option>
    <option>ঢাকা</option><option>খুলনা</option><option>রংপুর</option>
  </select>

  <label><input type="checkbox" name="agree" required> শর্তাবলিতে রাজি</label>
  <button type="submit">রেজিস্ট্রেশন করুন</button>
</form>

প্রতিটি ঘরের ওপরে তার label, radio দুটি একটি ফ্রেমের (fieldset) ভেতরে “ব্যাচের সময়” নামে। ঘরগুলো খালি রেখে “রেজিস্ট্রেশন করুন” চাপুন — ব্রাউজার প্রথম অপূর্ণ ঘরে নিজের বার্তা দেখাবে। মোবাইলে 12345 লিখে দেখুন — pattern মেলেনি। সব ঠিকভাবে পূরণ করে চাপলে নিচে লগ দেখাবে “ফর্ম জমা হতো → name=…&phone=…”; লক্ষ করুন, ইমেইল খালি রাখলে সেটি খালি মান হিসেবেই যায়, আর select-এ শুধু লেখা থাকায় লেখাটিই মান হিসেবে যায়। চেষ্টা করুন: “বিকাল”-এর radio থেকে name মুছে দিন — এবার দুটিই একসাথে বাছা যাবে, কারণ দল ভেঙে গেছে।

কেন এভাবে: প্রতিটি ঘরের name আছে (নইলে মান জমা হয় না); autocomplete ব্রাউজারকে আগে থেকে পূরণে সাহায্য করে; type="tel" আর inputmode="numeric" ফোনে সংখ্যার কি-বোর্ড খোলে; পাসওয়ার্ড POST-এ যায়। আর মনে রাখুন, এই যাচাই শুধু সুবিধা — সার্ভারেও আবার যাচাই করতে হবে।

কো-০৩একটি ছোট ব্লগ পাতার semantic HTML কঙ্কাল লিখুন — header, nav, main, article, aside আর footer-সহ। — ৫ নম্বর (সহজ)
<a href="#main">সরাসরি মূল লেখায় যান</a>
<header>
  <p><strong>চায়ের কাপে প্রযুক্তি</strong></p>
  <nav aria-label="প্রধান মেনু">
    <ul>
      <li><a href="#main" aria-current="page">হোম</a></li>
      <li><a href="#about">পরিচিতি</a></li>
    </ul>
  </nav>
</header>
<main id="main">
  <article>
    <h1>ফোনে ওয়েবসাইট কেন ছোট দেখায়?</h1>
    <p><time datetime="2026-10-20">২০ অক্টোবর ২০২৬</time></p>
    <p>কারণটি একটি ছোট meta tag…</p>
  </article>
  <aside>
    <h2>আরও পড়ুন</h2>
    <p>viewport আর রেসপন্সিভ ডিজাইন</p>
  </aside>
</main>
<footer id="about">
  <p>© ২০২৬ চায়ের কাপে প্রযুক্তি</p>
</footer>

কোনো CSS নেই, তাই প্রিভিউতে ব্রাউজারের ডিফল্ট চেহারা: ওপরে skip link, তালিকার বুলেটসহ মেনু, বড় h1, তারপর aside-এর h2. দেখতে সাধারণ — কিন্তু screen reader এখানে banner, navigation, main, complementary আর contentinfo landmark চিনবে। “পরিচিতি” লিংক footer-এর id="about"-তে নিয়ে যায় — লম্বা পাতায় এভাবেই পাতার ভেতরে লাফ দেওয়া হয়। চেষ্টা করুন: <aside>-কে <div> করে দিন — চেহারা একটুও বদলাবে না, অর্থ বদলাবে।

লক্ষ করুন: একটিই <h1>; nav-এর ভেতরে তালিকা; প্রকাশের তারিখ <time datetime>-এ, যাতে যন্ত্রও বোঝে; বর্তমান পাতার লিংকে aria-current="page".

কো-০৪একটি লগইন কার্ড পাত্রের ঠিক মাঝখানে (আড়াআড়ি ও খাড়া দুই দিকেই) বসানোর CSS লিখুন। — ৩ নম্বর (সহজ)
.stage {
  min-height: 320px;        /* আসল পাতায়: body-তে min-height: 100dvh */
  display: grid;
  place-items: center;      /* align-items + justify-items, দুটোই center */
  background: #f1f5f9;
}
.card {
  width: min(100% - 2rem, 22rem);
  padding: 1.5rem;
  border-radius: 12px;
  background: #fff;
  box-shadow: 0 6px 20px rgb(0 0 0 / .12);
  text-align: center;
}
/* বিকল্প: .stage { display: flex; justify-content: center; align-items: center; } */

ধূসর পটভূমির ঠিক মাঝখানে সাদা কার্ড, চারপাশে নরম ছায়া। মূল কাজটি দুই লাইনের: display: grid আর place-items: center. চেষ্টা করুন: place-items-কে start center করুন — কার্ড ওপরে উঠবে কিন্তু আড়াআড়ি মাঝখানেই থাকবে। আর .stage-এর min-height মুছে দিন — উচ্চতা না থাকলে খাড়া দিকে মাঝখানে বসানোর জায়গাই থাকে না।

পুরোনো উপায় শুধু ইতিহাস হিসেবে: position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) — এখনো কাজ করে, কিন্তু element-কে flow থেকে বের করে দেয়। খাতায় grid বা flex-এর উত্তরই লিখুন, আর এক লাইনে উল্লেখ করুন কেন উচ্চতা লাগবে।

কো-০৫একটি রেসপন্সিভ কার্ড-গ্রিডের CSS লিখুন — ফোনে ১ কলাম, মাঝারি পর্দায় ২ কলাম, বড় পর্দায় ৩ কলাম (mobile-first). — ৫ নম্বর (মাঝারি)
<style>
  .grid { display: grid; gap: 12px; padding: 0; list-style: none; }
  @media (min-width: 30em) { .grid { grid-template-columns: repeat(2, 1fr); } }
  @media (min-width: 40em) { .grid { grid-template-columns: repeat(3, 1fr); } }
  .grid li { padding: 1rem; border-radius: 8px; background: #e0e7ff; }
</style>
<ul class="grid">
  <li>HTML</li><li>CSS</li><li>Flexbox</li>
  <li>Grid</li><li>রেসপন্সিভ</li><li>অ্যাক্সেসিবিলিটি</li>
</ul>
<p id="info"></p>
<script>
  (function m() {
    if (!document.body.offsetWidth) return setTimeout(m, 50);
    const cols = getComputedStyle(document.querySelector('.grid'))
      .gridTemplateColumns.split(' ').length;
    console.log('preview width: ' + innerWidth + 'px → columns: ' + cols);
  })();
</script>

প্রিভিউর চওড়া ৬৪০px (40em)-এর বেশি হলে তিন কলামে ছয়টি কার্ড, দুই সারিতে; লগে প্রিভিউর চওড়া আর কলামের সংখ্যা দেখাবে। ফোনে এই পাতা খুললে প্রিভিউ সরু হবে — তখন ২ বা ১ কলাম। এখানে breakpoint em-এ, ব্রাউজারের ডিফল্ট ১৬px ধরে 30em ≈ 480px আর 40em ≈ 640px. চেষ্টা করুন: দ্বিতীয় media query-র 40em-কে 80em করুন — কম্পিউটারেও এবার দুই কলাম।

বিকল্প উত্তর (media query ছাড়া): grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr)); — কলামের সংখ্যা জায়গা দেখে নিজেই ঠিক হয়, তবে “ঠিক ৩টি” সর্বোচ্চ বেঁধে দিতে চাইলে media query বা পাত্রের max-width লাগে। খাতায় দুটিই লিখে পার্থক্য এক লাইনে বললে উত্তর পূর্ণ হয়।

কো-০৬স্ক্রল করলেও পাতার ওপরে আটকে থাকে এমন একটি sticky header-এর CSS লিখুন। — ৫ নম্বর (মাঝারি)
<style>
  html { scroll-padding-top: 4rem; }   /* #লিংকে লাফালে header লেখা ঢাকবে না */
  body { margin: 0; font-family: system-ui, sans-serif; }
  .site-header {
    position: sticky;
    top: 0;
    z-index: 10;
    padding: .75rem 1rem;
    background: #0f172a; color: #fff;
    box-shadow: 0 2px 6px rgb(0 0 0 / .25);
  }
  main { padding: 1rem; }
</style>
<header class="site-header">ABCL শপ — <a href="#offer" style="color:#93c5fd">আজকের অফার</a></header>
<main>
  <p>প্রিভিউর ভেতরে নিচে স্ক্রল করুন।</p>
  <p>পণ্য ১ … পণ্য ২ … পণ্য ৩ …</p><p>পণ্য ৪ … পণ্য ৫ …</p>
  <p>পণ্য ৬ … পণ্য ৭ …</p><p>পণ্য ৮ … পণ্য ৯ …</p>
  <p>পণ্য ১০ … পণ্য ১১ …</p><p>পণ্য ১২ … পণ্য ১৩ …</p>
  <p>পণ্য ১৪ … পণ্য ১৫ …</p><p>পণ্য ১৬ … পণ্য ১৭ …</p>
  <h2 id="offer">আজকের অফার</h2>
  <p>সব শাড়িতে ১০% ছাড়।</p>
  <p>পণ্য ১৮ … পণ্য ১৯ …</p><p>পণ্য ২০ … শেষ।</p>
</main>

প্রিভিউর উচ্চতা ৩৬০px-এ বাঁধা, তাই ভেতরে স্ক্রলবার আসে। নিচে স্ক্রল করুন — গাঢ় নীল header ওপরে আটকে থাকে, লেখা তার নিচ দিয়ে চলে যায়। “আজকের অফার” লিংকে চাপুন — শিরোনামটি header-এর নিচে ঠিকঠাক দেখা যাবে, scroll-padding-top-এর কারণে। চেষ্টা করুন: top: 0 মুছে দিন — sticky আর কাজ করবে না, কারণ কোথায় আটকাবে সেই সীমাই নেই।

কেন fixed নয়: position: fixed header-কে flow থেকে বের করে দেয়, তাই নিচের লেখার শুরুতে হাতে padding দিতে হয়; sticky নিজের জায়গা রাখে। sticky কাজ না করলে পূর্বপুরুষে overflow: hidden আছে কি না দেখুন।

কো-০৭Flexbox দিয়ে একটি navbar-এর CSS লিখুন — বাঁয়ে লোগো, ডানে লিংক; জায়গা কম হলে লিংক নিচের লাইনে নামবে। — ৫ নম্বর (মাঝারি)
.bar {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
  gap: .5rem 1rem;
  padding: .75rem 1rem;
  background: #0d1f3c;
}
.bar a { color: #fff; text-decoration: none; }
.logo { font-weight: 700; }
.bar ul { display: flex; flex-wrap: wrap; gap: 1rem; margin: 0; padding: 0; list-style: none; }
.bar a[aria-current="page"] { text-decoration: underline; text-underline-offset: 4px; }
.bar a:focus-visible { outline: 2px solid #fbbf24; outline-offset: 3px; }

গাঢ় নীল বারের বাঁয়ে মোটা অক্ষরে লোগো, ডানে চারটি লিংক; বর্তমান পাতা “হোম”-এর নিচে দাগ। Tab চাপলে প্রতিটি লিংকে হলুদ focus-দাগ। চেষ্টা করুন: justify-content-কে flex-start করুন — লিংকগুলো লোগোর ঠিক পাশে চলে আসবে; আর .bar-এ flex-direction: column দিয়ে দেখুন অক্ষ বদলালে কী হয়।

লক্ষ করুন: মেনু <nav>-এর ভেতরে <ul> — তালিকার বুলেট CSS-এ সরানো, অর্থ রয়ে গেছে; বর্তমান পাতা চেনানো হয়েছে attribute দিয়ে, আলাদা class ছাড়াই; আর ফাঁক margin নয়, gap. ছোট পর্দায় hamburger মেনু লাগলে আসল <button> আর popover বা aria-expanded (পর্ব ১১, ২৬)।

কো-০৮একটি দামের কার্ডের CSS লিখুন — কোণে “জনপ্রিয়” badge, আর মাউস রাখলে বা focus এলে ছায়া বাড়বে। — ৫ নম্বর (মাঝারি)
.plan {
  position: relative;               /* badge-এর ভিত্তি */
  max-width: 16rem;
  margin: 1.5rem;
  padding: 1.5rem;
  border: 1px solid #cbd5e1;
  border-radius: 12px;
  transition: box-shadow .2s ease, transform .2s ease;
}
.plan:hover, .plan:focus-within {
  box-shadow: 0 10px 24px rgb(0 0 0 / .15);
  transform: translateY(-4px);
}
.badge {
  position: absolute; top: -.75rem; right: 1rem;
  padding: .2rem .6rem; border-radius: 999px;
  background: #f59e0b; color: #111; font-size: .85rem;
}
.price { font-size: 1.5rem; font-weight: 700; }
@media (prefers-reduced-motion: reduce) { .plan { transition: none; } }

সীমানা-দেওয়া একটি কার্ড, যার ওপরের ডান কোণে কমলা “জনপ্রিয়” badge সীমানার ওপর অর্ধেক উঠে আছে। কার্ডে মাউস রাখুন, বা Tab দিয়ে “এখনই নিন”-এ আসুন — কার্ড একটু ওঠে, ছায়া বাড়ে। চেষ্টা করুন: .plan থেকে position: relative মুছে দিন — badge তখন কার্ড ছেড়ে প্রিভিউর একেবারে ওপরের ডান কোণে চলে যাবে (ওপরের অংশ কাটাও পড়বে), কারণ তার সবচেয়ে কাছের positioned পূর্বপুরুষ আর নেই।

লক্ষ করুন: :focus-within কি-বোর্ডের ব্যবহারকারীকেও একই অনুভূতি দেয়; অ্যানিমেশন শুধু transform আর box-shadow-এ; আর “কম মোশন” পছন্দ মানা হয়েছে।

কো-০৯grid-template-areas দিয়ে “holy grail” লেআউট লিখুন — header, বাঁয়ে nav, মাঝে main, ডানে aside, নিচে footer; ফোনে সব এক কলামে। — ৮ নম্বর (কঠিন)
<style>
  .page {
    display: grid; gap: 8px; min-height: 300px;
    grid-template-areas: "head" "nav" "main" "side" "foot";
  }
  @media (min-width: 40em) {
    .page {
      grid-template-columns: 9rem 1fr 9rem;
      grid-template-rows: auto 1fr auto;
      grid-template-areas:
        "head head head"
        "nav  main side"
        "foot foot foot";
    }
  }
  header { grid-area: head; }  nav { grid-area: nav; }  main { grid-area: main; }
  aside  { grid-area: side; }  footer { grid-area: foot; }
  .page > * { padding: .75rem; border-radius: 6px; background: #e2e8f0; }
  main { background: #dbeafe; }
</style>
<div class="page">
  <header>header</header>
  <nav>nav</nav>
  <main>main — মূল লেখা</main>
  <aside>aside</aside>
  <footer>footer</footer>
</div>

প্রিভিউ ৬৪০px-এর বেশি চওড়া হলে: ওপরে পুরো চওড়া header, মাঝের সারিতে বাঁয়ে nav, মাঝে চওড়া নীল main, ডানে aside, নিচে পুরো চওড়া footer — main-এর সারি 1fr বলে বাড়তি উচ্চতা সেই সারিই নিয়েছে। ফোনে সব এক কলামে ওপর থেকে নিচে। চেষ্টা করুন: বড় পর্দার areas-এ মাঝের লাইনটি "nav main main" করুন আর aside-এর জন্য নিচে একটি সারি যোগ করুন — HTML না ছুঁয়েই নকশা বদলে যাবে।

কেন এটি ভালো উত্তর: HTML-এর ক্রম (header, nav, main, aside, footer) অর্থ আর কি-বোর্ডের ক্রম ঠিক রাখে, আর চেহারার নকশা থাকে CSS-এর একটি “মানচিত্রে”. সাবধান: areas দিয়ে চোখের ক্রম DOM-এর ক্রম থেকে খুব আলাদা করবেন না — Tab আর screen reader DOM-এর ক্রমই মানে।

৯ · ভাইভা — মুখে উত্তরের কৌশল, নিজের প্রজেক্ট আর দ্রুত প্রশ্ন

লিখিত পরীক্ষায় আপনি ভাবার সময় পান, কাটাকাটি করতে পারেন। ভাইভায় পারেন না — প্রশ্ন আসে মুখে, উত্তরও দিতে হয় তখনই। আর পরীক্ষক আপনার প্রথম উত্তর শুনেই পরের প্রশ্ন বানান। এমন প্রশ্নকে বলে follow-up প্রশ্ন. তাই ভাইভার আসল দক্ষতা দুটি: ছোট, গোছানো উত্তর, আর প্রশ্নের শিকল সামলানো। চাকরির ভাইভা বোর্ডে বা ফ্রিল্যান্স ক্লায়েন্টের সাথে কলে — দুই জায়গাতেই একই দক্ষতা কাজে লাগে।

তিন বাক্যের কাঠামো: সংজ্ঞা → উদাহরণ → সীমা বা কখন

সংজ্ঞা (এক বাক্য) → উদাহরণ (এক বাক্য) → সীমা, সতর্কতা বা কখন ব্যবহার (এক বাক্য)

প্রশ্ন: “Flexbox কী?” দুর্বল উত্তর: “Flexbox হলো… মানে… display flex দিলে… justify-content দিয়ে…”. গোছানো উত্তর: “Flexbox এক দিকে — একটি সারি বা একটি কলামে — item সাজানোর CSS লেআউট পদ্ধতি (সংজ্ঞা)। যেমন navbar-এ লোগো বাঁয়ে আর লিংক ডানে রাখতে পাত্রে display: flex আর justify-content: space-between দিই (উদাহরণ)। তবে সারি-কলাম দুই দিকে মেলানো ছকের জন্য grid ভালো, কারণ flex-এর প্রতিটি লাইন স্বাধীন (সীমা)।” পনেরো সেকেন্ড, তিন বাক্য — আর পরীক্ষকের হাতে পরের প্রশ্নের তিনটি সূত্র।

ভাইভার উত্তরকে রিকশাওয়ালাকে পথ বলার মতো ভাবুন। প্রথমে গন্তব্য বলেন (“নিউমার্কেট”) — সংজ্ঞা। তারপর একটি চেনা চিহ্ন (“বলাকা সিনেমা হলের পাশ দিয়ে”) — উদাহরণ। শেষে একটি সতর্কতা (“সন্ধ্যায় সামনে জ্যাম, পেছনের গেটে নামাবেন”) — সীমা। পুরো শহরের মানচিত্র বোঝাতে বসলে রিকশা আর চলে না।

  • আগে উত্তর, পরে বিস্তার: পরীক্ষক চাইলে নিজেই “আরেকটু বলুন” বলবেন। নিজে থেকে পাঁচ মিনিট বললে বাকি প্রশ্নের সময় কমে, আর ভুল বলার সুযোগ বাড়ে।
  • বোর্ডে বা কাগজে আঁকুন: box model, position বা grid-এর প্রশ্নে দুই সেকেন্ডের একটি বাক্স-চিত্র দশটি বাক্যের কাজ করে। ভাইভাতেও কাগজ-কলম চাইতে দ্বিধা করবেন না।
  • Think aloud: নিশ্চিত না হলে ভাবনাটা জোরে বলুন — “দুই selector-এর একটিতে id আছে… id-র ওজন সবচেয়ে বেশি… তাই নীল জিতবে।” পরীক্ষক আপনার যুক্তির পথ দেখতে চান।
  • প্রশ্ন নিশ্চিত হয়ে নিন: “আপনি কি CSS-এর position: absolute-এর কথা বলছেন, নাকি absolute URL-এর?” — একই শব্দের দুই মানে থাকলে জিজ্ঞেস করাই বুদ্ধিমানের কাজ।

নিচের ডায়াগ্রামে একটি বাস্তবধর্মী ভাইভার শিকল দেখুন। প্রতিটি ধাপে প্রশ্ন একটু গভীরে যাচ্ছে। শেষ ধাপে প্রার্থী পুরো নিশ্চিত নন — তবু সঠিকভাবে সামলাচ্ছেন।

পরীক্ষক → প্রার্থীপ্রশ্ন ১
পরীক্ষক: Semantic HTML কী?
প্রার্থী: চেহারা নয়, অর্থ দেখে element বাছা — শিরোনামে h1,
বোতামে button, মেনুতে nav. এতে screen reader আর সার্চ
ইঞ্জিন পাতার কাঠামো বোঝে। দেখতে div আর button এক রকম
করা যায়, কিন্তু অর্থ এক থাকে না।
পরীক্ষক → প্রার্থীপ্রশ্ন ২ — ফলো-আপ
পরীক্ষক: div-এ onclick দিয়ে বোতাম বানালে সমস্যা কী?
প্রার্থী: তিনটি জিনিস হারায় — Tab-এ focus আসে না,
Enter বা Space-এ চলে না, আর screen reader তাকে
"button" বলে না। মাউস ছাড়া যিনি চালান, তাঁর কাছে
বোতামটির অস্তিত্বই নেই।
পরীক্ষক → প্রার্থীপ্রশ্ন ৩ — আরও গভীরে
পরীক্ষক: role="button" আর tabindex="0" দিলে তো ঠিক?
প্রার্থী: role শুধু নাম আর ভূমিকা বলে, আচরণ দেয় না —
Enter আর Space-এর জন্য JavaScript লিখতেই হবে। ARIA-র
প্রথম নিয়মও তাই বলে: আসল element থাকলে সেটিই।
<button type="button"> সব কিছু বিনা খরচে দেয়।
পরীক্ষক → প্রার্থীপ্রশ্ন ৪ — যাচাই
পরীক্ষক: আপনার সাইট অ্যাক্সেসিবল কি না, কীভাবে বুঝবেন?
প্রার্থী: প্রথমে মাউস সরিয়ে শুধু কি-বোর্ডে পুরো সাইট চালাই।
তারপর Lighthouse বা axe — তবে এরা সব সমস্যা ধরে না।
শেষে NVDA-র মতো screen reader দিয়ে মূল পাতাগুলো শুনি,
আর DevTools-এর Accessibility অংশে role আর name দেখি।
পরীক্ষক → প্রার্থীপ্রশ্ন ৫ — যা প্রার্থী পুরো জানেন না
পরীক্ষক: Shadow DOM-এর ভেতরের element কি accessibility
         tree-তে থাকে?
প্রার্থী: পুরো নিশ্চিত নই, তবে এভাবে ভাবছি: accessibility
tree বানানো হয় পর্দায় যা দেখানো হয় তা থেকে, আর shadow
DOM-এর বিষয়বস্তুও পর্দায় দেখায় — তাই আমার ধারণা সেগুলোও
গাছে থাকে। নিশ্চিত হতে DevTools-এর Accessibility অংশে
একটি web component খুলে দেখতাম।
  1. সংজ্ঞার প্রশ্ন। তিন বাক্য: সংজ্ঞা, উদাহরণ, আর একটি সূক্ষ্ম কথা (“দেখতে এক, অর্থ এক নয়”)। শেষ বাক্যটিই পরীক্ষককে পরের প্রশ্নের দিকে টানে — প্রার্থী নিজেই আলোচনার পথ ঠিক করছেন।
  2. প্রথম ফলো-আপ। পরীক্ষক দেখতে চান সংজ্ঞাটি মুখস্থ, নাকি বোঝা। গুনে গুনে তিনটি ক্ষতি — focus, কি-বোর্ড, ভূমিকা — আর একজন মানুষের অভিজ্ঞতা দিয়ে শেষ।
  3. দ্বিতীয় ফলো-আপ — ফাঁদ। প্রশ্নটি এমনভাবে করা যেন “হ্যাঁ” বলাটাই স্বাভাবিক। ভালো উত্তর ভদ্রভাবে “আংশিক” বলে, কারণ দেখায়, আর একটি নীতির নাম (ARIA-র প্রথম নিয়ম) দিয়ে শেষ করে।
  4. যাচাইয়ের প্রশ্ন। শুধু টুলের নাম নয়, ক্রম আর সীমাও — “স্বয়ংক্রিয় পরীক্ষা সব ধরে না”. এটি একজন কাজের ডেভেলপারের উত্তর।
  5. “জানি না” সামলানো। প্রার্থী সৎভাবে বলছেন নিশ্চিত নন, তারপর যা জানেন তা থেকে যুক্তি দিয়ে এগোচ্ছেন, আর যাচাইয়ের উপায় বলছেন। যুক্তিটি সঠিক দিকেই গেছে — shadow DOM-এর বিষয়বস্তু accessibility tree-তে থাকে। এভাবে ভেবে বলা উত্তর প্রায়ই অন্তত আংশিক কৃতিত্ব পায়।

যে প্রশ্নের উত্তর জানেন না — সৎভাবে সামলানোর পাঁচ ধাপ

  1. থামুন, প্রশ্নটি নিশ্চিত হয়ে নিন: “আপনি কি ফোনের ব্রাউজারের কথা বলছেন?” HTML-CSS-এ অনেক উত্তর ব্রাউজার আর পর্দার ওপর নির্ভর করে।
  2. যা জানেন সেখান থেকে শুরু করুন: “ঠিক এই property-টি ব্যবহার করিনি, তবে কাছাকাছি জিনিস জানি — …”.
  3. আন্দাজকে আন্দাজ বলেই বলুন: “আমার ধারণা…”, “যুক্তি দিয়ে ভাবলে…”.
  4. যাচাইয়ের উপায় বলুন: “নিশ্চিত হতে MDN-এ দেখতাম, আর DevTools-এ দুই লাইনের একটি পরীক্ষা চালাতাম।” নতুন feature হলে: “Can I use-এ Baseline অবস্থা দেখতাম।”
  5. না পারলে সোজাসুজি বলুন, আর এগিয়ে যান: “এটা আমি জানি না, পরে শিখে নেব।” আন্দাজে ভুল তথ্য জোর দিয়ে বললে পরীক্ষক আপনার বাকি ঠিক উত্তরগুলো নিয়েও সন্দেহ করেন। আর একটি প্রশ্ন না পারা পুরো ভাইভা নয়।

নিজের পোর্টফোলিও প্রজেক্ট নিয়ে কথা বলা

প্রায় সব ভাইভা আর ইন্টারভিউতে একটি প্রশ্ন আসে: “আপনার একটি প্রজেক্টের কথা বলুন।” এই কোর্সে আপনার দুটি প্রজেক্ট আছে — পর্ব ১৫-এর কয়েক পাতার HTML সাইট আর পর্ব ৫৪-এর রেসপন্সিভ পোর্টফোলিও. গল্পটি গোছাতে একটি প্রচলিত কাঠামো STAR: Situation (প্রেক্ষাপট), Task (আপনার দায়িত্ব), Action (কী করলেন), Result (ফল)। নিচের টেবিলে উদাহরণগুলো ক্যাপস্টোন ধরে — আপনার নিজের সিদ্ধান্ত আর সংখ্যা দিয়ে ভরাবেন।

অংশকী বলবেনপোর্টফোলিওর উদাহরণ
৩০ সেকেন্ডের পরিচয়কী, কার জন্য, কোন প্রযুক্তি“ক্লায়েন্টদের কাজ দেখানোর রেসপন্সিভ পোর্টফোলিও — শুধু HTML-CSS, অল্প JavaScript, GitHub Pages-এ প্রকাশিত।”
একটি নকশার সিদ্ধান্তকী বেছেছেন, কেন, বিকল্প কী ছিল“প্রজেক্ট-কার্ডে media query নয়, container query — কারণ একই কার্ড হোমপেজে চওড়া আর sidebar-এ সরু জায়গায় বসে।”
একটি কঠিন সমস্যাকী ভাঙছিল, কীভাবে ধরলেন, কীভাবে সারালেন“ফোনে পাতা পাশে সরে যাচ্ছিল — DevTools-এ খুঁজে দেখি একটি flex item-এর ভেতরে লম্বা লিংক; min-width: 0 আর overflow-wrap দিয়ে ঠিক করেছি।”
প্রমাণমাপা ফল, যাচাই“validator-এ শূন্য error, শুধু কি-বোর্ডে পুরো সাইট চলে, ৩২০px চওড়ায় পাশে স্ক্রল নেই; Lighthouse-এর রিপোর্ট README-তে।”
আবার করলেকী ভিন্নভাবে করতেন“শুরু থেকেই ছবির কয়েকটি মাপ বানিয়ে srcset দিতাম — পরে যোগ করতে গিয়ে সময় বেশি লেগেছে।”

প্রজেক্টের যে অংশ আপনি নিজে বোঝেন না — হয়তো AI, কোনো টেমপ্লেট বা বন্ধু লিখে দিয়েছে — সেটি নিয়ে বড় দাবি করবেন না। পরীক্ষকেরা প্রায়ই ঠিক সেই লাইন ধরে জিজ্ঞেস করেন: “এখানে z-index: 999 কেন?”, “এই বোতামটি div কেন?”, “এই breakpoint কোথা থেকে এল?” টেমপ্লেট বা AI ব্যবহার করলে সেটি খোলাখুলি বলুন, আর বলুন আপনি নিজে কোন অংশ বদলেছেন ও কেন। নিজের প্রজেক্টের প্রতিটি সিদ্ধান্তের কারণ নিজের ভাষায় বলতে পারা — এটাই সবচেয়ে বড় প্রস্তুতি।

ভাইভা কুইকফায়ার — দ্রুত প্রশ্ন, এক লাইনের উত্তর

ভাইভায় প্রশ্ন আসে দ্রুত, উত্তরও হতে হয় এক–দুই বাক্যে। জোরে জোরে উত্তর বলুন, তারপর মেলান — প্রতিটিতে ২০ সেকেন্ডের বেশি নয়।

ওয়েব ও HTML-এর ভিত্তি (পর্ব ০১–০৭)

ভ-০১HTML কি প্রোগ্রামিং ভাষা? (সহজ)

না — markup ভাষা: বিষয়বস্তুর কাঠামো আর অর্থ বলে; এতে variable, শর্ত বা লুপ নেই, হিসাবের কাজ JavaScript-এর। পর্ব ০১

ভ-০২ওয়েবসাইটের প্রথম পাতার নাম সাধারণত index.html কেন? (সহজ)

বেশিরভাগ ওয়েব সার্ভার কোনো ফোল্ডারের ঠিকানা চাওয়া হলে ডিফল্টে সেখানকার index.html খোঁজে ও পাঠায়। পর্ব ০২

ভ-০৩HTML-এ comment কীভাবে লেখেন? সেখানে পাসওয়ার্ড রাখা যায়? (সহজ)

<!-- … -->; পাতায় দেখায় না, কিন্তু View Source-এ যে কেউ পড়তে পারেন — তাই গোপন কিছু কখনো নয়। পর্ব ০৩

ভ-০৪<br> আর <p>-এর পার্থক্য? (সহজ)

<p> একটি অনুচ্ছেদ; <br> একই অনুচ্ছেদের ভেতরে লাইন ভাঙা — ঠিকানা বা কবিতায়। ফাঁক বাড়াতে br নয়, CSS-এর margin. পর্ব ০৪

ভ-০৫target="_blank" দিলে কী মাথায় রাখবেন? (মাঝারি)

লিংক নতুন ট্যাবে খোলে; আধুনিক ব্রাউজার ডিফল্টে নতুন পাতাকে পুরোনো পাতা ছুঁতে দেয় না, তবু rel="noopener" লেখা নিরাপদ অভ্যাস (tabnabbing রোধ), আর ব্যবহারকারীকে জানিয়ে দেওয়া ভালো যে নতুন ট্যাব খুলবে। পর্ব ০৫

ভ-০৬পাতার লেআউটে টেবিল কেন ব্যবহার করবেন না? (সহজ)

টেবিল সারি-কলামের ডেটার অর্থ বহন করে — লেআউটে দিলে screen reader ভুল কাঠামো শোনায়, ফোনে ভাঙে, আর কোড জটিল হয়; লেআউটের কাজ CSS-এর flex আর grid-এর। পর্ব ০৭

গঠন, ফর্ম ও অ্যাক্সেসিবিলিটি (পর্ব ০৮–১৫)

ভ-০৭ফর্মের ভেতরে <button>-এর ডিফল্ট type কী? (মাঝারি)

submit — তাই ফর্মের ভেতরের সাধারণ বোতামে (যেমন “পাসওয়ার্ড দেখাও”) type="button" লিখুন, নইলে চাপলেই ফর্ম জমা হয়ে যায়। পর্ব ০৮

ভ-০৮name ছাড়া একটি input-এর মান কি ফর্মের সাথে জমা হয়? (সহজ)

না — শুধু name থাকা ঘরের মান যায়; id থাকলেও যথেষ্ট নয়। পর্ব ০৮

ভ-০৯readonly আর disabled-এর পার্থক্য? (মাঝারি)

readonly ঘর বদলানো যায় না, কিন্তু focus পায় আর তার মান জমা হয়; disabled ঘর focus পায় না, তার মান জমাও হয় না। পর্ব ০৯

ভ-১০একটি পাতায় কয়টি <h1> থাকা উচিত? (সহজ)

নিয়মে একাধিক নিষেধ নয়, কিন্তু প্রচলিত ভালো অভ্যাস একটি — পাতার মূল শিরোনাম; তারপর h2, h3 ক্রমে, মাঝখানে স্তর লাফ না দিয়ে। পর্ব ১০

ভ-১১Skip link কী? (সহজ)

পাতার একেবারে প্রথম লিংক — “সরাসরি মূল লেখায় যান” — যা কি-বোর্ডের ব্যবহারকারীকে প্রতিটি পাতায় পুরো মেনু Tab করে পেরোনো থেকে বাঁচায়। পর্ব ১২

ভ-১২aria-label কখন দেবেন? (মাঝারি)

যখন কোনো control-এর দৃশ্যমান লেখা নেই — যেমন শুধু আইকনের বোতাম (🔍 → “খুঁজুন”); দৃশ্যমান লেখা থাকলে সেটিই নাম, aria-label দিয়ে তাকে ঢাকবেন না। পর্ব ১২

CSS-এর ভিত্তি (পর্ব ১৬–২২)

ভ-১৩CSS-এর পূর্ণ নাম কী, “cascading” কেন? (সহজ)

Cascading Style Sheets — কয়েকটি উৎসের নিয়ম একটি নির্দিষ্ট ক্রমে বিচার হয়ে, ঝরনার মতো ধাপে ধাপে নেমে জয়ী মান ঠিক হয়। পর্ব ১৮

ভ-১৪* selector-এর specificity কত? (সহজ)

শূন্য — (0,0,0); সে সব element ধরে, কিন্তু যেকোনো অন্য selector তাকে হারায়। পর্ব ১৭

ভ-১৫!important কখন ব্যবহার করবেন? (মাঝারি)

খুব কম — utility class বা অ্যাক্সেসিবিলিটির জরুরি override-এ; নিয়মিত ব্যবহার specificity-র যুদ্ধ বাড়ায়, কারণ তাকে হারাতে আরেকটি !important লাগে। পর্ব ১৮

ভ-১৬margin: 10px 20px মানে কী? (সহজ)

ওপর-নিচে 10px, ডানে-বাঁয়ে 20px. চার মান দিলে ঘড়ির কাঁটার দিকে: ওপর, ডান, নিচ, বাঁ। পর্ব ১৯

ভ-১৭margin: 0 auto একটি বাক্সকে মাঝখানে আনে কেন? (মাঝারি)

নির্দিষ্ট width (বা max-width) দেওয়া block-এর বাঁ-ডানের auto margin বাকি জায়গা সমান ভাগ করে নেয়; width না থাকলে বাক্স পুরো চওড়া, তাই ভাগের কিছুই থাকে না। পর্ব ১৯

ভ-১৮color উত্তরাধিকার সূত্রে আসে; background-color আসে? (মাঝারি)

না — background-color-এর প্রাথমিক মান transparent, তাই মা-বাবার রং “দেখা যায়”, কিন্তু উত্তরাধিকার সূত্রে আসে না। পর্ব ১৮

লেআউট (পর্ব ২৩–২৯)

ভ-১৯একটি element মাঝখানে বসানোর সবচেয়ে ছোট আধুনিক উপায়? (সহজ)

পাত্রে display: grid; place-items: center; — খাড়া দিকে মাঝখানে আনতে পাত্রের উচ্চতা থাকতে হবে। পর্ব ২৬

ভ-২০position: absolute element কিসের সাপেক্ষে বসে? (মাঝারি)

সবচেয়ে কাছের positioned পূর্বপুরুষের (position static নয়, বা transform-এর মতো কিছু আছে); না থাকলে প্রাথমিক containing block-এর। পর্ব ২৪

ভ-২১gap কি শুধু grid-এ চলে? (সহজ)

না — flexbox-এও চলে, আর এখন সব প্রধান ব্রাউজারে বহুদিন ধরে আছে; item-এর মাঝে margin-এর হিসাবের চেয়ে পরিষ্কার। পর্ব ২৫

ভ-২২Grid-এ fr আর %-এর পার্থক্য? (মাঝারি)

% পুরো পাত্রের চওড়ার ভাগ — gap যোগ হলে উপচে পড়ে; fr হলো gap আর স্থির track বাদ দিয়ে বাকি জায়গার ভাগ, তাই উপচে পড়ে না। পর্ব ২৭

ভ-২৩CSS-এর order বা grid-এ জায়গা বদলানোর ঝুঁকি কী? (মাঝারি)

শুধু চোখের ক্রম বদলায়; Tab আর screen reader DOM-এর ক্রম মানে — দুই ক্রম না মিললে কি-বোর্ডের ব্যবহারকারী বিভ্রান্ত হন। পর্ব ২৮

ভ-২৪Subgrid কী সমস্যার সমাধান করে? (কঠিন)

পাশাপাশি কার্ডের ভেতরের অংশ — শিরোনাম, দাম, বোতাম — যাতে বাইরের grid-এর সারি মেনে এক রেখায় মেলে, লেখা ছোট-বড় হলেও; এটি এখন Baseline Widely available. পর্ব ২৮

রেসপন্সিভ, আধুনিক CSS, মোশন ও পলিশ (পর্ব ৩০–৪৫)

ভ-২৫ফোনে 100vh কেন সমস্যা করে? (মাঝারি)

ঠিকানা-বার ওঠানামা করায় 100vh অনেক সময় দৃশ্যমান পর্দার চেয়ে বড় হয়, নিচের অংশ ঢাকা পড়ে; dvh (dynamic viewport height) বর্তমান দৃশ্যমান উচ্চতা মানে — Baseline Widely available. পর্ব ২০

ভ-২৬ফোনে :hover-এর ওপর ভরসা করা যায়? (মাঝারি)

না — touch পর্দায় hover নির্ভরযোগ্য নয়; জরুরি তথ্য বা মেনু শুধু hover-এ লুকাবেন না, দরকারে @media (hover: hover) দিয়ে শুধু hover-ক্ষম ডিভাইসে বাড়তি সাজ। পর্ব ৩০

ভ-২৭::before দেখা যাচ্ছে না — প্রথমে কী দেখবেন? (সহজ)

content দেওয়া আছে কি না (ফাঁকা হলেও content: ""); আর element-টি <img> বা <input>-এর মতো replaced element কি না — সেখানে ::before কাজ করে না। পর্ব ৩৪

ভ-২৮transition: all কেন এড়াবেন? (মাঝারি)

যে property অ্যানিমেট করার কথা ভাবেননি সেগুলোও করে — অপ্রত্যাশিত আচরণ আর পারফরম্যান্সের খরচ; নির্দিষ্ট property-র নাম লিখুন। পর্ব ৩৮

ভ-২৯currentColor কী কাজে লাগে? (সহজ)

element-এর নিজের color-এর মান; SVG আইকনে fill: currentColor দিলে আইকন পাশের লেখার রঙের সাথে মিলে যায়, hover-এও একসাথে বদলায়। পর্ব ৪৪

ভ-৩০outline: none লেখা কেন বিপজ্জনক? (সহজ)

কি-বোর্ডের ব্যবহারকারী focus দেখতে পান না — কোথায় আছেন বোঝেন না; সরালে অবশ্যই :focus-visible-এ স্পষ্ট বিকল্প দিন। পর্ব ৪৫

ভ-৩১Anchor positioning কী, এখন কি সব জায়গায় ব্যবহার করা যায়? (কঠিন)

tooltip বা মেনুকে JavaScript ছাড়াই অন্য একটি element-এর গায়ে বসানোর নতুন CSS; ২০২৫–২৬-এ এটি এখনো সব প্রধান ব্রাউজারে নিশ্চিত নয় — Baseline হওয়ার পথে — তাই fallback-সহ বাড়তি সুবিধা হিসেবে। পর্ব ৩৭

পেশাদার কাজের ধারা (পর্ব ৪৬–৫৪)

ভ-৩২Minify কী? (সহজ)

ফাঁকা জায়গা, মন্তব্য আর অপ্রয়োজনীয় অক্ষর বাদ দিয়ে CSS-JS ফাইল ছোট করা; সার্ভারের gzip বা Brotli সংকোচনের সাথে মিলে ডাউনলোড আরও কমে। পর্ব ৪৯

ভ-৩৩CDN কী? (সহজ)

নানা দেশে ছড়ানো সার্ভারের জাল, যা ব্যবহারকারীর সবচেয়ে কাছের সার্ভার থেকে ফাইল পাঠায় — দূরত্ব কম, পাতা দ্রুত। পর্ব ৫১

ভ-৩৪Lighthouse কী মাপে? (সহজ)

Performance, Accessibility, Best Practices আর SEO — ল্যাবের পরিবেশে একবারের মাপ; আসল ব্যবহারকারীর মাপ (field data) আলাদা। পর্ব ৪৯

ভ-৩৫.gitignore কী কাজে লাগে? (সহজ)

কোন ফাইল Git-এ কখনো যাবে না তা বলে — .env, পাসওয়ার্ড, node_modules, বড় build ফাইল। পর্ব ৫৩

ভ-৩৬Static সাইটেও HTTPS লাগে কেন? (মাঝারি)

পথে কেউ পাতা পড়তে বা বদলাতে (যেমন বিজ্ঞাপন ঢোকাতে) পারে না; ব্রাউজার “Not secure” সতর্কতা দেখায় না; আর অনেক আধুনিক ব্রাউজার-সুবিধা শুধু HTTPS-এ চলে। পর্ব ৫৩

যে ফলো-আপ প্রায় নিশ্চিত আসে

প্রথম প্রশ্নসম্ভাব্য ফলো-আপকোথায় প্রস্তুতি
semantic HTML?div-বোতামের সমস্যা? ARIA কখন? article বনাম section?ক-০৭, খ-০৫, খ-০৭, অংশ ৯-এর ডায়াগ্রাম
box model?box-sizing? margin collapsing? padding-এর % কিসের?অংশ ১, গ-০৬, গ-০৭, গ-০৯
specificity?!important কখন? inline style কোথায় বসে? @layer কী বদলায়?গ-০৫
position?absolute কিসের সাপেক্ষে? sticky কাজ করছে না কেন? z-index 9999 তবু নিচে কেন?ঘ-০৩, ঘ-০৪
flex বনাম grid?flex: 1 মানে? auto-fit বনাম auto-fill? একসাথে ব্যবহার?ঘ-০৭, ঘ-০৮, ঘ-০৯
responsive?viewport meta না দিলে? mobile-first কেন? container query কখন?ঙ-০১, ঙ-০২
পারফরম্যান্স?LCP-র সীমা? CLS কমাবেন কীভাবে? lazy loading কোথায় নয়?ক-০৯, চ-০৫

১০ · AI-কে ভাইভা পরীক্ষক বানান — আর তাকে যাচাই করুন

ভাইভা অনুশীলনের সবচেয়ে বড় সমস্যা হলো প্রশ্ন করার মানুষ না থাকা। AI এখানে কাজের সঙ্গী — ক্লান্ত হয় না, যেকোনো সময় প্রস্তুত, আর আপনার উত্তর থেকে follow-up প্রশ্ন বানাতে পারে। কিন্তু নিজে থেকে AI প্রায়ই খুব নরম পরীক্ষক — সব উত্তরেই প্রশংসা করে। আর HTML-CSS-এ AI শিখেছে ইন্টারনেটের কোটি পাতা থেকে, যার বড় অংশ পুরোনো: তাই তার “মডেল উত্তরে” মাঝে মাঝে float-লেআউট, বাতিল ট্যাগ, অপ্রয়োজনীয় -webkit- prefix বা ভুল Baseline দাবি ঢুকে পড়ে। তাই তাকে স্পষ্ট নিয়ম দিন, আর প্রতিটি দাবি যাচাই করুন।

নিচের prompt-টি কপি করে যেকোনো AI চ্যাটে দিন। বিষয়ের জায়গায় যে মডিউল ঝালাতে চান সেটি লিখুন:

তুমি একজন কড়া HTML ও CSS ভাইভা পরীক্ষক। বিষয়: [লেআউট — position, flexbox, grid]. ধরে নাও ২০২৫–২৬ সালের আধুনিক ব্রাউজার, আর HTML Living Standard. নিয়ম: ১. একবারে একটিই প্রশ্ন করো, তারপর আমার উত্তরের জন্য অপেক্ষা করো। ২. আমার উত্তর থেকেই একটু গভীর একটি follow-up প্রশ্ন বানাও, যেমন সত্যিকারের ভাইভা বোর্ড করে। ৩. প্রতিটি উত্তরকে ১০-এর মধ্যে নম্বর দাও, আর ঠিক কোন তথ্য ভুল বা বাদ পড়েছে বলো। প্রশংসা নয়, সঠিকতা। ৪. আমি ভুল বললে সাথে সাথে সঠিক উত্তর দিও না; আগে একটা ইঙ্গিত দিয়ে আরেকবার চেষ্টা করতে দাও। ৫. আমার উত্তর "সংজ্ঞা, উদাহরণ, সীমা" কাঠামো মেনেছে কি না বলো। ৬. মাঝে মাঝে ছোট HTML-CSS কোড দিয়ে জিজ্ঞেস করো পাতায় কী দেখাবে। ৭. float-লেআউট, center বা font ট্যাগ, অপ্রয়োজনীয় -webkit- prefix কখনো আধুনিক উপায় হিসেবে দেখাবে না। ৮. কোনো feature-এর ব্রাউজার সাপোর্ট নিয়ে নিশ্চিত না হলে স্পষ্ট বলো; Baseline অবস্থা আন্দাজে বলো না। ৯. ১০টি প্রশ্নের পর আমার দুর্বল জায়গার তালিকা দাও, আর কোন ধারণা আবার পড়া উচিত বলো।

লিখিত উত্তরের জন্য খাতার উত্তর টাইপ করে দিন এবং বলুন: “এটি একটি ৫ নম্বরের ‘পার্থক্য লিখুন’ প্রশ্নের উত্তর। পরীক্ষক হিসেবে নম্বর দাও, আর সংজ্ঞা, টেবিল, উদাহরণ, উপসংহার — কোন অংশ দুর্বল বলো; কিন্তু পুরো উত্তর নতুন করে লিখে দিও না।” শেষ শর্তটি জরুরি — নইলে আপনি শিখবেন না, শুধু আরেকটি উত্তর মুখস্থ করবেন। নিজের পোর্টফোলিও নিয়েও একই কাজ করুন: README আর মূল CSS দিয়ে বলুন “এই প্রজেক্ট নিয়ে আমাকে পাঁচটি কঠিন ভাইভা প্রশ্ন করো” — তবে ক্লায়েন্টের গোপন তথ্য বা কোনো key আগে সরিয়ে নিন।

HTML-CSS নিয়ে AI-এর উত্তরে যেসব ভুল প্রায়ই থাকে

AI যা বলে বা লেখেআসল সত্য
“HTML5-এ <b> আর <i> বাতিল”বাতিল নয় — নতুন অর্থ দেওয়া হয়েছে (ক-০৭); বাতিল হয়েছে <font>, <center>
“GET-এ সর্বোচ্চ ২০৪৮ অক্ষর পাঠানো যায়”HTTP নিয়মে কোনো স্থির সীমা নেই; সংখ্যাটি পুরোনো Internet Explorer-এর URL-সীমা থেকে আসা — বলুন “ব্যবহারিক সীমা আছে” (খ-০১)
“POST নিরাপদ, কারণ ডেটা এনক্রিপ্ট হয়”এনক্রিপশন আসে HTTPS থেকে, দুই method-এই (খ-০১)
কলাম-লেআউটে float আর clearfix, বা display: -webkit-boxflex বা grid; prefix লাগলে Autoprefixer (ঘ-১০, চ-০৪)
“z-index যেকোনো element-এ কাজ করে”, সমস্যায় 9999positioned বা flex/grid item-এ; আসল কারণ প্রায়ই stacking context (ঘ-০৪)
<div role="button" onclick> দিয়ে বোতামআসল <button> — ARIA-র প্রথম নিয়ম (খ-০৭)
“container style query সব ব্রাউজারে চলে” বা উল্টো “container query এখনো নতুন, ব্যবহার করবেন না”size query Widely available; style query এখনো Baseline নয় (ঙ-০২)
em আর rem-এর সংজ্ঞা অদলবদলrem = root-এর font-size; em = নিজের (font-size-এ মা-বাবার) (গ-০৮)

AI-এর উত্তর যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

এগুলো মুখস্থের প্রশ্ন নয় — পরীক্ষা আর শেখা নিয়ে একটু থেমে ভাবার প্রশ্ন। নিজে কিছুক্ষণ ভাবুন, তারপর প্রশ্নে চেপে উত্তর দেখুন।

প্র ০১কিছু পরীক্ষায় এখনো <font>, <center> বা টেবিল-লেআউট নিয়ে প্রশ্ন আসে। এমন প্রশ্নের উত্তর কীভাবে দেবেন?

আগে ইতিহাসটা বুঝুন। ১৯৯০-এর দশকের মাঝামাঝি ব্রাউজার-যুদ্ধের সময় Netscape নিজের মতো ট্যাগ যোগ করত, যাতে ডিজাইনাররা রং আর ফন্ট বদলাতে পারেন — <font> তেমনই একটি। ১৯৯৭ সালের HTML 3.2 এগুলোকে মানদণ্ডে তুলে নেয়, কারণ ওয়েবে তখন এগুলো সর্বত্র। কিন্তু একই সময়ে CSS এসেছে (CSS1, ১৯৯৬), আর নীতি দাঁড়ায়: HTML বলবে অর্থ, CSS বলবে চেহারা। তাই ১৯৯৭ সালের HTML 4.0 (আর পরে ১৯৯৯ সালের 4.01) <font> আর <center>-কে deprecated করে, আর HTML5 এগুলোকে পুরোপুরি অচল (obsolete) ঘোষণা করে — আজকের validator এগুলো দেখলে error দেয়, যদিও পুরোনো পাতা না ভাঙার জন্য ব্রাউজার এখনো এদের দেখায়।

পাঠ্যবই আর প্রশ্নপত্র প্রযুক্তির চেয়ে ধীরে বদলায়; তাই পুরোনো প্রশ্ন টিকে থাকে। এর মোকাবিলায় সবচেয়ে ভালো কৌশল হলো দুই স্তরের উত্তর। প্রথমে প্রশ্নের সরাসরি উত্তর — “<center> ভেতরের বিষয়বস্তু মাঝখানে বসাত।” তারপর এক–দুই বাক্যে বর্তমান অবস্থা আর আধুনিক বিকল্প — “এটি এখন HTML থেকে বাতিল; আজ একই কাজ CSS-এ হয়: লেখায় text-align: center, বাক্সে margin-inline: auto বা grid-এর place-items: center.” এতে পরীক্ষক যা চেয়েছেন তা-ও পান, আর বোঝেন আপনি হালনাগাদ।

টেবিল-লেআউটের প্রশ্নেও একই নীতি: টেবিল দিয়ে কীভাবে কলাম বানানো হতো তা বলুন, তারপর বলুন কেন এটি এখন ভুল — screen reader ভুল কাঠামো শোনায়, ফোনে ভাঙে, আর কোড জটিল — এবং grid দিয়ে একই নকশার ছোট উদাহরণ দিন। কখনো পরীক্ষককে “ভুল প্রশ্ন” বলে খোঁচা দেবেন না; ইতিহাস জানাটাও জ্ঞান। আর মনে রাখুন, HTML ইমেইলে এখনো টেবিল-লেআউট চলে, কারণ কিছু ইমেইল অ্যাপ আধুনিক CSS মানে না — এই একটি তথ্য যোগ করলে উত্তরটি আরও পূর্ণ হয়।

মূল উপলব্ধি: পুরোনো প্রশ্নের সেরা উত্তর হলো — সরাসরি উত্তর, তারপর বর্তমান অবস্থা, তারপর আধুনিক বিকল্প।

প্র ০২“পার্থক্য লিখুন” প্রশ্ন এত জনপ্রিয় কেন? মুখস্থ করা পার্থক্যের টেবিলে বিপদ কোথায়?

পার্থক্যের প্রশ্ন পরীক্ষকের কাছে একটি দক্ষ যন্ত্র। একটি ধারণা আলাদাভাবে বলা সহজ, কিন্তু দুটি কাছাকাছি ধারণার সীমানা কোথায়, তা বলতে হলে দুটিই বুঝতে হয়। “visibility: hidden কী?” — মুখস্থ সংজ্ঞায় চলে যায়। “visibility: hidden, display: none আর opacity: 0-এর পার্থক্য?” — এখানে জায়গা, ক্লিক, focus, screen reader — চারটি মাপকাঠি না জানলে টেবিলই বানানো যায় না। তাই এই প্রশ্ন কম সময়ে গভীরতা মাপে, আর নম্বর দেওয়াও সহজ — প্রতিটি সঠিক সারি একটি ভাগ।

বিপদটা আসে মুখস্থ টেবিল থেকে, কারণ টেবিলেরও বয়স হয়। কয়েকটি উদাহরণ দেখুন। অনেক পুরোনো নোটে লেখা “GET-এ সর্বোচ্চ ২০৪৮ অক্ষর” — অথচ HTTP-র নিয়মে কোনো স্থির সীমা নেই; বর্তমান HTTP নির্দেশিকা (RFC 9110) বরং পরামর্শ দেয় অন্তত ৮০০০ অক্ষরের URL সামলাতে। ২০৪৮-এর কাছাকাছি সংখ্যাটি ছিল পুরোনো Internet Explorer-এর নিজস্ব সীমা। আরেকটি পুরোনো সারি: “POST বেশি নিরাপদ” — অথচ এনক্রিপশন আসে HTTPS থেকে। কিছু নোটে এখনো XHTML-কে “ভবিষ্যতের HTML” বলা আছে, বা float-কে লেআউটের প্রধান উপায়।

আবার কিছু সারি সময়ের সাথে উল্টে যায়: কয়েক বছর আগে “container query নেই, শুধু media query” লেখা ঠিক ছিল; ২০২৩ সালের পর থেকে আর নয়। “CSS-এ parent selector নেই” — :has() আসার পর ভুল। “CSS-এ nesting করতে Sass লাগে” — এখন ব্রাউজারেই আছে।

তাই টেবিল মুখস্থ নয়, মাপকাঠি মুখস্থ করুন: জায়গা নেয় কি না, কিসের সাপেক্ষে, কখন ঠিক হয় (compile না runtime), কে দেখতে পায়, অ্যাক্সেসিবিলিটিতে কী প্রভাব, ব্রাউজার সাপোর্ট। তাহলে অচেনা জোড়া এলেও — ধরুন “clip বনাম hidden” — নিজেই টেবিল বানাতে পারবেন। আর প্রতিটি সারি একবার নিজের চোখে যাচাই করুন — এই পাতার লাইভ এডিটরগুলো ঠিক সেই কাজের জন্য।

মূল উপলব্ধি: পার্থক্যের টেবিল হলো বোঝার পরীক্ষা; মাপকাঠি জানলে টেবিল নিজেই তৈরি হয়, আর পুরোনো নোটের ভুল সারিও চোখে পড়ে।

প্র ০৩ভাইভায় প্রশ্ন এলো: “এই প্রজেক্টের কোড কি AI দিয়ে লিখিয়েছেন?” সৎ উত্তর কি আপনার ক্ষতি করবে?

প্রথমে মনে রাখুন, প্রশ্নটি কেন আসে। AI coding tool এখন সাধারণ — অনেক অফিসেই ডেভেলপাররা এগুলো ব্যবহার করেন। তাই পরীক্ষক সাধারণত “ব্যবহার করেছেন কি না” দিয়ে বিচার করেন না; তিনি জানতে চান, কোডটির দায়িত্ব আপনি নিতে পারেন কি না। একটি কোম্পানি বা ক্লায়েন্টের কাছে আসল ঝুঁকি হলো এমন একজন, যিনি নিজের পাঠানো কোড ব্যাখ্যা করতে পারেন না — কারণ সেই কোডে ভুল থাকলে তিনি তা ধরতেও পারবেন না।

তাই সৎ উত্তরই সবচেয়ে নিরাপদ, তবে একটি কাঠামোয়: কোথায় ব্যবহার করেছেন, কীভাবে যাচাই করেছেন, আর কী বদলেছেন। যেমন: “হ্যাঁ, শুরুর কাঠামো আর কিছু CSS-এর খসড়া AI দিয়ে বানিয়েছি। তারপর validator-এ দিয়ে তিনটি error পেয়ে ঠিক করেছি, div দিয়ে বানানো মেনু-বোতামকে আসল button করেছি, আর float-এর লেআউট grid-এ বদলেছি। কার্ডের container query-র অংশটি নিজে লিখেছি — চাইলে ব্যাখ্যা করি।” এই উত্তরে তিনটি জিনিস দেখা যায়: সততা, যাচাই করার দক্ষতা, আর নিজের অবদানের স্পষ্টতা।

উল্টো দিকটা ভাবুন। “না, সব নিজে লিখেছি” বললেন, অথচ পরীক্ষক একটি লাইন দেখিয়ে জিজ্ঞেস করলেন “এখানে isolation: isolate কেন?” — আর আপনি জানেন না। তখন সমস্যা আর AI নয়, আস্থা। একবার আস্থা গেলে বাকি ঠিক উত্তরগুলোও সন্দেহে পড়ে। কিছু পরীক্ষা বা প্রতিযোগিতায় AI ব্যবহারের নিয়ম আলাদা থাকে — সেখানে নিয়মটি আগে পড়ে নিন আর মেনে চলুন; নিয়ম ভেঙে পরে লুকানো সবচেয়ে খারাপ পথ।

প্রস্তুতির কৌশল সহজ: প্রজেক্টের প্রতিটি ফাইল খুলে নিজেকে জিজ্ঞেস করুন — “এই লাইনটি মুছলে কী হবে?” যেখানে উত্তর জানেন না, সেখানে DevTools-এ মুছে দেখুন, MDN-এ পড়ুন। এই অনুশীলনের পর AI-এর লেখা কোডও আপনার কোড হয়ে যায়, কারণ আপনি তা বোঝেন।

মূল উপলব্ধি: পরীক্ষক টুল নয়, দায়িত্ব যাচাই করেন — সৎভাবে বলুন কোথায় AI, আর দেখান আপনি প্রতিটি লাইন বোঝেন ও যাচাই করেছেন।

প্র ০৪অ্যাক্সেসিবিলিটি নিয়ে প্রশ্ন পরীক্ষা ও ইন্টারভিউতে ক্রমশ বেশি আসছে কেন?

কারণটি একসাথে নৈতিক, আইনি আর ব্যবসায়িক। ইতিহাস দিয়ে শুরু করা যাক: W3C-র Web Accessibility Initiative ১৯৯৯ সালে WCAG 1.0 প্রকাশ করে; ২০০৮ সালে আসে প্রযুক্তি-নিরপেক্ষ WCAG 2.0 আর তার POUR নীতি; ২০১৮ সালে WCAG 2.1 মোবাইল আর দুর্বল দৃষ্টির জন্য শর্ত যোগ করে (যেমন ৩২০px-এ reflow); ২০২৩ সালের অক্টোবরে WCAG 2.2 যোগ করে focus ঢাকা না পড়া আর ন্যূনতম চাপার মাপের মতো শর্ত। নির্দেশিকা যত পরিণত হয়েছে, বিভিন্ন দেশের আইনও তত তাকে মানদণ্ড হিসেবে নিয়েছে — যেমন ইউরোপীয় ইউনিয়নের European Accessibility Act, যা ২০২৫ সালের জুন থেকে অনেক ডিজিটাল পণ্য ও সেবায় প্রযোজ্য। বিদেশি ক্লায়েন্টের জন্য কাজ করা বাংলাদেশি ফ্রিল্যান্সারের কাছেও তাই এটি বাস্তব শর্ত।

দ্বিতীয় কারণ মানুষ। প্রতিবন্ধিতা শুধু স্থায়ী নয় — ভাঙা হাত, রোদে ঝলসানো ফোনের পর্দা, কোলে বাচ্চা নিয়ে এক হাতে ফোন চালানো, বয়সের সাথে কমে আসা দৃষ্টি। কম দামের ফোন আর ধীর ইন্টারনেটে যিনি পাতা খোলেন, অ্যাক্সেসিবল আর হালকা পাতা তাঁর জন্যও ভালো। ফুটপাতের ঢালু কিনারা (curb cut) হুইলচেয়ারের জন্য বানানো, কিন্তু কাজে লাগে ঠেলাগাড়ি আর লাগেজ-টানা সবার — একে বলে curb-cut effect.

তৃতীয় কারণ প্রার্থী বাছাইয়ের সুবিধা। অ্যাক্সেসিবিলিটির প্রশ্ন খুব অল্প কথায় দেখিয়ে দেয় প্রার্থী HTML-কে কতটা গভীরে বোঝেন: “div-এ onclick কেন খারাপ” প্রশ্নের উত্তর দিতে focus, কি-বোর্ড, role, accessibility tree — সব জানতে হয়। যে প্রার্থী semantic HTML ঠিকভাবে লেখেন, তাঁর কোড সাধারণত SEO, পারফরম্যান্স আর রক্ষণাবেক্ষণেও ভালো হয়।

আর একটি বাস্তব কথা: স্বয়ংক্রিয় টুল সব সমস্যা ধরতে পারে না, AI-এর লেখা কোডেও অ্যাক্সেসিবিলিটির ভুল প্রায়ই থাকে। তাই মানুষের বিচার — কি-বোর্ডে চালানো, screen reader-এ শোনা — এখনো জরুরি দক্ষতা, আর ইন্টারভিউয়াররা সেটাই যাচাই করেন।

মূল উপলব্ধি: অ্যাক্সেসিবিলিটি এখন “ভালো হলে ভালো” নয় — আইন, ব্যবহারকারী আর কোডের মান, তিন দিক থেকেই এটি মূল দক্ষতা।

প্র ০৫বাস্তবে যখন DevTools, লাইভ প্রিভিউ আর AI আছে, তখন খাতায় হাতে HTML-CSS লেখার পরীক্ষা কি অর্থহীন?

প্রথম দেখায় মনে হতে পারে, হ্যাঁ। কাজের জায়গায় কেউ কাগজে CSS লেখে না; editor নিজেই ট্যাগ বন্ধ করে, ভুল বানানে লাল দাগ দেয়, আর প্রিভিউ সাথে সাথে দেখায়। কিন্তু হাতে লেখার পরীক্ষা আসলে টাইপিং মাপে না — মাপে আপনার মাথার ভেতরের মডেল। প্রিভিউ ছাড়া position: absolute কোথায় বসবে, flex: 1 দিলে কী ভাগ হবে, margin মিলে যাবে কি না — এসব যিনি মনে মনে বলতে পারেন, তিনি প্রিভিউ পেলে আরও দ্রুত কাজ করেন, কারণ তিনি জানেন কী খুঁজছেন।

দাবা খেলোয়াড়দের কথা ভাবুন। কম্পিউটার তাঁদের চেয়ে ভালো খেলে, তবু তাঁরা মাথায় চাল হিসাব করা অনুশীলন করেন — কারণ কোন সম্ভাবনা আদৌ পরীক্ষা করার মতো, সেটা বোঝার ক্ষমতা আসে ওই অনুশীলন থেকেই। AI-এর যুগে এটি আরও জরুরি: AI এক সেকেন্ডে ৫০ লাইনের CSS দেয়। তার মধ্যে কোন লাইনটি stacking context বানিয়ে আপনার dropdown লুকিয়ে ফেলছে, সেটা ধরতে হলে প্রিভিউর আগে মাথায় ছবিটা থাকতে হয়।

তবে খাতার পরীক্ষার সীমাও আছে, আর তা স্বীকার করাই সৎ। এটি debugging, টুল ব্যবহার, বা বড় প্রজেক্ট গোছানোর দক্ষতা মাপে না; ছোট বানান-ভুলে কঠোর হলে আসল বোঝার চেয়ে মুখস্থকে পুরস্কৃত করে। এ কারণেই অনেক প্রতিষ্ঠান লিখিত পরীক্ষার সাথে ব্যবহারিক বা লাইভ-কোডিং পরীক্ষাও রাখে (পর্ব ৫৯-এ দেখবেন)।

প্রস্তুতির জন্য তাই দুই ধাপের অনুশীলন সবচেয়ে কার্যকর। প্রথমে কাগজে লিখুন, পাশে ফলের একটি স্কেচ আঁকুন। তারপর ঠিক সেই কোড এই পাতার লাইভ এডিটরে বা নিজের ব্রাউজারে টাইপ করে মিলিয়ে দেখুন — স্কেচ আর প্রিভিউ কোথায় আলাদা? প্রতিটি অমিল আপনার মডেলের একটি ফাঁক, আর সেটা ভরাট করাই আসল শেখা।

মূল উপলব্ধি: হাতে লেখা কোড মাথার ভেতরের মডেল যাচাই করে — সেই মডেলই AI আর টুলের যুগে ভুল ধরার সবচেয়ে বড় হাতিয়ার।

নিজেকে যাচাই করুন — উত্তর লেখার কৌশল ও HTML-CSS-এর মূল তথ্য

প্রথমে একটি ক্রম সাজানোর প্রশ্ন, তারপর উত্তর লেখার কৌশল আর ক্লাসিক “পার্থক্য” নিয়ে MCQ. ভুল হলে কারণসহ ব্যাখ্যা পাবেন।

ক্রম“X চিত্রসহ ব্যাখ্যা করুন” ধরনের বড় প্রশ্নের একটি ভালো উত্তরের অংশগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. 📌 এক–দুই বাক্যের নির্ভুল সংজ্ঞা
  2. 🔍 ব্রাউজার কীভাবে কাজটি করে — ধাপে ধাপে ব্যাখ্যা
  3. 💻 ছোট, আধুনিক উদাহরণ-কোড
  4. 🗺️ লেবেলসহ চিত্র
  5. ✅ উপসংহার — কখন ব্যবহার, সীমা

“box model চিত্রসহ ব্যাখ্যা করুন” — একটি ৫ নম্বরের প্রশ্নে কোন উত্তরটি পূর্ণ নম্বরের সবচেয়ে কাছে? (সহজ)

  • শুধু চারটি স্তরের নাম: content, padding, border, margin
  • দুই বাক্যের সংজ্ঞা, চার স্তরের ব্যাখ্যা, box-sizing-এর হিসাবসহ ছোট কোড, লেবেলসহ চিত্র, এক লাইনের উপসংহার
  • লেবেল ছাড়া রঙিন একটি চিত্র
  • দুই পাতা জুড়ে CSS-এর ইতিহাস, শেষে box model-এর নাম

ভাইভায় এমন প্রশ্ন এলো, যার উত্তর আপনি পুরোপুরি জানেন না। সবচেয়ে ভালো পদক্ষেপ কোনটি? (সহজ)

  • আত্মবিশ্বাস দেখাতে আন্দাজে একটি উত্তর জোর দিয়ে বলা
  • চুপ করে থাকা, যতক্ষণ না পরের প্রশ্ন আসে
  • “পুরো নিশ্চিত নই, তবে এভাবে ভাবছি…” বলে যা জানেন তা থেকে যুক্তি দেওয়া, আর কীভাবে যাচাই করতেন তা বলা
  • প্রশ্ন এড়িয়ে নিজের জানা অন্য বিষয়ে কথা বলা শুরু করা

CSS-এ visibility: hidden আর display: none নিয়ে কোন কথাটি সঠিক? (সহজ)

  • visibility: hidden জায়গা ধরে রাখে, display: none রাখে না
  • display: none জায়গা ধরে রাখে, visibility: hidden রাখে না
  • দুটিই চোখে লুকায়, কিন্তু screen reader দুটিই পড়ে
  • দুটিই অদৃশ্য অবস্থায় ক্লিক নেয়

.card { font-size: 20px; } আর তার সন্তান .box { font-size: 1.5em; padding: 1em; }. .box-এর padding কত px হবে? (মাঝারি)

  • 16px
  • 20px
  • 24px
  • 30px

HTML ফর্মের GET আর POST method নিয়ে কোন কথাটি সঠিক? (মাঝারি)

  • GET-এ HTTP-র নিয়মে সর্বোচ্চ ২০৪৮ অক্ষর পাঠানো যায়
  • POST ডেটা request body-তে পাঠায়, তবে পথে গোপন রাখার জন্য HTTPS লাগে
  • method না লিখলে ফর্ম POST-এ জমা হয়
  • সার্চ ফর্মে সবসময় POST ব্যবহার করা উচিত

নিচের কোন selector-এর specificity সবচেয়ে বেশি? (মাঝারি)

  • article p.note
  • .nav .item a
  • #tip
  • ul li a:hover

CSS-এ একটি flex item-এ flex: 1 লিখলে তা কোন তিন মানের সংক্ষিপ্ত রূপ? (মাঝারি)

  • 1 1 0%
  • 1 1 auto
  • 0 1 auto
  • 1 0 auto

নিচের কোন কাজটি CSS custom property (--brand) পারে, কিন্তু Sass variable ($brand) পারে না? (মাঝারি)

  • একবার রং লিখে বহু নিয়মে ব্যবহার করা
  • একটি map থেকে loop চালিয়ে দশটি utility class তৈরি করা
  • মানের সাথে গাণিতিক হিসাব করা
  • পাতা খোলা অবস্থায় dark mode-এর media query-তে নতুন মান দিয়ে সব জায়গার রং একসাথে বদলানো

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বে ব্যবহৃত সব শব্দ এখানে একসাথে:

মনে রাখুন

  1. বড় প্রশ্নে পাঁচ অংশ: সংজ্ঞা → ব্যাখ্যা → উদাহরণ বা কোড → চিত্র → উপসংহার; নম্বর দেখে দৈর্ঘ্য — ২ নম্বরে কয়েক লাইন, ১০ নম্বরে দেড়–আড়াই পৃষ্ঠা।
  2. “পার্থক্য লিখুন” প্রশ্নে দুটির এক লাইনের সংজ্ঞা আর একই মাপকাঠির টেবিল — জায়গা, কিসের সাপেক্ষে, কখন ঠিক হয়, অ্যাক্সেসিবিলিটি, সাপোর্ট।
  3. খাতার কোড সঠিক, আধুনিক আর সবার জন্য: semantic element, label ও alt, flex ও grid, focus আর ছোট পর্দা — float, <center> শুধু ইতিহাস হিসেবে।
  4. ভাইভায় তিন বাক্য — সংজ্ঞা, উদাহরণ, সীমা; না জানলে সৎভাবে যুক্তি দিয়ে এগোন আর যাচাইয়ের উপায় বলুন; নিজের প্রজেক্টের প্রতিটি সিদ্ধান্তের কারণ নিজের ভাষায় বলতে পারুন।
  5. AI দিয়ে ভাইভা অনুশীলন করুন, কিন্তু তার প্রতিটি কোড চালিয়ে আর প্রতিটি সাপোর্ট-দাবি MDN ও Can I use-এ মিলিয়ে নিন।

পরের পর্বে: ফ্রন্ট-এন্ড ইন্টারভিউর প্রশ্ন — HTML, CSS আর অ্যাক্সেসিবিলিটি নিয়ে ইন্টারভিউয়াররা যেভাবে প্রশ্ন করেন, বাস্তব পরিস্থিতির প্রশ্ন আর ভালো উত্তরের ধরন।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান