Trang này tóm tắt các thẻ HTML, thuộc tính CSS và API JavaScript hay dùng nhất — dùng như tài liệu tham khảo nhanh khi cần tra cứu.
HTML — Thẻ thiết yếu
Cấu trúc trang
Thẻ
Mô tả
<!DOCTYPE html>
Khai báo HTML5
<html lang="vi">
Phần tử gốc, khai báo ngôn ngữ
<head>
Metadata: title, meta, link CSS, script
<body>
Nội dung hiển thị ra màn hình
<header>
Tiêu đề trang hoặc section
<nav>
Vùng điều hướng (menu)
<main>
Nội dung chính (duy nhất trong trang)
<article>
Nội dung độc lập (bài viết, bình luận)
<section>
Phân đoạn trang theo chủ đề
<aside>
Nội dung phụ, sidebar
<footer>
Chân trang
Văn bản & nội dung
Thẻ
Mô tả
<h1>–<h6>
Tiêu đề cấp 1–6
<p>
Đoạn văn
<strong>
Nội dung quan trọng (in đậm + ngữ nghĩa)
<em>
Nội dung nhấn mạnh (in nghiêng + ngữ nghĩa)
<a href="url">
Liên kết
<img src="url" alt="text">
Hình ảnh
<ul> / <ol> / <li>
Danh sách không thứ tự / có thứ tự / mục
<dl> / <dt> / <dd>
Danh sách định nghĩa
<table> / <tr> / <th> / <td>
Bảng
<blockquote>
Trích dẫn dài
<code>
Code inline
<pre>
Code block (giữ nguyên khoảng trắng)
<br>
Ngắt dòng
<hr>
Đường kẻ ngang
Form
Thẻ / Thuộc tính
Mô tả
<form action method>
Container form
<input type="text">
Ô nhập văn bản
<input type="email">
Ô nhập email (tự validate)
<input type="password">
Mật khẩu (ẩn ký tự)
<input type="checkbox">
Hộp chọn nhiều
<input type="radio">
Chọn một trong nhóm
<input type="file">
Chọn tệp
<input type="submit">
Nút gửi
<textarea>
Vùng nhập nhiều dòng
<select> / <option>
Danh sách thả xuống
<label for="id">
Nhãn cho input
<button type="submit/reset/button">
Nút bấm
required
Bắt buộc nhập
placeholder
Văn bản gợi ý
disabled / readonly
Vô hiệu hoá / chỉ đọc
Meta tags quan trọng
<metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><metaname="description"content="Mô tả trang web — hiện trong kết quả tìm kiếm"><metaproperty="og:title"content="Tiêu đề cho mạng xã hội"><metaproperty="og:image"content="url-ảnh-preview"><title>Tiêu đề trang</title><linkrel="canonical"href="https://example.com/url-chinh-thuc"><linkrel="stylesheet"href="style.css">
CSS — Thuộc tính hay dùng
Box Model
box-sizing:border-box;/* padding/border tính trong width */width:300px;height:auto;max-width:100%;/* Không tràn container */padding:1rem;/* Trong: 1rem tất cả 4 cạnh */margin:0auto;/* Ngoài: căn giữa theo chiều ngang */border:1pxsolid#ddd;border-radius:8px;
Typography
font-family:'Roboto',sans-serif;font-size:1rem;/* 16px mặc định */font-weight:400;/* 400=normal, 700=bold */font-style:italic;line-height:1.6;/* Khoảng cách dòng (nhân với font-size) */letter-spacing:0.02em;text-align:left|center|right|justify;text-decoration:none|underline;text-transform:none|uppercase|lowercase|capitalize;color:#333;
Display & Visibility
display:block|inline|inline-block|flex|grid|none;visibility:visible|hidden;/* hidden vẫn giữ chỗ */opacity:0;/* 0=trong suốt, 1=đục */overflow:visible|hidden|scroll|auto;
/* Container */display:grid;grid-template-columns:1fr2fr1fr;/* 3 cột tỉ lệ 1:2:1 */grid-template-columns:repeat(3,1fr);/* 3 cột đều nhau */grid-template-columns:repeat(auto-fill,minmax(200px,1fr));/* Responsive */grid-template-rows:auto;grid-template-areas:"header header""sidebar main""footer footer";gap:1rem;/* Item */grid-column:1/3;/* Từ cột 1 đến 3 */grid-row:1/2;grid-area:header;/* Dùng với template-areas */
Position
position:static;/* Mặc định — theo flow */position:relative;/* Giữ chỗ, có thể dùng top/left/right/bottom */position:absolute;/* Ra khỏi flow, tính từ ancestor positioned gần nhất */position:fixed;/* Ra khỏi flow, tính từ viewport */position:sticky;/* Như relative, dính lại khi scroll qua */top:0;right:0;bottom:0;left:0;z-index:10;/* Lớp chồng lên (số lớn hơn = trên) */
/* Mobile-first: style mặc định cho mobile, mở rộng cho màn lớn */@media(min-width:768px){/* tablet+ */}@media(min-width:1024px){/* desktop+ */}/* Breakpoints Bootstrap 5 *//* sm: 576px | md: 768px | lg: 992px | xl: 1200px | xxl: 1400px */
JavaScript — API trình duyệt hay dùng
DOM Selection
document.getElementById('id')// Một phần tử theo iddocument.querySelector('.class')// Phần tử đầu tiên theo CSS selectordocument.querySelectorAll('div.card')// Tất cả phần tử theo CSS selectordocument.createElement('div')// Tạo phần tử mớielement.closest('.parent')// Tìm ancestor gần nhất khớp selector
DOM Manipulation
el.textContent='text'// Nội dung text (an toàn, không render HTML)el.innerHTML='<b>html</b>'// Nội dung HTML (cẩn thận XSS)el.classList.add('active')// Thêm classel.classList.remove('active')// Xoá classel.classList.toggle('dark')// Thêm/xoá classel.classList.contains('btn')// Kiểm tra có class khôngel.setAttribute('href','/url')// Set thuộc tínhel.getAttribute('href')// Lấy thuộc tínhel.style.color='red'// Style inlineparent.appendChild(child)// Thêm phần tử con cuốiparent.removeChild(child)// Xoá phần tử conel.remove()// Xoá phần tử khỏi DOM
Events
el.addEventListener('click',function(event){event.preventDefault()// Ngăn hành vi mặc định (a, form)event.stopPropagation()// Ngăn bubble lên parentconsole.log(event.target)// Phần tử được clickconsole.log(event.currentTarget)// Phần tử gắn listener})el.removeEventListener('click',handler)// Các sự kiện phổ biến:// click, dblclick, mouseenter, mouseleave, mouseover// keydown, keyup, keypress// input, change, submit, focus, blur// scroll, resize (window)// DOMContentLoaded, load (window)
Fetch API
// GETfetch('/api/data').then(res=>res.json()).then(data=>console.log(data)).catch(err=>console.error(err))// POST (async/await)asyncfunctionpostData(url,payload){constres=awaitfetch(url,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload),});if(!res.ok)thrownewError(`HTTP ${res.status}`);returnres.json();}
Storage
localStorage.setItem('key',JSON.stringify(value))// Lưu vĩnh viễnlocalStorage.getItem('key')// Lấy (string)JSON.parse(localStorage.getItem('key'))// Lấy objectlocalStorage.removeItem('key')// XoálocalStorage.clear()// Xoá tất cả// sessionStorage: tương tự nhưng chỉ tồn tại trong phiên trình duyệt
ES6+ Shorthand
// Destructuringconst{name,age=0}=personconst[first,...rest]=array// Spreadconstmerged={...obj1,...obj2}constcopy=[...arr1,...arr2]// Template literalconstmsg=`Xin chào ${name}, bạn ${age} tuổi`// Arrow functionconstdouble=x=>x*2constadd=(a,b)=>a+b// Optional chainingconstcity=user?.address?.city// undefined nếu thiếu// Nullish coalescingconstname=user.name??'Ẩn danh'// 'Ẩn danh' nếu null/undefined// Array methodsarr.map(x=>x*2)// Biến đổi từng phần tử → mảng mớiarr.filter(x=>x>0)// Lọc → mảng mớiarr.reduce((sum,x)=>sum+x,0)// Gộp thành một giá trịarr.find(x=>x.id===1)// Phần tử đầu tiên khớparr.findIndex(x=>x.id===1)// Index phần tử đầu tiên khớparr.some(x=>x>0)// true nếu có ít nhất 1 khớparr.every(x=>x>0)// true nếu tất cả khớparr.includes(value)// true nếu có chứa valuearr.flat()// Làm phẳng 1 cấparr.flatMap(fn)// map() + flat(1)
Playground thử nhanh
Kết quả
<divclass="demo"><h2>Playground thử nhanh</h2><p>Chỉnh sửa HTML, CSS và JS rồi xem kết quả ngay bên phải.</p><divclass="card-row"><divclass="card">🎨 HTML</div><divclass="card">💅 CSS</div><divclass="card">⚡ JS</div></div><buttonid="btn">Click me (0)</button></div>
constbtn=document.getElementById('btn');letcount=0;btn.addEventListener('click',()=>{count++;btn.textContent=`Click me (${count})`;btn.classList.toggle('clicked',count%2===0);});
Bình luận