Luyện Phỏng Vấn IT — 2000+ Câu Hỏi Phỏng Vấn IT Có Đáp Án 2026

DOCTYPE (Document Type Declaration) khai báo phiên bản HTML đang sử dụng, đặt ở dòng đầu tiên.

  • HTML5 chỉ cần <!DOCTYPE html>.
  • Giúp trình duyệt render đúng chuẩn (standards mode).
  • Không có DOCTYPE → quirks mode: box model, CSS parsing khác nhau giữa các browsers, gây lỗi hiển thị.

Cấu trúc cơ bản của tài liệu HTML bao gồm các phần chính sau:

  • <!DOCTYPE html>: Khai báo loại tài liệu cho trình duyệt
  • <html>: Phần tử gốc (root element) bọc toàn bộ trang
  • <head>: Chứa siêu dữ liệu (metadata) như <title>, <meta>, <link>, <style>
  • <body>: Chứa toàn bộ nội dung sẽ hiển thị trên trang web.

Block element chiếm toàn bộ chiều rộng, bắt đầu dòng mới (<div>, <p>, <h1>).

  • Inline element chỉ chiếm chiều rộng cần thiết (<span>, <a>, <strong>).
  • Block chứa được inline, nhưng thường không ngược lại.
  • Ngoại lệ HTML5: <a> có thể bọc block elements.

Attribute cung cấp thông tin bổ sung cho HTML element, viết trong thẻ mở theo cú pháp name="value".

Ví dụ: <a href="https://example.com" target="_blank">Link</a>. Các attribute phổ biến: href, src, class, id, style, alt, type, placeholder. Một số attribute không cần giá trị (boolean): disabled, checked, required.

Lưu ý: attribute name không phân biệt hoa thường nhưng giá trị thì có.

Boolean attribute là loại attribute trong HTML chỉ có hai trạng thái: có mặt trong thẻ nghĩa là true, vắng mặt nghĩa là false — giá trị gán cho nó không quan trọng. Ví dụ, viết <input disabled> hoặc <input disabled=""> hoặc <input disabled="disabled"> đều cho kết quả giống nhau là input bị vô hiệu hóa.

Các boolean attribute phổ biến bao gồm disabled, checked, selected, required, readonly, autofocus, hidden, multiple. Một lỗi rất hay gặp là viết disabled="false" với ý định bật lại — nhưng thực tế element vẫn bị disable vì browser chỉ kiểm tra attribute có tồn tại hay không, không quan tâm giá trị.

Cho phép lưu trữ dữ liệu tùy chỉnh trên HTML element mà không vi phạm HTML spec.

  • Cú pháp: data-user-id="123".
  • Truy cập qua JS bằng element.dataset.userId (tự convert kebab-case sang camelCase). Ứng dụng: truyền data từ HTML sang JS, CSS selectors ([data-active]), testing (data-testid).
  • React dùng data attributes để pass info cho DOM.

Semantic HTML dùng thẻ có ý nghĩa mô tả nội dung (<article>, <nav>, <header>, <main>, <aside>) thay vì thẻ chung (<div>, <span>).

Quan trọng vì:

  1. SEO — search engines hiểu cấu trúc trang tốt hơn.
  2. Accessibility — screen readers navigate bằng semantic landmarks.
  3. Maintainability — code tự mô tả, đọc hiểu nhanh hơn.
  4. Consistency — team dùng cùng conventions

<div> là container chung không có ý nghĩa ngữ nghĩa — dùng khi chỉ cần nhóm để style hoặc layout. <section> đại diện cho phần nội dung có chủ đề liên quan, thường có <h2> hoặc heading đi kèm.

  • Screen readers nhận diện <section> là landmark region.

Ví dụ thực tế: một trang product dùng <section> cho phần mô tả, reviews, specs — không dùng <div> cho các khối nội dung có ý nghĩa riêng biệt.

<article> là nội dung độc lập, có thể đứng riêng và vẫn có nghĩa (bài blog, comment, card sản phẩm, tweet). <section> là nhóm nội dung liên quan trong cùng tài liệu, cần context của trang.

  • Test nhanh: nếu có thể syndicate nội dung đó ra site khác mà vẫn hiểu được → dùng <article>.
  • Article thường có <header>, <footer>, byline riêng.
  • Article có thể chứa nhiều <section><section> có thể chứa nhiều <article>.

<header>: phần giới thiệu/navigation của trang hoặc section (có thể dùng nhiều lần). <footer>: thông tin cuối trang (copyright, liên hệ, links). <nav>: navigation links chính — screen readers cho phép nhảy thẳng đến đây. <main>: nội dung chính, duy nhất 1 per page, screen readers có thể nhảy thẳng đến <main> (skip navigation). <aside>: nội dung liên quan gián tiếp (sidebar, related posts, ads).

Lưu ý: <header><footer> không nhất thiết chỉ dùng ở top/bottom trang — mỗi <article> cũng có thể có header riêng.

<figure> nhóm nội dung minh họa có thể tách ra mà không ảnh hưởng luồng văn bản chính: ảnh, biểu đồ, code snippet, video. <figcaption> là chú thích mô tả, đặt đầu hoặc cuối <figure>.

Ví dụ: <figure><img src="chart.png" alt="Biểu đồ doanh thu Q1 2024"><figcaption>Biểu đồ doanh thu Q1</figcaption></figure>. <figcaption> bổ sung thêm cho alt, không thay thế nó — alt vẫn cần mô tả nội dung ảnh cho screen readers; figcaption là caption hiển thị cho tất cả users. Nếu figcaption đã mô tả đầy đủ, alt có thể để rỗng (alt=""). Khác với chỉ dùng <img>: figure semantically đóng gói ảnh kèm caption.

HTML5 mang đến nhiều cải tiến lớn so với HTML4 trên 3 nhóm chính:

Semantic & Media: thẻ semantic (<header>, <nav>, <article>, <section>), <audio>/<video> native không cần Flash, Canvas/SVG cho đồ họa.

Storage & APIs: Web Storage (localStorage, sessionStorage), IndexedDB cho dữ liệu lớn, Geolocation API, Web Workers, WebSocket, Drag & Drop.

Forms: form validation tích hợp, các input types mới (email, date, number, range, color).

Canvas là pixel-based (raster), vẽ bằng JavaScript, tốt cho game/animation phức tạp.

  • SVG là vector-based (XML), scale không mất chất lượng, tốt cho icon/chart/logo.
  • SVG accessible hơn vì là DOM elements.

GET gửi dữ liệu qua URL (query string), giới hạn kích thước, có thể bookmark. POST gửi trong body request, không giới hạn kích thước.

Lưu ý: POST không tự bảo mật hơn GET — cần HTTPS để bảo vệ dữ liệu. GET cho truy vấn, POST cho dữ liệu lớn/thay đổi state.

HTML5 cung cấp nhiều input types với validation và UI riêng theo nhóm:

Text/Data: text, password, email, number, tel, url, search.

Date/Time: date, time, datetime-local, month, week.

Interactive/Media: color, range, file, checkbox, radio, hidden, submit, reset, button.

<label> liên kết mô tả với form control theo 2 cách: dùng for khớp với id của input (<label for="email">Email</label><input id="email">), hoặc wrapping trực tiếp.

  • Click vào label = focus/check input — tăng click area đáng kể trên mobile.
  • Screen readers đọc label khi user focus vào input.
  • Lỗi phổ biến: chỉ dùng placeholder thay label — placeholder biến mất khi gõ, không accessible.
  • Placeholder nên là gợi ý, không phải label.

<select> là dropdown cho phép chọn từ danh sách cố định — user không thể nhập giá trị ngoài list. <datalist> gắn vào <input> qua list attribute, cung cấp gợi ý tự động điền nhưng user vẫn gõ giá trị tùy ý.

Ví dụ datalist: ô tìm kiếm gợi ý nhưng cho phép search từ khóa mới.

<fieldset> nhóm các form controls có liên quan nhau, tạo border visual và semantic grouping. <legend> là tiêu đề mô tả cho nhóm đó.

  • Đặc biệt quan trọng cho nhóm radio/checkbox: screen readers đọc legend trước mỗi option (ví dụ: 'Giới tính: Nam / Nữ').
  • Có thể dùng disabled trên <fieldset> để disable toàn bộ group inputs bên trong. Ứng dụng: form đăng ký nhiều section (Thông tin cá nhân, Địa chỉ, Thanh toán).

Accessibility (a11y — viết tắt 11 chữ cái giữa) là khả năng web được dùng bởi mọi người, kể cả người khuyết tật (thị giác, thính giác, vận động, nhận thức).

Quan trọng vì:

  1. Đạo đức — ~15% dân số thế giới có dạng khuyết tật nào đó.
  2. Luật pháp — ADA (Mỹ), WCAG 2.1 AA là yêu cầu pháp lý ở nhiều nơi.
  3. Business — site accessible rank SEO tốt hơn, reach rộng hơn.
  4. UX — closed captions giúp cả người xem không tiếng ồn; good contrast giúp mọi người dưới nắng

ARIA (Accessible Rich Internet Applications) là tập hợp attributes bổ sung accessibility cho HTML khi semantic không đủ. 3 loại:

  1. Roles — xác định vai trò (role="button", role="dialog").
  2. States — trạng thái (aria-expanded="true", aria-disabled).
  3. Properties — thuộc tính (aria-label, aria-describedby)

Nguyên tắc: dùng native HTML trước, ARIA là giải pháp cuối cùng.

Alt text mô tả hình ảnh cho screen readers và hiện khi ảnh không load được. 3 trường hợp: ảnh mang thông tin — mô tả ngắn gọn nội dung/mục đích (không bắt đầu bằng 'Hình ảnh của...'); ảnh là link — mô tả đích đến; ảnh decorative thuần túy — alt="" để screen reader bỏ qua.

  • Quan trọng cho SEO: Google Images index dựa vào alt text.
  • Lỗi phổ biến: alt="image123.jpg" (filename), alt="logo" quá chung chung, hoặc bỏ qua alt hoàn toàn.

id phải duy nhất trên toàn trang, chỉ gán cho 1 element duy nhất — dùng cho anchor links (#section) và getElementById(). class dùng lại được, nhiều element chia sẻ cùng class, 1 element có thể có nhiều class.

  • CSS specificity: id (0,1,0,0) cao hơn class (0,0,1,0), nên tránh dùng id để style vì khó override.
  • Trong React, dùng htmlFor thay forclassName thay class.

<mark> highlight text có liên quan đến context hiện tại — ví dụ kết quả tìm kiếm (nền vàng mặc định). <strong> biểu thị tầm quan trọng cao (in đậm) — screen readers có thể đọc mạnh hơn. <em> nhấn mạnh ngữ điệu như nói chuyện (in nghiêng).

  • Cả ba có ý nghĩa ngữ nghĩa.
  • Ngược lại, <b><i> chỉ là visual styling không có semantic meaning.

Ví dụ đúng: <strong>Cảnh báo:</strong> không tắt máy khi đang cập nhật.

Đánh dấu ngày/giờ theo format machine-readable giúp search engines và screen readers hiểu đúng.

  • Attribute datetime chứa giá trị ISO 8601: <time datetime="2024-03-15T09:00">Thứ Sáu, 15/3/2024</time>.
  • Quan trọng cho SEO (Google hiểu publication date), calendar events, và tính 'thời gian trước' (3 giờ trước).
  • Nếu không có datetime, nội dung text bên trong phải là ngày hợp lệ.
  • Dùng trong blog posts, events, changelogs.

Semantic HTML giúp search engine crawlers hiểu cấu trúc và nội dung trang chính xác hơn. <article> đánh dấu nội dung chính, <h1> là keyword chính, <nav> thể hiện cấu trúc site.

  • Google dùng structured data từ semantic markup cho rich snippets.
  • Ngoài ra, <img alt="..."> đóng góp vào image search.
  • Trang semantic thường có bounce rate thấp hơn vì UX tốt hơn — Google tính đây là quality signal.
  • Kết hợp semantic HTML với Schema.org JSON-LD cho kết quả tốt nhất.

Description list dùng cho cặp thuật ngữ-định nghĩa hoặc key-value pairs. <dl> bọc toàn bộ, <dt> (term) là thuật ngữ, <dd> (description) là giải thích.

  • Một <dt> có thể có nhiều <dd>.
  • Phù hợp nhất cho: FAQ (câu hỏi là dt, câu trả lời là dd), glossary, metadata (Tác giả: ..., Ngày: ..., Thể loại: ...).
  • Lỗi hay gặp: dùng <ul> + <li> cho danh sách key-value vì tiện hơn, nhưng <dl> semantic và accessible hơn.

<details> tạo widget accordion/disclosure native không cần JS. <summary> là tiêu đề luôn hiển thị, click vào toggle nội dung bên trong. Thêm attribute open để mặc định mở. Trình duyệt tự thêm mũi tên toggle, style bằng details > summary { list-style: none } để xóa.

Ứng dụng thực tế: FAQ sections, spoiler tags, filter panels. Hữu ích khi muốn accordion đơn giản mà không import thư viện JS. CSS details[open] để style khi đang mở.

Ứng dụng web có trải nghiệm gần native app: offline, installable, push notifications.

  • Yêu cầu: HTTPS, Service Worker, Web App Manifest.
  • Dùng manifest.json khai báo icon, theme, start_url.

required (bắt buộc), pattern (regex), min/max (số/ngày), minlength/maxlength (chuỗi), step (bước nhảy).

  • Input type email/url tự validate format.
  • Dùng :valid/:invalid CSS pseudo-classes.

readonly: user không thể chỉnh sửa nhưng vẫn focus, copy, và giá trị vẫn được submit cùng form. disabled: không tương tác được, không focusable, giá trị KHÔNG submit (bị loại khỏi form data). Visual: disabled làm mờ element, readonly giữ nguyên appearance. Dùng readonly khi muốn hiển thị giá trị nhưng vẫn cần submit (số tham chiếu tự động). Dùng disabled khi field không áp dụng và không cần gửi lên server.

Lưu ý: readonly chỉ hoạt động với input/textarea, không với select.

application/x-www-form-urlencoded (mặc định, encode key=value). multipart/form-data (bắt buộc khi upload file). text/plain (không encode, dùng cho debug).

Upload file phải dùng multipart.

  • Gợi ý trình duyệt tự điền form.
  • Values: on/off, hoặc cụ thể: name, email, tel, address-line1, cc-number.
  • Cải thiện UX, giảm nhập liệu.
  • Có thể set trên form hoặc từng input.

API JavaScript kiểm tra và tùy chỉnh form validation.

  • Methods: checkValidity(), reportValidity(), setCustomValidity()
  • Properties: validity.valueMissing, validity.typeMismatch
  • Override message lỗi mặc định của browser.

Thu thập dữ liệu form dạng key-value pairs. new FormData(formElement) tự động lấy tất cả fields.

  • Hỗ trợ file upload.
  • Dùng với fetch() để submit form bằng JavaScript.
  • Methods: append(), get(), entries().

Web Content Accessibility Guidelines - tiêu chuẩn quốc tế về accessibility. 3 cấp: A (cơ bản), AA (khuyến nghị, yêu cầu pháp lý), AAA (cao nhất). 4 nguyên tắc: Perceivable, Operable, Understandable, Robust.

aria-label gán label trực tiếp bằng string — dùng khi không có visible label. aria-labelledby reference đến id của element chứa label (có thể reference nhiều id cách nhau bởi space: aria-labelledby="title desc"). aria-describedby thêm mô tả bổ sung (hint text, error message). Thứ tự ưu tiên: aria-labelledby override aria-label. aria-describedby là thông tin phụ, đọc sau label.

Ví dụ kết hợp: <input aria-labelledby="field-label" aria-describedby="field-hint"> — screen reader sẽ đọc cả label lẫn hint.

Hàng triệu users chỉ dùng keyboard: người khuyết tật vận động, người dùng screen readers, power users.

  • Mọi interactive element phải focusable và operable bằng keyboard.
  • Phím chuẩn: Tab/Shift+Tab navigate, Enter/Space activate buttons, Escape đóng modals, mũi tên trong widget (menu, slider).
  • Focus indicator (outline) phải luôn hiển thị — đừng outline: none mà không có alternative.
  • Test nhanh: unplug chuột và thử dùng toàn bộ tính năng chỉ bằng keyboard.

tabindex="0": thêm element vào tab order tự nhiên. tabindex="-1": focusable bằng JS nhưng không tab được. tabindex > 0: đặt thứ tự ưu tiên (tránh dùng, gây confuse).

Mặc định: links, buttons, inputs đã focusable.

WCAG AA (tiêu chuẩn khuyến nghị): text thường cần tỷ lệ contrast tối thiểu 4.5:1, text lớn (18px+ hoặc 14px+ bold) cần 3:1. WCAG AAA: 7:1 và 4.5:1. Contrast ratio tính giữa màu text và màu nền.

Ví dụ: chữ xám nhạt #999 trên nền trắng chỉ đạt ~2.85:1 — fail AA. Tools kiểm tra: Lighthouse DevTools, WebAIM Contrast Checker, axe DevTools extension.

Lưu ý: không dùng màu là cách duy nhất truyền thông tin (ví dụ: chỉ dùng màu đỏ/xanh cho lỗi/thành công).