পাঠ ৩৫ · ৫৭-এর মধ্যে · মডিউল ৮
Home / Courses / Human-Computer Interaction / ভিজ্যুয়াল ডিজাইন

ভিজ্যুয়াল ডিজাইন প্রিন্সিপল — লেআউট, টাইপোগ্রাফি, রঙ

Visual design principles — layout, typography, color
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • লেআউট ও গ্রিড সিস্টেম কীভাবে ভিজ্যুয়াল স্ট্রাকচার ও সম্পর্ক তৈরি করে
  • টাইপোগ্রাফিক হায়ারার্কি ও রিডেবিলিটির মূল নিয়মগুলো
  • UI-তে রঙ তত্ত্বের ব্যবহারিক প্রয়োগ — অর্থ, স্ট্যাটাস ও দৃষ্টি আকর্ষণ
  • একটি সত্যিকারের Python ফাংশন দিয়ে WCAG কনট্রাস্ট রেশিও গণনা করে ভিজ্যুয়াল ডিজাইনকে অ্যাক্সেসিবিলিটির সাথে যুক্ত করা

১ · লেআউট ও গ্রিড সিস্টেম

ভালো ভিজ্যুয়াল ডিজাইন এলোমেলো নয় — এর পেছনে একটি অদৃশ্য গ্রিড থাকে যা প্রতিটি উপাদানকে সারিবদ্ধ (align) রাখে। মানুষের চোখ স্বয়ংক্রিয়ভাবে সারিবদ্ধ ও সামঞ্জস্যপূর্ণভাবে স্পেসড উপাদানগুলোকে একসাথে সম্পর্কিত হিসেবে পড়ে — এটি M2/L08-এ কভার করা গেস্টাল্ট প্রক্সিমিটি (proximity) ও অ্যালাইনমেন্ট নীতিরই ব্যবহারিক প্রয়োগ। একটি সাধারণ ১২-কলাম গ্রিড, সামঞ্জস্যপূর্ণ মার্জিন/গাটার, এবং ইচ্ছাকৃত হোয়াইটস্পেস (whitespace) — এই তিনটি একসাথে একটি পৃষ্ঠার ভিজ্যুয়াল হায়ারার্কি ও পড়ার ক্রম নির্ধারণ করে।

গ্রিড ও অ্যালাইনমেন্ট
সামঞ্জস্যপূর্ণ কলাম/মার্জিন উপাদানগুলোর মধ্যে একটি অদৃশ্য সম্পর্ক তৈরি করে — এলোমেলো অবস্থানের চেয়ে অনেক দ্রুত স্ক্যান করা যায়।
হোয়াইটস্পেস
ফাঁকা জায়গা "অপচয়" নয় — এটি সম্পর্কিত উপাদানগুলোকে গ্রুপ করে ও অসম্পর্কিতগুলোকে আলাদা করে (গেস্টাল্ট প্রক্সিমিটি, M2/L08)।
ভিজ্যুয়াল হায়ারার্কি
আকার, অবস্থান ও কনট্রাস্ট দিয়ে নির্ধারণ করা হয় ব্যবহারকারী প্রথমে কোথায় তাকাবে — এলোমেলো লেআউটে সবকিছু সমান গুরুত্বপূর্ণ মনে হয়, যা আসলে কিছুই গুরুত্বপূর্ণ মনে না হওয়ার সমান।

২ · টাইপোগ্রাফি — হায়ারার্কি ও রিডেবিলিটি

টাইপোগ্রাফি মানে শুধু "সুন্দর ফন্ট বাছাই" নয় — এটি টেক্সটের মধ্যে হায়ারার্কি তৈরি করার একটি টুল। ফন্ট সাইজ, ওজন (bold/regular) ও রঙের কনট্রাস্ট দিয়ে কোন টেক্সট শিরোনাম, কোনটি সাব-শিরোনাম, আর কোনটি বডি টেক্সট তা স্পষ্ট হয়ে ওঠে — ব্যবহারকারীকে প্রতিটি শব্দ পড়ে বুঝতে হয় না, তারা শুধু স্ক্যান করেই কাঠামো ধরতে পারে। রিডেবিলিটির জন্য দুটি ব্যবহারিক নিয়ম বিশেষভাবে গুরুত্বপূর্ণ —

লাইন-লেংথ
প্রতি লাইনে আনুমানিক ৪৫-৭৫টি অক্ষর — এর চেয়ে বেশি লম্বা লাইনে চোখ পরের লাইনের শুরু খুঁজে পেতে কষ্ট পায়, ফলে পড়ার গতি কমে।
লাইন-হাইট
ফন্ট সাইজের প্রায় ১.৪-১.৬ গুণ লাইন-স্পেসিং লাইনগুলোকে একসাথে জড়িয়ে না গিয়ে সহজে আলাদা করে পড়া যায়।
টাইপোগ্রাফিক হায়ারার্কি ও অ্যাক্সেসিবিলিটি একসাথে চলে — M10/L44-এ দেখা যাবে, একটি সঠিকভাবে সাজানো হেডিং-স্ট্রাকচার (h1 → h2 → h3) শুধু ভিজ্যুয়াল হায়ারার্কির জন্য নয়, স্ক্রিন রিডার ব্যবহারকারীদের নেভিগেশনের জন্যও অপরিহার্য।

৩ · রঙ তত্ত্ব ও কনট্রাস্ট — একটি সত্যিকারের গণনা

UI-তে রঙের তিনটি ব্যবহারিক ভূমিকা আছে — ব্র্যান্ড/পরিচয় প্রকাশ করা, স্ট্যাটাস যোগাযোগ করা (লাল = বিপদ/এরর, সবুজ = সফল — যদিও শুধু রঙের উপর নির্ভর করা উচিত নয়, কারণ রঙ-অন্ধ ব্যবহারকারীরা পার্থক্য নাও ধরতে পারেন), আর দৃষ্টি আকর্ষণ করা (একটি উজ্জ্বল CTA বাটন)। কিন্তু রঙ বাছাই করার সময় নান্দনিকতার পাশাপাশি একটি পরিমাপযোগ্য বাধ্যবাধকতাও থাকে — WCAG কনট্রাস্ট রেশিও, যা M10/L43-এ অ্যাক্সেসিবিলিটির প্রেক্ষাপটে বিস্তারিত আলোচনা হবে। এখানে সংক্ষেপে সূত্রটি দেখানো হলো —

$$L = 0.2126 R + 0.7152 G + 0.0722 B \qquad \text{Contrast} = \frac{L_{lighter} + 0.05}{L_{darker} + 0.05}$$

যেখানে প্রতিটি চ্যানেল (R, G, B) প্রথমে ০-১ স্কেলে লিনিয়ারাইজ করা হয় (গ্যামা-কারেকশন বাদ দিয়ে), তারপর ওজন দিয়ে যোগ করে রিলেটিভ লুমিন্যান্স (L) বের করা হয়। সাধারণ টেক্সটের জন্য WCAG AA স্ট্যান্ডার্ড ন্যূনতম ৪.৫:১ কনট্রাস্ট রেশিও দাবি করে। নিচের কোড সেলে এই সূত্রটি সরাসরি বাস্তবায়ন করে তিনটি বাস্তব UI রঙের জোড়ার উপর প্রয়োগ করা হয়েছে।

Python
# WCAG-এর প্রকৃত রিলেটিভ-লুমিন্যান্স কনট্রাস্ট-রেশিও ফর্মুলা -- ভিজ্যুয়াল ডিজাইনের রঙ পছন্দ যাচাই

def relative_luminance(rgb):
    def channel(c):
        c = c / 255
        if c <= 0.03928:
            return c / 12.92
        else:
            return ((c + 0.055) / 1.055) ** 2.4
    r, g, b = rgb
    R, G, B = channel(r), channel(g), channel(b)
    return 0.2126 * R + 0.7152 * G + 0.0722 * B

def contrast_ratio(fg, bg):
    l1 = relative_luminance(fg)
    l2 = relative_luminance(bg)
    lighter, darker = max(l1, l2), min(l1, l2)
    return (lighter + 0.05) / (darker + 0.05)

MIN_CONTRAST_AA = 4.5

pairs = [
    ("সাদা টেক্সট / ব্র্যান্ড নীল বাটন", (255, 255, 255), (37, 99, 235)),
    ("গাঢ় নেভি টেক্সট / হালকা ধূসর ব্যাকগ্রাউন্ড", (15, 23, 42), (241, 245, 249)),
    ("হালকা ধূসর 'সূক্ষ্ম' টেক্সট / সাদা ব্যাকগ্রাউন্ড", (203, 213, 225), (255, 255, 255)),
]

for label, fg, bg in pairs:
    ratio = contrast_ratio(fg, bg)
    passed = ratio >= MIN_CONTRAST_AA
    status = "পাস" if passed else "ফেইল"
    print(f"{label:42s} | কনট্রাস্ট={ratio:.2f}:1 | AA {status}")

    
লক্ষ্য করুন — সাদা টেক্সট/ব্র্যান্ড নীল বাটন জোড়াটি কনট্রাস্ট ৫.১৭:১ পায়, যা AA থ্রেশহোল্ড (৪.৫:১) পার হয়ে যায়। গাঢ় নেভি/হালকা ধূসর জোড়াটি ১৬.৩০:১ — অনেক বেশি নিরাপদ। কিন্তু "সূক্ষ্ম" ধূসর টেক্সট জোড়াটি মাত্র ১.৪৮:১ পায় এবং ফেইল করে — এটি একটি বাস্তব, সাধারণ ডিজাইন ভুল: ডিজাইনাররা প্রায়ই "সূক্ষ্ম/এলিগ্যান্ট" দেখানোর জন্য হালকা ধূসর টেক্সট ব্যবহার করেন, কিন্তু চোখে "পড়া যাচ্ছে" মনে হলেও গণনা করা কনট্রাস্ট থ্রেশহোল্ড পূরণ করে না।
মূল কথা · Key takeaway

লেআউট, টাইপোগ্রাফি ও রঙ — তিনটিই একসাথে কাজ করে ভিজ্যুয়াল হায়ারার্কি তৈরি করতে, যাতে ব্যবহারকারী কোনো ইন্টারফেসকে দ্রুত স্ক্যান করে বুঝতে পারে। কিন্তু "সুন্দর দেখাচ্ছে" একটি বিষয়গত অনুভূতি — WCAG কনট্রাস্ট রেশিওর মতো পরিমাপযোগ্য নিয়ম নিশ্চিত করে যে ডিজাইনটি শুধু ডিজাইনারের চোখে নয়, প্রকৃতপক্ষে সব ব্যবহারকারীর জন্য কাজ করে। M10-এ এই কনট্রাস্ট নীতি অ্যাক্সেসিবিলিটির পূর্ণ প্রেক্ষাপটে আরও বিস্তারিত আলোচনা হবে।

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

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ একটি ফর্মে সব লেবেল, ইনপুট ও বাটন একই ফন্ট সাইজ ও ওজনে দেখানো হলে ব্যবহারকারীর জন্য কী সমস্যা তৈরি হতে পারে?

কোনো ভিজ্যুয়াল হায়ারার্কি না থাকলে ব্যবহারকারী বুঝতে পারবেন না কোনটি প্রাইমারি অ্যাকশন (যেমন "সাবমিট") আর কোনটি সেকেন্ডারি (যেমন "বাতিল করুন"), অথবা কোনটি লেবেল আর কোনটি প্রকৃত ইনপুট মান — প্রতিটি উপাদান স্ক্যান করতে সমান সময় লাগবে, ফর্মটি পূরণ করতে ধীরগতি ও ভুলের সম্ভাবনা বাড়বে।

প্র ০২ একটি ডিজাইনার শুধু রঙ দিয়ে (লাল = এরর, সবুজ = সফল) স্ট্যাটাস বোঝাতে চান, কোনো আইকন বা টেক্সট ছাড়া। কেন এটি সমস্যাজনক হতে পারে?

রঙ-অন্ধত্ব (color blindness) থাকা ব্যবহারকারীদের (বিশেষ করে লাল-সবুজ পার্থক্য করতে অসুবিধা হওয়া, যা পুরুষদের মধ্যে অপেক্ষাকৃত সাধারণ) জন্য দুটো স্ট্যাটাস একই রকম দেখাতে পারে। শুধু রঙের উপর নির্ভর না করে একটি আইকন (✓/✗), টেক্সট লেবেল, বা আকৃতির পার্থক্যও যোগ করা উচিত — এটি M10-এ ইনক্লুসিভ ডিজাইনের একটি সাধারণ নীতি।

প্র ০৩ উপরের কোড সেলে "সূক্ষ্ম ধূসর টেক্সট" জোড়াটি চোখে "পড়া যাচ্ছে" মনে হলেও কেন ফেইল করে — এখান থেকে ডিজাইনারদের কী শেখা উচিত?

মানুষের চোখ পরিস্থিতি অনুযায়ী (স্ক্রিন উজ্জ্বলতা, আলো, বয়স, দৃষ্টিশক্তি) ভিন্নভাবে রঙ উপলব্ধি করে — একজন ডিজাইনারের নতুন, উচ্চ-রেজোলিউশন মনিটরে "পড়া যাচ্ছে" মনে হওয়া একটি রঙ জোড়া অন্য পরিস্থিতিতে পড়া কঠিন হতে পারে। এ কারণেই একটি সুনির্দিষ্ট, গণনাযোগ্য থ্রেশহোল্ড (৪.৫:১) দরকার — বিষয়গত "আমার কাছে ঠিক লাগছে" যথেষ্ট নির্ভরযোগ্য নয়।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে একটি নতুন জোড়া যোগ করা হলো — ("কমলা টেক্সট / সাদা ব্যাকগ্রাউন্ড", (217, 119, 6), (255, 255, 255)) — এই জোড়াটি কি ৪.৫:১ AA থ্রেশহোল্ড পাস করবে বলে আপনার ধারণা?

    কমলা রঙের রিলেটিভ লুমিন্যান্স তুলনামূলকভাবে বেশি (এটি একটি মাঝারি-উজ্জ্বল রঙ), তাই সাদা ব্যাকগ্রাউন্ডের সাথে এর লুমিন্যান্সের পার্থক্য খুব বেশি হবে না — সম্ভবত এটি ৪.৫:১ থ্রেশহোল্ড পাস করবে না।

  2. পরীক্ষা করুন: উপরের কোড সেলে pairs তালিকায় সেই জোড়াটি যোগ করে Run চেপে আপনার অনুমান যাচাই করুন।

    জোড়াটির কনট্রাস্ট রেশিও ৩.১৯:১ — ঠিক যেমন অনুমান করা হয়েছিল, এটি ৪.৫:১ থ্রেশহোল্ড পার হতে পারেনি এবং ফেইল দেখায়। এটি একটি বাস্তব, সাধারণ ভুল — অনেক ব্র্যান্ড কমলা/ হলুদ রঙকে সাদা ব্যাকগ্রাউন্ডে সরাসরি টেক্সট রঙ হিসেবে ব্যবহার করে ফেলেন, যা প্রকৃতপক্ষে AA স্ট্যান্ডার্ড পূরণ করে না।

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

আগের পাঠ
ইউজেবিলিটি পরিমাপ — মেট্রিক্স, SUS ও টাস্ক সাকসেস রেট