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

CSS-এর সাথে পরিচয় — rule, property আর CSS যোগ করার তিন উপায়

Introduction to CSS — Rule Anatomy, Inline, Internal & External Stylesheets, Browser Defaults and Error Handling

Taught in Bangla, this lesson introduces CSS: why it replaced font tags, the path from CSS1 and CSS2 to CSS3 modules and Baseline, and the anatomy of a rule with selector, declaration block, property and value. It compares inline, internal and external stylesheets, explains user-agent styles, a modern reset versus normalize.css, how CSS silently ignores errors and DevTools, comments, and whether CSS is a programming language.

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

  • CSS কোন সমস্যার সমাধান করতে এলো — font ট্যাগের যুগ থেকে CSS1, CSS2, CSS3 মডিউল আর আজকের Baseline
  • একটি CSS rule-এর প্রতিটি অংশের নাম আর কাজ — selector, declaration block, property, value, semicolon
  • inline, internal আর external — তিন উপায়ের লাভ-ক্ষতি, আর কেন বাস্তব সাইটে external stylesheet
  • ব্রাউজারের ডিফল্ট স্টাইল (user-agent stylesheet), আধুনিক ছোট reset বনাম normalize.css
  • CSS-এর ক্ষমাশীল ভুল-সামলানো, DevTools-এ ভুল ধরা, comment, আর “CSS কি প্রোগ্রামিং ভাষা?” বিতর্ক

১ · একই HTML, নতুন চেহারা — CSS কেন দরকার

পর্ব ১৫-এ আপনি শাপলা গণপাঠাগারের জন্য একটি পূর্ণ ওয়েবসাইট বানিয়েছেন। সাইটটি সঠিক, অ্যাক্সেসিবল, validator-এ পাস — কিন্তু দেখতে সাদামাটা। সাদা পাতায় কালো লেখা, নীল দাগ দেওয়া লিংক, বুলেটসহ মেনু। ব্রাউজার আপনার HTML-এর অর্থ ঠিকই বুঝেছে, কিন্তু চেহারার কোনো নির্দেশ পায়নি, তাই নিজের ডিফল্ট চেহারা দিয়েছে।

এখন সেই হোম পাতার একটি ছোট অংশ নিচে। ওপরে আপনি যা এডিট করবেন, তা শুধু CSS — HTML স্থির, একটি অক্ষরও বদলাবে না। প্রিভিউটি দেখুন:

body {
  font-family: system-ui, sans-serif;
  line-height: 1.6;
  max-width: 36rem;
  margin: 0 auto;
  padding: 1rem;
  color: #1f2937;
}
header {
  border-bottom: 3px solid #2e7d32;
}
nav ul {
  list-style: none;
  padding: 0;
  display: flex;
  gap: 1rem;
}
h1 {
  color: #2e7d32;
}
footer {
  margin-top: 2rem;
  font-size: 0.9rem;
  color: #6b7280;
}

লেখা এখন পড়ার মতো চওড়া একটি কলামে মাঝখানে, header-এর নিচে সবুজ দাগ, মেনুর তিনটি লিংক বুলেট ছাড়া পাশাপাশি, শিরোনাম সবুজ, আর ফুটার ছোট ও ধূসর। চেষ্টা করুন: #2e7d32 (সবুজ) দুই জায়গাতেই বদলে #1d4ed8 (নীল) করুন — পাঠাগারের “ব্র্যান্ড রং” বদলে গেল। তারপর পুরো CSS মুছে দিন — পাতা ভাঙে না, শুধু আবার সাদামাটা হয়। কোনো লাইনের মানে এখনই না বুঝলে চিন্তা নেই; প্রতিটি property আসবে পরের পর্বগুলোতে।

এই ছোট পরীক্ষা থেকে CSS-এর মূল কথাটা বেরিয়ে আসে। HTML-এর কাজ বলা — “এটা শিরোনাম, এটা মেনু, এটা ঠিকানা”। CSS-এর কাজ বলা — “শিরোনাম সবুজ হবে, মেনু পাশাপাশি বসবে, ঠিকানা ছোট হবে”। একে বলে separation of concerns — কাজ আলাদা রাখার নীতি।

নতুন একটি বাড়ির কথা ভাবুন। ইট, রড, বিম, দেয়াল — এগুলো কাঠামো, একবার তৈরি হলে সহজে বদলায় না। দেয়ালের রং, পর্দা, টাইলস — এগুলো সাজ, ঈদের আগে চাইলেই বদলানো যায়। রংমিস্ত্রি যদি প্রতিবার রং করতে দেয়াল ভেঙে নতুন করে গাঁথতেন, তাহলে কী অবস্থা হতো? CSS-এর আগে ওয়েবে ঠিক তাই হতো — চেহারা বদলাতে HTML-এর ভেতরে হাত দিতে হতো। HTML হলো বাড়ির কাঠামো, CSS হলো রং আর সাজ।

আলাদা রাখার লাভগুলো হাতে-কলমে:

  • একবার বদলালে সব জায়গায়: ৫০ পাতার একটি কোচিং সেন্টারের সাইটে শিরোনামের রং বদলাতে একটি ফাইলের একটি লাইন বদলালেই চলে।
  • এক কাঠামো, অনেক চেহারা: একই HTML ফোনে এক রকম, বড় পর্দায় আরেক রকম, ছাপার কাগজে আরেক রকম, আর dark mode-এ আরেক রকম দেখানো যায় — HTML না বদলেই।
  • অর্থ অক্ষত থাকে: screen reader, সার্চ ইঞ্জিন আর AI-এর ওয়েব-পড়া টুল পড়ে HTML-এর কাঠামো। চেহারার নির্দেশ আলাদা থাকায় কাঠামো পরিষ্কার থাকে।

২ · CSS-এর আগে আর পরে — font ট্যাগ থেকে Baseline

১৯৯১ সালে Tim Berners-Lee যখন ওয়েব বানালেন, তখন HTML-এ চেহারা ঠিক করার প্রায় কিছুই ছিল না। শিরোনাম কত বড় হবে, কোন ফন্টে দেখাবে — সেটা ঠিক করত ব্রাউজার, আর অনেক ব্রাউজারে পাঠক নিজেও ঠিক করতে পারতেন। লেখক শুধু বলতেন “এটা শিরোনাম”।

কিন্তু ওয়েব জনপ্রিয় হতেই ডিজাইনাররা ছাপা পত্রিকার মতো নিয়ন্ত্রণ চাইলেন। ব্রাউজার কোম্পানিগুলো তাড়াহুড়ো করে HTML-এর ভেতরেই চেহারার ট্যাগ যোগ করতে লাগল। Netscape আনল <font> ট্যাগ — <font face="Arial" size="5" color="red">. কিন্তু প্রতিটি শিরোনামে, প্রতিটি পাতায় একই ট্যাগ বারবার লিখতে হতো। রং বদলাতে চাইলে শত শত পাতায় হাজার হাজার জায়গায় হাত দিতে হতো। HTML ফাইল ফুলে উঠল, আর অর্থ চাপা পড়ল চেহারার নিচে।

<!-- ১৯৯০-এর দশকের অভ্যাস — আজ অচল, শুধু ইতিহাস হিসেবে দেখুন -->
<center>
  <font face="Arial" size="6" color="#006600"><b>শাপলা গণপাঠাগার</b></font>
</center>
<font face="Arial" size="2" color="#333333">পাড়ার বই, সবার জন্য</font>

এই বিশৃঙ্খলার সমাধান প্রস্তাব করলেন নরওয়ের Håkon Wium Lie. তিনি তখন CERN-এ — যেখানে ওয়েবের জন্ম — কাজ করতেন। ১৯৯৪ সালের ১০ অক্টোবর তিনি প্রকাশ করেন “Cascading HTML Style Sheets” নামের একটি প্রস্তাব। মূল ভাবনা: চেহারার নিয়ম থাকবে HTML থেকে আলাদা একটি “style sheet”-এ, আর লেখক, পাঠক ও ব্রাউজার — তিন পক্ষের নিয়ম মিলে (cascade হয়ে) চূড়ান্ত চেহারা ঠিক হবে। শিগগিরই তাঁর সাথে যোগ দেন Bert Bos, যিনি নিজেও একটি style sheet ভাষা নিয়ে কাজ করছিলেন। দুজনে মিলে যা দাঁড় করালেন, সেটাই CSS.

CSS-এর সংক্ষিপ্ত সময়রেখা: ১৯৯৪ — Håkon Wium Lie-এর প্রস্তাব। ১৯৯৬ সালের ডিসেম্বর — W3C-এর আনুষ্ঠানিক মান CSS1: ফন্ট, রং, ফাঁকা জায়গা, লেখার সারিবদ্ধতা। একই বছর Internet Explorer 3 প্রথম বাণিজ্যিক ব্রাউজার হিসেবে CSS-এর আংশিক সমর্থন দেয়। ১৯৯৮ সালের মে — CSS2: position, z-index, media type (যেমন ছাপার জন্য আলাদা নিয়ম)। এরপর ব্রাউজারগুলোর বাস্তব আচরণের সাথে মিলিয়ে সংশোধিত CSS 2.1, যা চূড়ান্ত হয় ২০১১ সালে। ততদিনে CSS এত বড় হয়ে গেছে যে একটিমাত্র দলিলে আর ধরে না — তাই ১৯৯০-এর দশকের শেষ দিক থেকেই কাজ ভাগ হয়ে যায় আলাদা আলাদা মডিউলে। এই মডিউলগুলোকে একসাথে বলা হয় “CSS3”.

“CSS4” কেন নেই

CSS3-এর পর অনেকে ভাবেন, এবার নিশ্চয়ই CSS4 আসবে। আসবে না — আর এটা একটা জনপ্রিয় ভুল ধারণা। CSS3 থেকেই CSS আর একটি বড় সংখ্যা ধরে এগোয় না। প্রতিটি মডিউল নিজের গতিতে এগোয়, নিজের “Level” নম্বর নিয়ে: যেমন Selectors Level 4, Color Level 4, Media Queries Level 5. নতুন মডিউল (যেমন Grid) Level 1 থেকে শুরু হয়। তাই “Selectors Level 4” মানে CSS4 নয়, শুধু ওই মডিউলের চতুর্থ সংস্করণ। শেখানোর সুবিধার জন্য মাঝে মাঝে “CSS4” বা “CSS5” নামে যুগ ভাগ করার প্রস্তাব ওঠে, কিন্তু CSS4 নামে কোনো আনুষ্ঠানিক স্পেসিফিকেশন নেই। CSS Working Group প্রতি বছর একটি “CSS Snapshot” দলিল প্রকাশ করে, যেখানে লেখা থাকে কোন মডিউলগুলো এখন স্থিতিশীল।

তাহলে একজন ডেভেলপার কীভাবে জানবেন কোন ফিচার এখন নিরাপদে ব্যবহার করা যায়? এখানে আসে Baseline — ব্রাউজার-নির্মাতাদের যৌথ উদ্যোগের একটি সহজ লেবেল, যা ২০২৩ সালে চালু হয়। কোনো ফিচার সব প্রধান ব্রাউজারের (Chrome, Edge, Firefox, Safari) সর্বশেষ সংস্করণে এলে সেটি Baseline Newly available; তার আড়াই বছর (৩০ মাস) পরে Baseline Widely available — তখন পুরোনো ফোনের ব্রাউজারেও প্রায় নিশ্চিন্তে চলে। আর যা এখনো সব জায়গায় আসেনি, তা not yet Baseline (Baseline নয়)। MDN আর Can I use-এ এই লেবেল দেখা যায়, আর এই কোর্সেও আমরা এই ভাষাতেই সাপোর্ট বলব।

নামের মানে: CSS = Cascading Style Sheets. “Style sheet” মানে চেহারার নিয়মের পাতা (ছাপাখানার পুরোনো শব্দ)। “Cascading” — ঝরনার মতো ধাপে ধাপে নামা — মানে একাধিক জায়গার নিয়ম মিলে কোনটা জিতবে তার ব্যবস্থা। এই cascade-ই CSS-এর হৃদয়, আর এর পুরো গল্প পর্ব ১৮-এ।

৩ · একটি CSS rule-এর শরীর — selector, property, value

CSS-এর বাক্য হলো rule. প্রতিটি rule দুটি প্রশ্নের উত্তর দেয়: কাকে সাজাব? আর কীভাবে সাজাব? দোকানের সাইনবোর্ড বানানোর নির্দেশের মতো: “সব সাইনবোর্ড — পটভূমি সবুজ, লেখা সাদা।”

নিচের স্টেপারে একটি rule-কে টুকরো টুকরো করে দেখুন। প্রতিটি অংশের ইংরেজি নামগুলো মনে রাখুন — DevTools, MDN, AI, ইন্টারভিউ — সবখানে এই নামেই কথা হয়।

ধাপ ১কাকে সাজাব
h1 {
  color: crimson;
  font-size: 2rem;
}
ধাপ ২নির্দেশের থলে
h1 {
  color: crimson;
  font-size: 2rem;
}
ধাপ ৩একটি নির্দেশ
h1 {
  color: crimson;
  font-size: 2rem;
}
ধাপ ৪কোন বৈশিষ্ট্য
h1 {
  color: crimson;
  font-size: 2rem;
}
ধাপ ৫কী মান
h1 {
  color: crimson;
  font-size: 2rem;
}
ধাপ ৬বিভাজক আর পুরো rule
/* এক selector-এ কয়েকটি element, কমা দিয়ে */
h1, h2 {
  color: crimson;
  font-size: 2rem;
}
  1. Selector. h1 বলে দিচ্ছে “পাতার সব <h1>”. এটি selector — rule-এর ঠিকানা অংশ। এখানে একটি element-এর নাম লেখা হয়েছে, কিন্তু selector দিয়ে class, id, attribute, এমনকি “তালিকার প্রথম আইটেম”-ও বেছে নেওয়া যায় (পুরো গল্প পর্ব ১৭-এ)।
  2. Declaration block. কোঁকড়া বন্ধনী { আর }-এর ভেতরের সবটা হলো declaration block — selector যাদের ধরেছে, তাদের জন্য নির্দেশের থলে। বন্ধনী খোলা থাকলে কিন্তু বন্ধ না হলে পরের সব নিয়ম গোলমাল হয়ে যেতে পারে, তাই এটা জোড়ায় জোড়ায় লিখুন।
  3. Declaration. থলের ভেতরের প্রতিটি নির্দেশ একটি declaration: color: crimson; — “রং হবে crimson (গাঢ় লাল)”। একটি block-এ যত খুশি declaration থাকতে পারে।
  4. Property. কোলনের বাঁ দিকের শব্দটি property — কোন বৈশিষ্ট্য বদলাচ্ছেন। CSS-এ কয়েকশো property আছে, আর প্রতিটির নাম ঠিক করা: color, font-size, margin… নাম ইংরেজিতে, ছোট হাতের অক্ষরে, শব্দের মাঝে হাইফেন। বানান এক অক্ষর ভুল হলেই ব্রাউজার চিনবে না (অংশ ৭-এ দেখবেন কী হয়)।
  5. Value. কোলনের ডান দিকে value — বৈশিষ্ট্যটির মান। প্রতিটি property-র নিজের বৈধ মানের তালিকা আছে: color নেয় রঙের নাম বা কোড, font-size নেয় মাপ (2rem, 24px). 2rem-এর মতো সংখ্যা আর এককের মাঝে ফাঁকা রাখা যায় না। একক আর রঙের পুরো গল্প পর্ব ২০-এ।
  6. Semicolon আর পুরো rule. প্রতিটি declaration শেষ হয় ; দিয়ে — এটা দুই নির্দেশের মাঝের দেয়াল। block-এর শেষ declaration-এর পরে ; না দিলেও চলে, কিন্তু সবসময় দেওয়াই নিরাপদ অভ্যাস — পরে নতুন লাইন যোগ করলে ভুল হয় না। আর কমা দিয়ে কয়েকটি selector একসাথে লেখা যায় (h1, h2) — একে বলে selector list. selector আর block মিলে পুরোটা একটি rule, যাকে ruleset-ও বলে।
মূল ধারণা

CSS-এর ব্যাকরণ খুব ছোট: selector { property: value; property: value; }. পুরো CSS — একটি বোতাম থেকে বিশাল ওয়েবসাইটের লেআউট — এই একটি ছাঁচেই লেখা। কঠিন অংশ ব্যাকরণ নয়; কঠিন অংশ হলো কোন property কীভাবে আচরণ করে, আর একাধিক rule একই element ধরলে কোনটা জেতে। সেগুলোই এই কোর্সের বাকি মডিউলগুলোর বিষয়।

এবার নিজে হাতে। নিচের এডিটরে দুটি rule — একটি শিরোনামের, একটি অনুচ্ছেদের:

h1 {
  color: crimson;
  font-size: 2rem;
}

p {
  background: lightyellow;
  padding: 8px;
}

শিরোনামটি গাঢ় লাল, আর অনুচ্ছেদটি হালকা হলুদ পটভূমির একটি বাক্সে, চারপাশে একটু ফাঁক (padding) নিয়ে। চেষ্টা করুন: crimson-কে teal করুন; তারপর p-এর block-এ একটি নতুন declaration যোগ করুন — border: 2px dashed orange;. শেষে p selector-টিকে h1, p করে দেখুন — দুটিই হলুদ বাক্সে চলে আসে, কারণ selector list-এর সব element-এ একই নিয়ম খাটে।

লেখার ধরন — ফাঁকা জায়গা আর ছোট-বড় অক্ষর

CSS ফাঁকা জায়গা (space, নতুন লাইন, tab) নিয়ে খুঁতখুঁতে নয় — পুরো rule এক লাইনেও লেখা যায়: h1{color:crimson;font-size:2rem}. তবে পড়ার সুবিধায় প্রতিটি declaration আলাদা লাইনে, একটু ভেতরে সরিয়ে লেখাই প্রচলিত। আর property-র নাম ও বেশিরভাগ value-তে বড়-ছোট হাতের অক্ষরের পার্থক্য ধরা হয় না (COLOR: RED চলে), কিন্তু সবাই ছোট হাতেই লেখেন। ব্যতিক্রম মনে রাখুন: class আর id-এর নাম, ফন্টের নাম আর URL-এ অক্ষরের ধরন গুরুত্বপূর্ণ হতে পারে — .Notice আর .notice আলাদা class.

৪ · CSS যোগ করার তিন উপায় — inline, internal, external

CSS লিখলেন, কিন্তু HTML পাতা সেটা পাবে কোথা থেকে? তিনটি পথ আছে, আর তিনটিই আজও বৈধ।

Inline — style attribute

একটি element-এর ট্যাগের ভেতরেই: <p style="color: red">. কোনো selector নেই, তাই নিয়ম খাটে শুধু ওই একটি element-এ। এটি inline style.

পৌঁছায়: একটি element

Internal — <style> ট্যাগ

পাতার <head>-এর ভেতরে একটি <style> ট্যাগে পুরো rule লেখা হয়। একে বলে internal stylesheet.

পৌঁছায়: শুধু এই পাতা

External — আলাদা .css ফাইল

নিয়ম থাকে style.css-এর মতো আলাদা ফাইলে, আর প্রতিটি পাতার head-এ একটি <link rel="stylesheet"> সেটিকে জুড়ে দেয়। এটি external stylesheet.

পৌঁছায়: পুরো সাইট

প্রথম দুটি পাশাপাশি দেখুন। (এই প্রিভিউতে কোড বসে পাতার body-তে; আপনার আসল ফাইলে <style> রাখবেন <head>-এ। HTML-এর নিয়মে <style>-এর জায়গা head — ব্রাউজার body-তে পেলেও মানে, কিন্তু validator সেটিকে ভুল ধরে।)

<style>
  p { color: navy; }
  .note { background: #e0f2fe; padding: 6px; }
</style>

<p>এই লাইনের রং এসেছে style ট্যাগ থেকে।</p>
<p class="note">এটিও — সাথে class দিয়ে বাড়তি সাজ।</p>
<p style="color: crimson; font-weight: bold;">
  এই লাইনে inline style — শুধু এই একটি element-এর জন্য।
</p>

প্রথম দুটি অনুচ্ছেদ নেভি নীল, দ্বিতীয়টির পটভূমি হালকা আকাশি। তৃতীয়টি গাঢ় লাল আর মোটা — যদিও <style>-এ সব p-কে নীল বলা হয়েছে, inline style জিতেছে (কেন জেতে, তার নিয়ম পর্ব ১৮-এ)। চেষ্টা করুন: শেষে একটি নতুন <p> যোগ করুন — সে নিজে থেকেই নীল হবে, কারণ <style>-এর নিয়ম পাতার সব p-কে ধরে। তারপর navy-কে green করুন — inline style দেওয়াটি ছাড়া সব বদলে যায়। inline পদ্ধতিতে প্রতিটি element-এ আলাদা করে লিখতে হয়, এটাই এর দুর্বলতা।

External stylesheet — বাস্তব সাইটের নিয়ম

পর্ব ১৫-এর পাঠাগার সাইটের ফোল্ডারে একটি খালি css/ ফোল্ডার রাখা হয়েছিল — এখন তার কাজ এলো। চারটি পাতা, কিন্তু CSS ফাইল একটাই:

shapla-library/
├── index.html
├── about.html
├── services.html
├── contact.html
├── css/
│   └── style.css     ← চার পাতার একটাই চেহারার ফাইল
└── images/
    └── logo.svg

প্রতিটি পাতার head-এ একটি লাইন যোগ করুন। rel="stylesheet" বলে “এই ফাইলটি এই পাতার স্টাইলশিট”, আর href-এ ফাইলের ঠিকানা — পর্ব ৫-এর মতোই relative URL:

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>শাপলা গণপাঠাগার — উত্তরপাড়া, বগুড়া</title>
  <link rel="stylesheet" href="css/style.css">
</head>

আর css/style.css ফাইলে কোনো HTML ট্যাগ থাকে না — শুধু CSS rule, শুরু থেকে শেষ পর্যন্ত। কয়েকটি ছোট কিন্তু গুরুত্বপূর্ণ খুঁটিনাটি:

  • type="text/css" লাগে না। পুরোনো টিউটোরিয়ালে দেখবেন, কিন্তু HTML5 থেকে এটি ঐচ্ছিক — stylesheet মানেই CSS.
  • <link> একটি void element. এর কোনো বন্ধ ট্যাগ নেই।
  • ঠিকানা ভুল হলে চুপচাপ ব্যর্থতা। href ভুল হলে পাতা কোনো error দেখায় না, শুধু সাদামাটা দেখায়। DevTools-এর Network প্যানেলে style.css-এর পাশে লাল 404 দেখলেই বুঝবেন।
  • একাধিক ফাইলও চলে। কয়েকটি <link> দিলে সবগুলোর নিয়ম মিলে কাজ করে; media="print" দিলে একটি ফাইল শুধু ছাপার সময় খাটে। (CSS-এর ভেতর থেকে @import দিয়েও আরেকটি ফাইল ডাকা যায়, কিন্তু তাতে ফাইলগুলো একটির পর একটি নামে, পাতা দেরিতে আসে — <link>-ই ভালো।)
তিন উপায় পাশাপাশি
বিষয়InlineInternalExternal
কোথায় লেখাstyle="…" attributehead-এ <style>আলাদা .css ফাইল
কতদূর খাটেএকটি elementএকটি পাতাযত পাতায় link দেবেন
বারবার ব্যবহারনাশুধু ওই পাতায়হ্যাঁ, পুরো সাইটে
ব্রাউজার ক্যাশনা (HTML-এর অংশ)না (HTML-এর অংশ)হ্যাঁ, আলাদা ফাইল হিসেবে
কখনJavaScript-এ বসানো মান, HTML ইমেইলএকক পাতা, পরীক্ষা, ডেমোপ্রায় সব বাস্তব সাইট

৫ · কেন external সেরা — ক্যাশ, পুনর্ব্যবহার আর একটু সাবধানতা

তুলনার টেবিলে “ক্যাশ” সারিটিই external stylesheet-এর আসল শক্তি। Cache মানে আগে আনা জিনিসের একটি কপি কাছে রেখে দেওয়া। পাড়ার মুদি দোকানদার প্রতিবার ক্রেতা এলে পাইকারি বাজারে দৌড়ান না — বেশি বিক্রি হওয়া জিনিস দোকানের তাকেই রাখেন। ব্রাউজারও একবার আনা style.css নিজের তাকে (disk cache) রাখে, পরের পাতায় আবার আনে না। ধাপে ধাপে দেখুন, একজন পাঠক যখন পাঠাগারের সাইটে প্রথম আসেন:

  1. index.html চাওয়াGET /প্রথম আসা
  2. link পাওয়া গেলstyle.cssআঁকা অপেক্ষায়
  3. DOM + CSSOMpaintসাজানো পাতা
  4. about.htmlcacheCSS আর আনতে হয় না
  5. CSS বদলালেন?v=2নতুন নাম, নতুন কপি
  1. পাতা চাওয়া। পাঠক ঠিকানায় ঢুকলেন; ব্রাউজার সার্ভার থেকে index.html আনল (পর্ব ১-এর HTTP request). HTML parser ওপর থেকে নিচে পড়তে শুরু করল আর DOM বানাতে লাগল।
  2. link পাওয়া গেল। head-এ <link rel="stylesheet"> দেখেই ব্রাউজার style.css চাইতে পাঠাল। গুরুত্বপূর্ণ: CSS আসার আগে ব্রাউজার সাধারণত পাতা আঁকে না — একে বলে render-blocking. কারণ আগে সাদামাটা পাতা দেখিয়ে তারপর হঠাৎ বদলে দিলে চোখে ঝাঁকুনি লাগে। এজন্যই link রাখা হয় head-এ, যাতে CSS যত তাড়াতাড়ি সম্ভব আনা শুরু হয়।
  3. সাজানো পাতা। CSS এলে ব্রাউজার তার নিয়ম থেকে CSSOM বানায়, DOM-এর সাথে মিলিয়ে প্রতিটি element-এর চূড়ান্ত চেহারা হিসাব করে, তারপর পর্দায় আঁকে (পর্ব ১-এর rendering-এর ধাপ)। পাঠক প্রথমবারেই সাজানো পাতা দেখলেন।
  4. পরের পাতা — ক্যাশ থেকে। পাঠক “আমাদের কথা”-তে গেলেন। নতুন HTML এলো, তাতেও একই css/style.css-এর link. কিন্তু সার্ভার আগের বার জানিয়ে রেখেছিল কতদিন ফাইলটি রেখে দেওয়া যায় (Cache-Control header-এ), তাই ব্রাউজার নিজের ক্যাশ থেকেই নিল — নেটওয়ার্কে যায়ইনি। inline বা internal CSS হলে প্রতিটি পাতার সাথে একই CSS বারবার আসত।
  5. CSS বদলালে? ক্যাশের উল্টো দিক: আপনি style.css বদলে আপলোড করলেন, কিন্তু পুরোনো পাঠকের ব্রাউজার হয়তো ক্যাশের পুরোনো কপিই দেখাচ্ছে। প্রচলিত সমাধান cache busting: ঠিকানায় একটি সংস্করণ যোগ করা — href="css/style.css?v=2". নতুন ঠিকানা মানে ব্রাউজারের কাছে নতুন ফাইল। এই পাতার নিজের সোর্সেও lesson.css?v=… দেখতে পাবেন — ঠিক এই কৌশল।

সংক্ষেপে external-এর লাভ: এক জায়গায় বদল, সব পাতায় একই চেহারা, ক্যাশের কারণে দ্রুত, আর পরিষ্কার HTML. তবে বড় সাইটে প্রথম পর্দার জরুরি CSS কখনো ইচ্ছা করে head-এ inline রাখা হয় (critical CSS), যাতে প্রথম পাতা আরও তাড়াতাড়ি আঁকা যায়। সেই কৌশল পর্ব ৪৯-এ।

inline style কখন বিপদ: এর অগ্রাধিকার খুব বেশি, তাই external ফাইল থেকে পরে বদলানো কঠিন (পর্ব ১৮)। আর নিরাপত্তা-সচেতন সাইট প্রায়ই Content Security Policy (CSP) নামের নিয়মে inline style বন্ধ রাখে — তখন style="…" কাজই করে না। বৈধ ব্যবহারও আছে: JavaScript-এর বসানো মান (যেমন progress bar-এর প্রস্থ) আর HTML ইমেইল।

৬ · ব্রাউজারের নিজের CSS — user-agent stylesheet, reset আর normalize

একটা প্রশ্ন ভাবুন: পর্ব ৩ থেকে ১৫ পর্যন্ত আপনি একটিও CSS লেখেননি, তবু <h1> বড় আর মোটা দেখাল, লিংক নীল আর দাগ দেওয়া, তালিকায় বুলেট, অনুচ্ছেদের আগে-পরে ফাঁক। এই চেহারা এলো কোথা থেকে? উত্তর: প্রতিটি ব্রাউজারের ভেতরে একটি তৈরি-করা CSS ফাইল থাকে, যাকে বলে user-agent stylesheet (“user agent” মানে ব্রাউজার)। WHATWG-এর HTML স্পেসিফিকেশনের “Rendering” অংশে এই ডিফল্ট CSS-এর একটি প্রস্তাবিত রূপ লেখা আছে, আর ব্রাউজারগুলো মোটামুটি সেটাই মানে।

সাধারণ পাতায় এর ফলে body-র চারপাশে 8px ফাঁক আর লেখা 16px হয়। নিচের ছোট স্ক্রিপ্টটি কয়েকটি element-এর আসল মান মেপে দেখায়। (এই ছোট পরীক্ষাগারের body-তে নিজস্ব একটু স্টাইল আছে, তাই আমরা মাপছি body-র লেখার তুলনায় অনুপাত — অনুপাতগুলো সব পাতায় একই।)

// h1, p, ul-এর জন্য কোনো CSS লেখা হয়নি — ব্রাউজার নিজে কী দিয়েছে?
function cs(sel) { return getComputedStyle(document.querySelector(sel)); }
const base = parseFloat(cs('body').fontSize);
const h1Size = parseFloat(cs('h1').fontSize);

console.log('h1 font-size:', (h1Size / base).toFixed(2), 'x body');
console.log('h1 margin-top:', (parseFloat(cs('h1').marginTop) / h1Size).toFixed(2), 'em');
console.log('h1 font-weight:', cs('h1').fontWeight);
console.log('p margin-top:', (parseFloat(cs('p').marginTop) / base).toFixed(2), 'em');
console.log('ul padding-left:', cs('ul').paddingLeft);
console.log('ul list-style-type:', cs('ul').listStyleType);

ফলাফলে দেখবেন: h1-এর লেখা body-র ঠিক 2.00 গুণ (ডিফল্ট নিয়মে font-size: 2em — সাধারণ পাতায় 32px), ওপরে নিজের লেখার 0.67 গুণ ফাঁক (0.67em), আর font-weight 700 মানে মোটা; p-এর ওপরে 1.00em; ul বাঁয়ে 40px ভেতরে সরানো, বুলেট disc. এগুলোর একটিও আপনি লেখেননি — সবই user-agent stylesheet-এর। চেষ্টা করুন: শেষে একটি লাইন যোগ করুন — console.log('h1 display:', cs('h1').display); — উত্তর আসবে block, সেটিও ব্রাউজারের ডিফল্ট। DevTools-এর Styles প্যানেলেও এই নিয়মগুলো “user agent stylesheet” লেবেলসহ দেখা যায়।

এই ডিফল্টগুলো ভালো জিনিস — CSS লোড না হলেও পাতা পড়া যায়, শিরোনাম চেনা যায়। কিন্তু নকশার সময় এগুলো বাধা হয়: body-র 8px ফাঁক, বোতাম-ইনপুটের আলাদা ফন্ট, আর পুরোনো দিনে ব্রাউজারভেদে আলাদা ডিফল্ট। এর জন্য দুটি পুরোনো দর্শন আছে:

Reset — সব মুছে শূন্য থেকে

সব element-এর margin, padding, ফন্টের মাপ শূন্য বা সমান করে দেওয়া — যেন সাদা ক্যানভাস। Eric Meyer-এর বিখ্যাত reset এই পথের প্রতীক। সমস্যা: শিরোনামের আকার, তালিকার বুলেটের মতো কাজের ডিফল্টও মুছে যায়, সব আবার লিখতে হয়।

দর্শন: শূন্য থেকে নিজে বানানো

normalize.css — মিলিয়ে দেওয়া, মোছা নয়

Nicolas Gallagher ও Jonathan Neal-এর normalize.css কাজের ডিফল্ট রেখে শুধু ব্রাউজারগুলোর অমিল আর বাগ ঠিক করে। আজ ব্রাউজারগুলোর আচরণ অনেক কাছাকাছি, তাই এর দরকারও অনেক কমেছে; বহু বছর এর নতুন বড় সংস্করণ আসেনি।

দর্শন: অমিল দূর করা

আজকের প্রচলিত পথ এই দুইয়ের মাঝামাঝি: কয়েক লাইনের একটি আধুনিক ছোট reset, যা শুধু সবচেয়ে বিরক্তিকর ডিফল্টগুলো বদলায়। নিচের এডিটরে প্রতিটি element-এর চারপাশে কমলা দাগ দেওয়া আছে, যাতে ফাঁকগুলো চোখে পড়ে:

/* ফাঁক দেখানোর জন্য প্রতিটি element-এ দাগ */
* { outline: 1px dashed #f97316; }

/* ---- একটি আধুনিক ছোট reset ---- */
*, *::before, *::after {
  box-sizing: border-box;
}
body, h1, p, ul {
  margin: 0;
}
button, input {
  font: inherit;
}
body {
  line-height: 1.5;
}

reset চালু থাকায় body-র চারপাশের 8px আর শিরোনাম-অনুচ্ছেদের মাঝের ফাঁক নেই — কমলা বাক্সগুলো গায়ে গায়ে লাগানো। বোতাম আর ইনপুটের লেখা এখন পাতার বাকি লেখার সমান মাপে (font: inherit); ডিফল্টে এগুলো ছোট আর আলাদা ফন্টে থাকে। খেয়াল করুন, তালিকা এখনো বাঁ দিকে সরে আছে — কারণ সেটি margin নয়, padding, যা আমরা বদলাইনি। চেষ্টা করুন: “একটি আধুনিক ছোট reset” থেকে শেষ পর্যন্ত পুরো অংশটি /* আর */-এর মাঝে রেখে দিন (comment) — ব্রাউজারের ডিফল্ট ফাঁকগুলো ফিরে আসবে, আর বোতামের লেখা ছোট হয়ে যাবে। box-sizing-এর মানে পর্ব ১৯-এ।

যা reset করবেন না: ইন্টারনেটে পুরোনো কিছু reset-এ *:focus { outline: none; } দেখবেন। এটি focus-এর দৃশ্যমান দাগ মুছে দেয় — কি-বোর্ড দিয়ে চলা মানুষ আর বুঝতেই পারেন না এখন কোথায় আছেন। WCAG 2.2 দৃশ্যমান focus দাবি করে। দাগ না পছন্দ হলে মুছবেন না, নিজের মতো সুন্দর একটি দাগ দিন (পর্ব ৩৪ আর ৪৫)। আর তালিকার বুলেট সরানোর (list-style: none) পার্শ্বপ্রতিক্রিয়ার কথা পর্ব ৭-এ দেখেছেন।

৭ · ভুল হলে CSS চুপ থাকে — ক্ষমাশীল নিয়ম আর DevTools

C বা Java-য় একটি ; বাদ পড়লে প্রোগ্রাম চলেই না, স্পষ্ট error আসে। JavaScript-এও ভুল হলে console-এ লাল লেখা ওঠে। CSS-এর আচরণ একেবারে আলাদা: ভুল declaration ব্রাউজার চুপচাপ ফেলে দেয়, আর বাকি সবকিছু চালিয়ে যায়। একে বলে forgiving error handling — ক্ষমাশীল ভুল-সামলানো।

নিচের CSS-এ তিনটি ভুল লুকানো আছে, যা মিলে চারটি নির্দেশ ডুবিয়েছে — অথচ একটিও কোনো error দেবে না। আগে প্রিভিউ দেখুন, তারপর স্টেপারে ব্রাউজারের মাথার ভেতরে ঢুকব:

.notice {
  color: crimson;
  colr: navy;
  font-size: 20 px;
  background: #fff3cd
  border: 2px solid orange;
  padding: 12px;
}

লেখাটি লাল, চারপাশে padding-এর ফাঁক আছে — কিন্তু হলুদ পটভূমি নেই, কমলা বর্ডার নেই, আর লেখা বড়ও হয়নি। ছয়টি নির্দেশের মধ্যে কাজ করছে মাত্র দুটি, অথচ কোথাও কোনো সতর্কবার্তা নেই। চেষ্টা করুন: #fff3cd-এর পরে ; বসান — একসাথে পটভূমি আর বর্ডার দুটোই ফিরে আসবে! তারপর 20 px-কে 20px করুন। শেষে colr-এর বানান color করে দেখুন কী হয় — লেখা নীল হয়ে যায়, কারণ এখন একই block-এ দুটি বৈধ color, আর পরেরটি জেতে।

1.notice {2  color: crimson;3  colr: navy;4  font-size: 20 px;5  background: #fff3cd6  border: 2px solid orange;7  padding: 12px;8}
parser-এর রায়
color
colr
font-size
background
border
padding
  1. বৈধ declaration. parser selector .notice পড়ল, { পেয়ে block শুরু করল। তারপর ; পর্যন্ত একটি declaration কেটে নিল: property color — চেনা; value crimson — রঙের বৈধ নাম। গৃহীত।
  2. অচেনা property. পরের ; পর্যন্ত: colr: navy. ব্রাউজারের তালিকায় colr নামে কোনো property নেই। spec-এর নিয়ম: অচেনা property-র পুরো declaration বাদ, পরের ; থেকে আবার স্বাভাবিকভাবে পড়া শুরু। DevTools-এ এই লাইনটি কাটা দাগ আর হলুদ সতর্কচিহ্ন (⚠) নিয়ে দেখায়, মাউস রাখলে লেখা আসে “Unknown property name”.
  3. ভুল value. font-size চেনা property, কিন্তু 20 px — সংখ্যা আর এককের মাঝে ফাঁকা — দুটি আলাদা টুকরো হয়ে যায়: একটি একক ছাড়া সংখ্যা, আরেকটি অচেনা শব্দ। font-size-এর ব্যাকরণে এটা মেলে না, তাই এটিও বাদ। DevTools-এ: “Invalid property value”. লেখা আগের মাপেই রইল।
  4. হারানো semicolon — দুটি নির্দেশ একসাথে ডুবল। #fff3cd-এর পরে ; নেই। parser তো লাইন দেখে না, দেখে ;. তাই তার কাছে declaration-টি হলো: property background, value #fff3cd border: 2px solid orange — যা কোনো বৈধ background নয়। ফলে দুটি নির্দেশই বাদ। একটি ছোট্ট বিন্দু বাদ পড়ায় পটভূমি আর বর্ডার দুটোই গেল — এটাই নতুনদের সবচেয়ে সাধারণ CSS বাগ।
  5. পরের সব আবার স্বাভাবিক। padding: 12px; বৈধ, গৃহীত। } পেয়ে block বন্ধ। ভুলগুলোর প্রভাব শুধু নিজেদের declaration-এ সীমাবদ্ধ রইল — পাতার বাকি CSS অক্ষত। কিন্তু খেয়াল করুন, console-এ একটি লাল লাইনও ওঠেনি। CSS-এর ভুল খুঁজতে হয় চেহারা দেখে আর DevTools-এর Styles প্যানেল খুলে।

এত ক্ষমা কেন? — ভবিষ্যতের জন্য দরজা খোলা

এই আচরণ অলসতা নয়, সুচিন্তিত নকশা। ধরুন text-wrap: balance — একটি নতুন property, যা শিরোনামের লাইনগুলো সমান দৈর্ঘ্যে ভাগ করে সুন্দর দেখায়। ২০২৪ সালে এটি সব প্রধান ব্রাউজারে পৌঁছায় (Baseline Newly available — সব প্রধান ব্রাউজারের নতুন সংস্করণে আছে, পুরোনোগুলোতে নেই)। CSS যদি C-এর মতো কড়া হতো, পুরোনো ফোনের ব্রাউজার অচেনা property দেখেই পুরো stylesheet বাতিল করত। কিন্তু CSS-এ সে শুধু ওই লাইনটি ফেলে দেয়; শিরোনাম একটু কম সুন্দর ভাঙে, বাকি সব ঠিক। নতুন ফিচার যোগ করা নিরাপদ — একে বলে forward compatibility.

এই নিয়ম থেকেই এসেছে একটি পুরোনো কৌশল — fallback declaration. একই property দুবার লিখুন: আগে সবাই বোঝে এমন মান, পরে নতুন মান। নতুন ব্রাউজার দুটোই বোঝে, তাই পরেরটা জেতে; পুরোনো ব্রাউজার নতুনটা ফেলে দেয়, তাই আগেরটা থাকে:

h1 {
  color: #2e7d32;                        /* সব ব্রাউজার বোঝে */
  color: oklch(52% 0.13 145);            /* নতুন রং-পদ্ধতি; না বুঝলে ওপরেরটা থাকে */
  text-wrap: balance;                    /* না বুঝলে শুধু এই লাইনটি বাদ */
}

(oklch() রং-পদ্ধতির গল্প পর্ব ২০-এ, আর আরও নিয়ন্ত্রিত পথ @supports পর্ব ৪৮-এ।)

আরও গভীরে: CSS পড়ার নিয়ম লেখা আছে CSS Syntax Module Level 3-এ। ব্রাউজার আগে পুরো লেখাকে টোকেনে ভাঙে (শব্দ, সংখ্যা, 20px-এর মতো মাপ, {, ;…), তারপর বন্ধনী মিলিয়ে rule আর declaration আলাদা করে; ভুল পেলে পরের ; বা মিলে যাওয়া } পর্যন্ত লাফ দেয়। selector-এ ভুল থাকলে কিন্তু ক্ষমা কম — সাধারণত পুরো rule বাদ, আর selector list-এর একটি অংশ ভুল হলেই পুরো list বাতিল হয় (কিছু নতুন pseudo-class এর ব্যতিক্রম, পর্ব ১৭ ও ৩৪)। আর বন্ধ না করা { ফাইলের শেষ পর্যন্ত খোলা থাকে, তাই পরের rule-গুলো ভুলভাবে তার ভেতরে ঢুকে যেতে পারে।

DevTools-এ CSS-এর ভুল ধরা

যেহেতু CSS চুপ থাকে, ভুল ধরার আসল জায়গা DevTools (পর্ব ২)। পদ্ধতিটা প্রতিদিনের অভ্যাস করে ফেলুন:

  1. যে element ঠিক দেখাচ্ছে না, তাতে ডান-ক্লিক করে “Inspect” চাপুন।
  2. Elements প্যানেলের পাশে Styles অংশে ওই element-এ খাটা সব rule দেখবেন — আপনার ফাইলের নাম ও লাইন নম্বরসহ, আর নিচে user agent stylesheet-এর নিয়ম।
  3. কাটা দাগ + ⚠ চিহ্ন = ভুল declaration (অচেনা property বা ভুল value). মাউস রাখলে কারণ লেখা আসে।
  4. শুধু কাটা দাগ, কোনো চিহ্ন নেই = declaration ঠিক আছে, কিন্তু অন্য কোনো rule তাকে হারিয়ে দিয়েছে (cascade — পর্ব ১৮)। দুটির পার্থক্য চিনতে পারা debugging-এর অর্ধেক কাজ।
  5. আপনার rule-টা তালিকাতেই নেই? তাহলে selector ভুল, অথবা CSS ফাইলটাই আসেনি — Network প্যানেলে 404 খুঁজুন।

আর ফাইল ধরে যাচাই করতে আছে W3C-র CSS Validator, আর কোড লেখার সময়ই ভুল ধরতে VS Code-এর নিজস্ব CSS যাচাই (অচেনা property-র নিচে ঢেউ খেলানো দাগ) বা Stylelint-এর মতো টুল। পুরো debugging কৌশল পর্ব ৪৭-এ।

৮ · comment, selector-এর এক ঝলক, আর “CSS কি প্রোগ্রামিং ভাষা?”

CSS-এ comment

CSS-এ comment লেখার একটিই উপায়: /* দিয়ে শুরু, */ দিয়ে শেষ। এক লাইন বা অনেক লাইন — দুটোই চলে। HTML-এর <!-- --> বা JavaScript-এর // CSS-এ comment নয়! আর comment-এর ভেতরে আরেকটি comment রাখা যায় না — প্রথম */-তেই comment শেষ হয়ে যায়। comment দিয়ে ফাইলকে ভাগ করুন, অদ্ভুত মানের কারণ লিখুন, বা একটি নিয়ম সাময়িক বন্ধ রাখুন — তবে CSS ফাইল যে কেউ পড়তে পারে, তাই গোপন কিছু নয়।

তিন রকম সহজ selector — এক ঝলক

এতক্ষণ বেশিরভাগ জায়গায় element-এর নাম দিয়ে selector লিখেছেন। আরও দুটি প্রতিদিনের selector আছে, যার পুরো গল্প পরের পর্বে: class selector — বিন্দু দিয়ে শুরু, .tag মানে class="tag" যার আছে (পাতায় যতবার খুশি); আর id selector — হ্যাশ চিহ্ন দিয়ে, #today মানে id="today" যার (পাতায় একটিই)। নিচের এডিটরে তিনটিই, comment-সহ:

/* element selector: পাতার সব p */
p {
  color: #1d4ed8;
}

/* class selector: class="tag" যার আছে */
.tag {
  display: inline-block;
  background: #dcfce7;
  padding: 2px 10px;
}

/* id selector: পাতায় একটিই */
#today {
  font-weight: bold;
}

/* h2 { color: crimson; }   ← comment-এর ভেতরে, তাই বন্ধ */

তিনটি অনুচ্ছেদই নীল (element selector সব p ধরেছে); “উপন্যাস” একটি সবুজ ট্যাগের মতো ছোট বাক্সে; “আজ এসেছে ১২টি বই” মোটা; আর শিরোনাম কালোই রইল, কারণ তার নিয়মটি comment-এর ভেতরে। চেষ্টা করুন: শেষ লাইনের /* আর */ মুছে দিন (শুধু h2 { color: crimson; } রাখুন) — শিরোনাম লাল হবে। এবার একটি ফাঁদ দেখুন: প্রথম লাইনের comment-কে বদলে // element selector: পাতার সব p লিখুন। অনুচ্ছেদগুলো আর নীল থাকে না! কারণ // CSS-এ comment নয় — parser এটিকে পরের selector-এর অংশ ভেবে পড়ে (// element selector… p), সেই অদ্ভুত selector অবৈধ, তাই পুরো p rule-টাই বাদ পড়ে।

class কেন id-এর চেয়ে বেশি ব্যবহার হয়, attribute selector, combinator (nav a-এর মতো “ভেতরের” selector) — সব পর্ব ১৭-এ। আর একই element-কে দুটি rule ধরলে কে জেতে (যেমন ওপরের এডিটরে p আর .tag দুটোই “উপন্যাস”-কে ধরেছে) — সেটা cascade আর specificity, পর্ব ১৮-এ।

CSS কি প্রোগ্রামিং ভাষা?

এক পক্ষ বলেন, CSS-এ loop বা নিজের function নেই, তাই এটা প্রোগ্রামিং ভাষা নয়। আরেক পক্ষ দেখান, CSS-এ এখন variable (পর্ব ৩৩), হিসাব (calc()), শর্তের মতো আচরণ (media query, :has()) আছে; এমনকি কেউ কেউ দেখিয়েছেন, মানুষের ক্লিকের সাহায্য নিয়ে HTML আর CSS দিয়ে “Rule 110” নামের একটি গাণিতিক যন্ত্র চালানো যায়, যা তাত্ত্বিকভাবে যেকোনো হিসাব করতে সক্ষম।

সবচেয়ে কাজের উত্তরটা সম্ভবত এই: CSS একটি declarative language — আপনি বলেন কী চান (“শিরোনাম সবুজ, কার্ডগুলো তিন কলামে”), ব্রাউজার ঠিক করে কীভাবে করবে। SQL-ও এমন; C বা JavaScript সেখানে imperative — ধাপগুলো আপনি লেখেন। তকমার তর্কের চেয়ে বড় কথা: CSS একটি গভীর ভাষা, আর ভালো CSS লিখতে পারা ফ্রন্ট-এন্ড চাকরির বাজারে আলাদা মূল্যের দক্ষতা — “সহজ জিনিস” ভেবে অবহেলা করলে পরে ভুগতে হয়।

৯ · AI-এর যুগে — CSS-এর কাজ AI-কে দিলে কী দেখবেন

“আমার পাঠাগারের সাইটের জন্য সুন্দর CSS লিখে দাও” — AI কয়েক সেকেন্ডে শত লাইন দেবে, আর প্রিভিউতে চমৎকারও দেখাবে। কিন্তু CSS-এর ক্ষমাশীল স্বভাবের কারণে এখানে একটা বিশেষ বিপদ আছে: AI-এর লেখা ভুল বা অচল লাইন কোনো error দেয় না। অচেনা property, পুরোনো লাইন, বানানো value — সব চুপচাপ বাদ পড়ে, আর কেউ জানে না কোন লাইন আসলে কাজ করছে।

AI সাধারণত যেসব ভুল করে

AI-এর ভুলকেন সমস্যাঠিক উপায়
প্রতিটি element-এ style="…" inlineএক জায়গায় বদলানো যায় না, ক্যাশ হয় না, পরে override কঠিনআলাদা style.css, <link> দিয়ে
<font>, <center>, bgcolor, alignHTML-এ অচল, কাঠামো আর চেহারা মিশে যায়সব চেহারা CSS-এ
অপ্রয়োজনীয় -webkit-, -moz- লাইনবহু property-তে বহু বছর আগেই অপ্রয়োজনীয়; ফাইল ভারীMDN বা Can I use দেখে শুধু দরকারিগুলো রাখুন
অস্তিত্বহীন property বা value বানিয়ে লেখাচুপচাপ বাদ পড়ে, কাজ করছে মনে হয়DevTools-এ ⚠ চিহ্ন খুঁজুন, MDN-এ নাম মিলিয়ে নিন
বড় reset-এ outline: noneকি-বোর্ড ব্যবহারকারী focus দেখতে পান নাfocus-এর দাগ রাখুন বা নিজের মতো সাজান
সব জায়গায় !importantcascade-এর স্বাভাবিক নিয়ম ভেঙে পরে জট পাকায়selector ঠিক করুন (পর্ব ১৮)

AI-কে কাজ দেওয়ার আগে শর্তগুলো লিখে দিন, আর শেষে তাকে নিজের কাজের হিসাব দিতে বলুন — এতে ভুল প্রায়ই নিজেই বেরিয়ে আসে:

তুমি একজন আধুনিক CSS জানা ফ্রন্ট-এন্ড ডেভেলপার। আমার একটি চার পাতার স্ট্যাটিক সাইট আছে (header, nav, main, footer আছে; HTML বদলাবে না)। সব পাতার জন্য একটি external style.css লেখো। শর্ত: ১. কোনো inline style বা <font>/<center> নয়; শুধু element আর class selector, !important নয়। ২. শুরুতে একটি ছোট আধুনিক reset (box-sizing, margin, font: inherit), কিন্তু focus-এর outline মুছবে না। ৩. যেসব -webkit- বা অন্য vendor prefix এখন আর লাগে না, সেগুলো দেবে না। ৪. প্রতিটি অংশের ওপরে /* */ comment-এ বাংলায় লিখবে অংশটি কী করে। ৫. শেষে একটি তালিকা দাও: কোন কোন property ব্যবহার করেছ, আর কোনটি Baseline Widely available নয় (থাকলে তার fallback কী)। ৬. আমার head-এ style.css জুড়তে ঠিক কোন লাইনটি লিখতে হবে, সেটাও দাও।

AI-এর দেওয়া CSS হাতে পেলে — যাচাইয়ের চেকলিস্ট

পরীক্ষা ও ইন্টারভিউতে — বিশ্ববিদ্যালয়, চাকরি বা ফ্রন্ট-এন্ড ইন্টারভিউর পরীক্ষায় এ ধরনের প্রশ্ন প্রায়ই আসে:

  • CSS-এর পূর্ণরূপ কী, কে প্রস্তাব করেন? — Cascading Style Sheets; ১৯৯৪ সালে Håkon Wium Lie, পরে Bert Bos-এর সাথে মিলে; CSS1 W3C-র মান হয় ১৯৯৬ সালে।
  • CSS যোগ করার তিন উপায় কী, কোনটি ভালো? — inline (style attribute), internal (<style>), external (<link rel="stylesheet" href="…">); বহু পাতার সাইটে external — পুনর্ব্যবহার আর ক্যাশ।
  • একটি rule-এর অংশগুলোর নাম বলুন। — selector, declaration block ({ }), declaration (property: value;), property, value.
  • CSS-এ ভুল declaration থাকলে কী হয়? — শুধু ওই declaration বাদ পড়ে, বাকি stylesheet চলে; কোনো error দেখায় না।
  • CSS4 কি আছে? reset আর normalize-এর পার্থক্য? — নেই, CSS3-এর পর থেকে মডিউলগুলো আলাদা Level-এ এগোয়; reset ডিফল্ট মুছে দেয়, normalize কাজের ডিফল্ট রেখে ব্রাউজারের অমিল দূর করে।

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

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

প্র ০১১৯৯০-এর দশকে আরও কয়েকটি style sheet প্রস্তাব ছিল — তাহলে CSS-ই টিকে গেল কেন, আর শুরুর দিনগুলো এত কষ্টের ছিল কেন?

Håkon Wium Lie একা ছিলেন না। সেই সময়ে বেশ কয়েকটি প্রস্তাব ঘুরছিল। SGML নথির জন্য তৈরি হচ্ছিল DSSSL নামের একটি আন্তর্জাতিক মান — খুব শক্তিশালী, কিন্তু একটি পূর্ণ প্রোগ্রামিং ভাষার মতো জটিল। Netscape পরে প্রস্তাব করে JSSS (JavaScript Style Sheets) — স্টাইল লেখা হবে JavaScript-এর ভাষায়।

CSS জিতল কয়েকটি কারণে। প্রথমত, সরলতা: h1 { color: red } একজন ডিজাইনার, যিনি প্রোগ্রামার নন, এক নজরে বোঝেন। দ্বিতীয়ত, declarative নকশা: CSS-এ লেখক বলেন কী চান, কীভাবে নয় — তাই ব্রাউজার নিজের মতো দ্রুত পথ বের করতে পারে, আর ভুল হলেও পুরো পাতা ভাঙে না। তৃতীয়ত, cascade-এর ধারণা: লেখক, পাঠক আর ব্রাউজার — তিন পক্ষের ইচ্ছা মেলানোর একটি নিয়ম। চতুর্থত, W3C-র মাধ্যমে নিরপেক্ষ মান হওয়ায় সব ব্রাউজার-নির্মাতা এটা মেনে নেয়।

কিন্তু মান হওয়া আর ঠিকভাবে চলা এক নয়। ১৯৯০-এর দশকের শেষে “browser war”-এর সময় Netscape আর Internet Explorer প্রতিযোগিতায় নতুন ফিচার যোগ করছিল, কিন্তু CSS-এর বাস্তবায়ন ছিল অসম্পূর্ণ ও বাগে ভরা — একই CSS দুই ব্রাউজারে দুই রকম দেখাত। ডিজাইনাররা তাই বহু বছর টেবিল-লেআউট আর font ট্যাগেই আটকে ছিলেন (পর্ব ৭-এ সেই ইতিহাস দেখেছেন)। ব্রাউজারগুলোকে মান মানতে চাপ দিতে Web Standards Project-এর মতো দল “Acid test” নামের পরীক্ষা-পাতা বানায় — যেমন ২০০৫ সালের Acid2, যা একটি হাসিমুখ ঠিকভাবে আঁকতে পারলে বোঝা যেত ব্রাউজার CSS ঠিক মানে। আজ সেই ভূমিকা পালন করে ব্রাউজার-নির্মাতাদের যৌথ Interop উদ্যোগ আর Baseline.

মূল উপলব্ধি: একটি প্রযুক্তি শুধু শক্তিশালী হলেই টেকে না; টেকে যখন সাধারণ মানুষ তা ব্যবহার করতে পারেন, আর সব পক্ষ সেটি মেনে নেয়। CSS-এর সরলতা ছিল তার সবচেয়ে বড় শক্তি।

প্র ০২CSS ভুলকে চুপচাপ ক্ষমা করে, JavaScript ভুল পেলে থেমে যায় — কোনটা ভালো নকশা? CSS-এর এই ক্ষমার দাম কে দেয়?

দুটিই তাদের কাজের জন্য সঠিক নকশা — কারণ দুটির ভুলের পরিণাম আলাদা। JavaScript-এ একটি ভুল হিসাব মানে হয়তো ভুল দামে অর্ডার, ভুল অ্যাকাউন্টে টাকা পাঠানো। সেখানে ভুল নিয়ে চুপচাপ চালিয়ে যাওয়া বিপজ্জনক; থেমে গিয়ে জানানোই নিরাপদ। CSS-এ সবচেয়ে খারাপ পরিণাম সাধারণত হলো একটি রং বা ফাঁক ভুল হওয়া। সেজন্য পুরো পাতা ফেলে দেওয়ার চেয়ে ভুল লাইনটা বাদ দিয়ে বাকিটা দেখানো অনেক বেশি যুক্তিসঙ্গত।

এর পেছনে ইন্টারনেটের একটি পুরোনো নীতিও আছে, যাকে বলে robustness principle: “নিজে যা পাঠাবেন, তাতে কড়া হোন; যা গ্রহণ করবেন, তাতে উদার হোন।” ওয়েবের বিশেষ বাস্তবতা হলো, একই পাতা চলে দশ বছর পুরোনো ফোন থেকে আজকের সর্বশেষ ব্রাউজারে। CSS ক্ষমাশীল না হলে প্রতিটি নতুন property যোগ করা মানে পুরোনো ব্রাউজারে পুরো সাইট ভেঙে দেওয়া — তখন ওয়েব এগোতেই পারত না।

কিন্তু দামও আছে, আর দামটা দেন ডেভেলপার। ভুল চুপ থাকে বলে বাগ লুকিয়ে থাকে মাসের পর মাস — কেউ খেয়ালই করে না যে colr লেখা লাইনটা কখনো কাজ করেনি। বড় প্রজেক্টে মৃত, অকেজো CSS জমতে জমতে হাজার লাইন হয়ে যায়, কেউ মুছতে সাহস পায় না। এজন্য পেশাদার দলগুলো ক্ষমার ঘাটতি পূরণ করে টুল দিয়ে: Stylelint-এর মতো linter কোড লেখার সময়ই অচেনা property, ভুল value আর হারানো semicolon ধরে; আর ছবি তুলে আগের-পরের চেহারা মেলানোর visual regression test অনিচ্ছাকৃত বদল ধরে। AI-এর লেখা CSS-এ এই যাচাই আরও জরুরি, কারণ AI আত্মবিশ্বাসের সাথে অস্তিত্বহীন property-ও লিখতে পারে।

মূল উপলব্ধি: ভাষার নকশা তার ব্যবহারের পরিবেশ থেকে আসে। CSS ব্যবহারকারীর প্রতি উদার, তাই ডেভেলপারকে নিজের প্রতি কড়া হতে হয় — DevTools, validator আর linter সেই কড়াকড়ির হাতিয়ার।

প্র ০৩“external stylesheet সবসময় সেরা” — এই নিয়ম কি সব ক্ষেত্রে খাটে? কোথায় ভাঙে, আর কেন?

বহু পাতার সাধারণ সাইটে নিয়মটা প্রায় সবসময় সঠিক — রক্ষণাবেক্ষণ, ক্যাশ আর পরিষ্কার HTML-এর কারণে। কিন্তু পেশাদার জগতে কয়েকটি বৈধ ব্যতিক্রম আছে, আর সেগুলো বোঝা মানে নিয়মের কারণ বোঝা।

  • প্রথম পর্দার গতি (critical CSS): external ফাইল render-blocking — ফাইল না আসা পর্যন্ত পাতা আঁকা হয় না। ধীর মোবাইল ডেটায় এই অপেক্ষা চোখে পড়ে। তাই বড় সাইটগুলো প্রায়ই প্রথম পর্দার জন্য দরকারি অল্প CSS head-এর <style>-এ রাখে, আর বাকিটা পরে আনে। এতে প্রথম পাতা দ্রুত আসে, কিন্তু সেই অংশ ক্যাশ হয় না — এক জিনিস পেতে আরেক জিনিস ছাড়া (পর্ব ৪৯)।
  • এক পাতার জিনিস: একটি ইভেন্টের একক landing page, যা আর কখনো বদলাবে না — সেখানে একটি internal stylesheet একটি বাড়তি request বাঁচায়।
  • HTML ইমেইল: অনেক ইমেইল অ্যাপ বাইরের CSS ফাইল আনে না, এমনকি <style>-ও কেটে ফেলে। তাই নিউজলেটারে আজও inline style-ই নির্ভরযোগ্য; টুল দিয়ে সাধারণ CSS থেকে স্বয়ংক্রিয়ভাবে inline বানানো হয়।
  • JavaScript-এর মান: চলার সময় হিসাব হওয়া মান — যেমন ডাউনলোডের অগ্রগতির প্রস্থ — element-এর style-এ বসানোই স্বাভাবিক, প্রায়ই একটি CSS variable হিসেবে।

আরেকটি বদলে যাওয়া হিসাব: একসময় HTTP/1.1-এ প্রতিটি আলাদা ফাইলের জন্য আলাদা সংযোগের খরচ বেশি ছিল, তাই সব CSS একটি বড় ফাইলে জোড়া দেওয়া হতো। HTTP/2 আর HTTP/3 একই সংযোগে অনেক ফাইল একসাথে আনতে পারে, তাই এখন ছোট কয়েকটি ফাইলও চলে — কোনটা বদলায় তা দেখে ভাগ করলে ক্যাশ আরও কাজে লাগে। আবার নিরাপত্তা-সচেতন সাইটে Content Security Policy inline style বন্ধ রাখে, তখন external ফাইলই প্রধান পথ।

মূল উপলব্ধি: “সেরা উপায়” সবসময় একটি প্রশ্নের উত্তর — কিসের জন্য সেরা? রক্ষণাবেক্ষণ, প্রথম পাতার গতি, নিরাপত্তা আর পাঠকের পরিবেশ মিলিয়ে সিদ্ধান্ত নিন; নিয়ম মুখস্থ নয়, তার কারণ মনে রাখুন।

প্র ০৪Reset, normalize, নাকি কিছুই না — আজকের দিনে কোনটা যুক্তিসঙ্গত? ব্রাউজারের ডিফল্ট স্টাইল কি শত্রু?

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

২০০০-এর দশকে ব্রাউজারগুলোর ডিফল্ট মান এত আলাদা ছিল যে Eric Meyer-এর মতো বিশেষজ্ঞরা “সব মুছে দাও” ধরনের reset জনপ্রিয় করেন — শিরোনাম, তালিকা, টেবিল, সব শূন্য থেকে শুরু। এর পর আসে normalize.css, যা বলল: কাজের ডিফল্ট মুছো না, শুধু অমিল দূর করো আর ব্রাউজারের বাগ ঠিক করো। বহু CSS framework এর ওপর দাঁড়ায় (Bootstrap-এর Reboot ফাইল এরই উত্তরসূরি)।

আজ ছবিটা বদলে গেছে। WHATWG-এর HTML স্পেসিফিকেশন ডিফল্ট রেন্ডারিং অনেক বিস্তারিত লিখে দিয়েছে, আর ব্রাউজার-নির্মাতারা ২০২০-এর দশকের শুরু থেকে Interop নামের বার্ষিক যৌথ উদ্যোগে অমিলগুলো একে একে দূর করছেন। ফলে বড় normalize ফাইলের বেশিরভাগ লাইন আর কোনো কাজ করে না। আধুনিক পথ তাই কয়েক লাইনের একটি ছোট, উদ্দেশ্যমূলক reset: box-sizing: border-box (মাপের হিসাব সহজ করতে), কিছু margin শূন্য, ফর্মের element-এ font: inherit, ছবিকে কন্টেইনারের বাইরে যেতে না দেওয়া। প্রতিটি লাইনের পেছনে আপনি কারণ বলতে পারেন — এটাই মাপকাঠি।

সাবধানতাও আছে। reset যেন অ্যাক্সেসিবিলিটি না মুছে দেয় — focus-এর outline, prefers-reduced-motion-এর মতো পাঠকের পছন্দ, বা তালিকার অর্থ।

মূল উপলব্ধি: ডিফল্ট স্টাইল হলো ব্রাউজারের দেওয়া প্রথম খসড়া। পুরোটা ছিঁড়ে ফেলার দরকার নেই — যা আপনার কাজে বাধা দেয়, শুধু সেটুকু বুঝে-শুনে বদলান।

প্র ০৫CSS Zen Garden-এ একই HTML-এ শুধু CSS বদলে শত শত ভিন্ন নকশা দেখানো হয়েছিল — কাঠামো আর চেহারা আলাদা রাখার নীতি কি আজও পুরোপুরি টিকে আছে?

২০০৩ সালে Dave Shea “CSS Zen Garden” নামে একটি সাইট চালু করেন। নিয়ম ছিল সরল: HTML ফাইল সবার জন্য এক, কেউ তাতে হাত দেবেন না; শুধু নিজের CSS ফাইল জমা দিন। সারা পৃথিবীর ডিজাইনাররা এমন সব নকশা পাঠালেন, যা দেখে বিশ্বাস হয় না একই HTML. এটি প্রমাণ করল যে separation of concerns শুধু তত্ত্ব নয়; CSS দিয়ে সত্যিই পূর্ণ নকশা সম্ভব। টেবিল-লেআউট ছাড়ার আন্দোলনে এর বড় ভূমিকা ছিল।

কিন্তু আজকের বাস্তবতা একটু জটিল। Tailwind CSS-এর মতো utility-first framework-এ HTML-এর class-এর মধ্যেই চেহারার নির্দেশ লেখা হয় — class="text-green-700 font-bold p-4". দেখতে অনেকটা পুরোনো inline style-এর মতো লাগে, আর সমালোচকেরা বলেন এটা সেই নীতি ভেঙে দিচ্ছে। সমর্থকেরা বলেন, বড় প্রজেক্টে আসল ভাগটা “HTML বনাম CSS ফাইল” নয়, বরং “একটি component (যেমন একটি কার্ড) — তার কাঠামো, চেহারা আর আচরণ একসাথে”। React বা Vue-এর মতো component-ভিত্তিক কাজে একটি component-এর সবকিছু এক জায়গায় রাখলে রক্ষণাবেক্ষণ সহজ হয়। পর্ব ৪৬ আর ৫১-এ এই বিতর্ক গভীরে দেখবেন।

তবে একটি জিনিস কোনো পক্ষই ছাড়েনি: অর্থের স্তর আর চেহারার স্তর আলাদা। utility class যতই থাকুক, শিরোনাম তবু <h2>, মেনু তবু <nav>-এর ভেতরে <ul>, বোতাম তবু <button>. screen reader আর সার্চ ইঞ্জিন class পড়ে না, পড়ে element. যে নীতিটা আসলে অটল, তা হলো: HTML বেছে নিন অর্থ দেখে, চেহারা দেখে নয় — চেহারার নির্দেশ যে ফাইলেই থাকুক।

আরেকটি আধুনিক উদাহরণ: dark mode আর ছাপার জন্য আলাদা চেহারা। একই HTML, কিন্তু পাঠকের পছন্দ বা মাধ্যম অনুযায়ী CSS বদলায় (পর্ব ৩৬)। এটা Zen Garden-এর স্বপ্নেরই প্রতিদিনের রূপ।

মূল উপলব্ধি: “আলাদা ফাইল” একটা কৌশল; আসল নীতি হলো “অর্থ আর চেহারা আলাদা স্তর”। কৌশল সময়ের সাথে বদলায়, নীতিটা থাকে।

অনুশীলন

প্রথম তিনটিতে ভাবা আর দেখাই আসল কাজ। চতুর্থটিতে একটি ভাঙা stylesheet সারাবেন।

  1. অংশগুলো চিনুন: nav a, footer a { color: #2e7d32; text-decoration: none } — এখানে selector list-এ কয়টি selector? declaration কয়টি? property আর value কোনগুলো? শেষ declaration-এর পরে ; নেই — এটা কি ভুল?

    selector list-এ ২টি selector: nav a আর footer a (কমা দিয়ে আলাদা; দুটোই “ভেতরের” selector, পর্ব ১৭)। declaration ২টি: property color — value #2e7d32; property text-decoration — value none. শেষ declaration-এর পরে ; না থাকা ভুল নয় — block-এর শেষ declaration-এর জন্য এটি ঐচ্ছিক। তবে পরে কেউ নতুন লাইন যোগ করলে আগের লাইনে ; না থাকায় দুটিই বাদ পড়বে, তাই সবসময় দিয়ে রাখাই ভালো অভ্যাস।

  2. DevTools-এ গোয়েন্দাগিরি: যেকোনো ওয়েবসাইট খুলে একটি অনুচ্ছেদে ডান-ক্লিক → Inspect করুন। Styles প্যানেলে (ক) “user agent stylesheet” লেখা কোনো rule খুঁজুন, (খ) একটি declaration-এর property-র বানান ভুল করে দিন (যেমন color → colr), (গ) একটি কাটা দাগ দেওয়া কিন্তু ⚠ চিহ্নহীন declaration খুঁজুন। তিন ক্ষেত্রে কী দেখলেন?

    (ক) তালিকার একদম নিচে p-এর জন্য “user agent stylesheet” লেবেলসহ display: block আর margin-block-start: 1em; margin-block-end: 1em জাতীয় নিয়ম দেখবেন — ব্রাউজারের ডিফল্ট (margin-block-start হলো margin-top-এর আধুনিক “logical” নাম, পর্ব ৩৫)। (খ) বানান ভুল করতেই লাইনটি কাটা দাগ আর হলুদ ⚠ চিহ্ন পায়, মাউস রাখলে “Unknown property name”; রংটি আর খাটে না। (গ) শুধু কাটা দাগ মানে declaration বৈধ, কিন্তু অন্য কোনো rule তাকে হারিয়েছে — প্রায়ই ওপরের দিকের কোনো rule-এ একই property পাবেন। কে কেন জেতে, পর্ব ১৮-এ। রিলোড করলে সব বদল মুছে যায়।

  3. কোন ক্ষেত্রে কোন উপায়? (ক) একটি কোচিং সেন্টারের ৩০ পাতার ওয়েবসাইট (খ) মাসিক নিউজলেটার, যা ইমেইলে যাবে (গ) একটি ফাইল আপলোডের অগ্রগতি-দণ্ড, যার প্রস্থ JavaScript প্রতি মুহূর্তে বদলায় (ঘ) একটি এক পাতার ডেমো, যা বন্ধুকে দেখাতে বানালেন।

    (ক) External — একটি style.css, ৩০ পাতাতেই <link rel="stylesheet">; এক জায়গায় বদল, আর পাঠক পাতা থেকে পাতায় গেলে CSS ক্যাশ থেকে আসে। (খ) Inline (সাধারণত টুল দিয়ে স্বয়ংক্রিয়ভাবে বানানো) — অনেক ইমেইল অ্যাপ বাইরের CSS ফাইল আনে না, কিছু <style>-ও কেটে ফেলে। (গ) মূল চেহারা external-এ, শুধু বদলাতে থাকা প্রস্থটি inline — JavaScript element-এর style-এ মান বসায় (প্রায়ই একটি CSS variable হিসেবে, পর্ব ৩৩)। (ঘ) Internal — একটি ফাইলেই সব, পাঠানো সহজ; পরে বড় হলে external-এ সরিয়ে নেবেন।

  4. ভাঙা stylesheet সারান: একজন স্বেচ্ছাসেবী পাঠাগারের ফুটারের জন্য এই CSS লিখেছেন, কিন্তু কিছুই ঠিকমতো কাজ করছে না। পাঁচটি ভুল খুঁজে বের করুন, তারপর ঠিক করা CSS লিখুন:
    // ফুটারের স্টাইল
    footer {
      background: #f1f5f9
      colour: #475569;
      padding: 16 px;
      border-top: 3px solid #2e7d32;
      font-size 0.9rem;
    }

    পাঁচটি ভুল: (১) // CSS-এ comment নয় — parser এটিকে পরের selector-এর অংশ ভাবে, ফলে পুরো footer rule-টাই বাদ পড়ে; এ কারণেই “কিছুই” কাজ করছিল না। (২) #f1f5f9-এর পরে ; নেই — background আর পরের লাইন একসাথে ডুবত। (৩) colour ব্রিটিশ বানান — CSS-এ property-র নাম শুধু color. (৪) 16 px — সংখ্যা আর এককের মাঝে ফাঁকা চলে না। (৫) font-size 0.9rem — কোলন নেই। ঠিক করা CSS নিচে, প্রিভিউসহ — এখানে এডিট করেও দেখতে পারেন:

    /* ফুটারের স্টাইল */
    footer {
      background: #f1f5f9;
      color: #475569;
      padding: 16px;
      border-top: 3px solid #2e7d32;
      font-size: 0.9rem;
    }

    ফুটারটি এখন হালকা ধূসর-নীল পটভূমিতে, ওপরে সবুজ দাগ, চারপাশে ফাঁক আর একটু ছোট ধূসর লেখায়। চেষ্টা করুন: প্রথম লাইনটি আবার // ফুটারের স্টাইল করে দিন — পুরো সাজ একসাথে উধাও হবে, আর DevTools-এ footer-এর জন্য আপনার rule-টাই খুঁজে পাবেন না। তারপর /* */ ফিরিয়ে আনুন।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমCSS-এর ইতিহাসের ঘটনাগুলো সময়ের ক্রমে সাজান (▲▼ চেপে সরান)

  1. Håkon Wium Lie-এর “Cascading HTML Style Sheets” প্রস্তাব
  2. W3C-র আনুষ্ঠানিক মান CSS1
  3. position আর media type নিয়ে CSS2
  4. ব্রাউজারের বাস্তবতার সাথে মেলানো CSS 2.1 চূড়ান্ত
  5. ফিচারের সাপোর্ট বোঝাতে Baseline লেবেল চালু

CSS rule p { color: green; }-এ color অংশটিকে কী বলে?

  • Selector
  • Property
  • Value
  • Declaration block

৩০ পাতার একটি ওয়েবসাইটের সব পাতায় একই চেহারা দিতে CSS যোগ করার সবচেয়ে ভালো উপায় কোনটি?

  • প্রতিটি element-এ style attribute দিয়ে inline style
  • প্রতিটি পাতার head-এ একই <style> ট্যাগ কপি করা
  • <font> ট্যাগ দিয়ে প্রতিটি লেখার রং-ফন্ট ঠিক করা
  • একটি আলাদা .css ফাইল, প্রতিটি পাতায় <link rel="stylesheet"> দিয়ে যুক্ত

.box { colr: red; font-size: 18px; } — ব্রাউজার এই rule কীভাবে সামলাবে?

  • পুরো stylesheet বাতিল করে দেবে
  • console-এ লাল error দেখিয়ে থেমে যাবে
  • colr-এর লাইনটি বাদ দেবে, font-size প্রয়োগ করবে
  • colr-কে color ধরে নিয়ে লেখা লাল করবে

CSS-এ comment লেখার সঠিক উপায় কোনটি?

  • /* এটি একটি comment */
  • // এটি একটি comment
  • <!-- এটি একটি comment -->
  • # এটি একটি comment

কোনো CSS না লিখলেও একটি HTML পাতায় <h1> বড় ও মোটা দেখায়, আর body-র চারপাশে একটু ফাঁক থাকে। এর কারণ কী?

  • ওয়েব সার্ভার প্রতিটি পাতায় একটি CSS যোগ করে দেয়
  • ব্রাউজারের নিজস্ব ডিফল্ট CSS — user-agent stylesheet
  • h1 ট্যাগের ভেতরেই আকার আর রং লেখা থাকে
  • অপারেটিং সিস্টেমের ফন্ট সেটিং

CSS3-এর পরবর্তী বিকাশ সম্পর্কে কোন কথাটি সঠিক?

  • CSS4 প্রকাশিত হয়েছে, আর সব ব্রাউজার সেটি মানে
  • CSS3-এর পর CSS-এ আর নতুন কিছু যোগ হয়নি
  • CSS এখন আলাদা আলাদা মডিউলে নিজস্ব Level নম্বরে এগোয়, আর সাপোর্ট বোঝাতে Baseline লেবেল ব্যবহার হয়
  • CSS-এর নতুন সংস্করণ এখন শুধু Google একা ঠিক করে

শব্দকোষ

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

মনে রাখুন

  1. HTML = অর্থ ও কাঠামো, CSS = চেহারা। আলাদা রাখলে এক জায়গায় বদলে পুরো সাইট বদলায়, আর অর্থ অক্ষত থাকে।
  2. CSS-এর ছাঁচ: selector { property: value; } — selector, declaration block, declaration, property, value আর semicolon.
  3. তিন উপায়: inline (একটি element), internal (একটি পাতা), external (পুরো সাইট, ক্যাশ হয়) — বাস্তব সাইটে head-এ <link rel="stylesheet" href="css/style.css">.
  4. ব্রাউজারের user-agent stylesheet ডিফল্ট চেহারা দেয়; আধুনিক ছোট reset শুধু বিরক্তিকর অংশ বদলায় — focus-এর দাগ কখনো মুছবেন না।
  5. ভুল declaration চুপচাপ বাদ পড়ে — DevTools-এ কাটা দাগ + ⚠ খুঁজুন; comment শুধু /* */; আর CSS4 বলে কিছু নেই, আছে মডিউল, Level আর Baseline.

পরের পর্বে: rule-এর ঠিকানা অংশ — selector — গভীরে। element, class আর id-এর পার্থক্য, attribute selector, আর combinator দিয়ে “nav-এর ভেতরের লিংক” বা “শিরোনামের ঠিক পরের অনুচ্ছেদ”-এর মতো নিখুঁত লক্ষ্য বেছে নেওয়া।

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

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