Component UI là gì?
Component là đơn vị giao diện tái sử dụng — button, card, badge, alert, v.v. Xây dựng chúng từ đầu giúp bạn hiểu cách các thư viện UI như Bootstrap hoạt động.
Button Variants
<div class="demo" style="display:flex;flex-wrap:wrap;gap:0.75rem;padding:1rem;align-items:center">
<button class="btn btn-primary">Primary</button>
<button class="btn btn-secondary">Secondary</button>
<button class="btn btn-success">Success</button>
<button class="btn btn-danger">Danger</button>
<button class="btn btn-outline">Outline</button>
<button class="btn btn-ghost">Ghost</button>
<button class="btn btn-primary btn-sm">Nhỏ</button>
<button class="btn btn-primary btn-lg">Lớn</button>
<button class="btn btn-primary" disabled>Disabled</button>
<button class="btn btn-primary loading">⏳ Loading…</button>
</div>
.btn {
display: inline-flex;
align-items: center;
gap: 0.35rem;
padding: 0.5rem 1.1rem;
border: 2px solid transparent;
border-radius: 6px;
font-size: 0.9rem;
font-family: sans-serif;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
text-decoration: none;
white-space: nowrap;
}
.btn:hover { opacity: 0.88; transform: translateY(-1px); }
.btn:active { transform: translateY(0); }
.btn:disabled, .btn.loading { opacity: 0.55; pointer-events: none; }
.btn-primary { background: #4472c4; color: white; }
.btn-secondary { background: #6c757d; color: white; }
.btn-success { background: #2ecc71; color: white; }
.btn-danger { background: #e74c3c; color: white; }
.btn-outline { border-color: #4472c4; color: #4472c4; background: transparent; }
.btn-outline:hover { background: #4472c4; color: white; }
.btn-ghost { background: transparent; color: #555; }
.btn-ghost:hover { background: #f0f0f0; }
.btn-sm { padding: 0.3rem 0.75rem; font-size: 0.8rem; }
.btn-lg { padding: 0.7rem 1.5rem; font-size: 1rem; }
Card Component
<div style="display:flex;flex-wrap:wrap;gap:1rem;padding:1rem;background:#f3f4f6">
<div class="card">
<div class="card-img" style="background:linear-gradient(135deg,#4472c4,#6fa3ef)">
<span class="badge badge-new">Mới</span>
</div>
<div class="card-body">
<h3>Khoá học HTML & CSS</h3>
<p>Học xây dựng trang web từ cơ bản đến nâng cao.</p>
</div>
<div class="card-footer">
<span class="badge badge-free">Miễn phí</span>
<button class="btn btn-primary btn-sm">Bắt đầu →</button>
</div>
</div>
<div class="card">
<div class="card-img" style="background:linear-gradient(135deg,#ed7d31,#f5a623)">
<span class="badge badge-hot">🔥 Hot</span>
</div>
<div class="card-body">
<h3>JavaScript Nâng cao</h3>
<p>ES6+, DOM, Fetch API và các pattern hiện đại.</p>
</div>
<div class="card-footer">
<span class="price">299.000 ₫</span>
<button class="btn btn-success btn-sm">Mua ngay</button>
</div>
</div>
</div>
* { box-sizing: border-box; font-family: sans-serif; margin: 0; padding: 0; }
.card {
width: 220px;
background: white;
border-radius: 10px;
overflow: hidden;
box-shadow: 0 2px 12px rgba(0,0,0,.1);
transition: transform 0.25s, box-shadow 0.25s;
}
.card:hover { transform: translateY(-4px); box-shadow: 0 6px 20px rgba(0,0,0,.15); }
.card-img {
height: 110px;
position: relative;
display: flex;
align-items: flex-start;
justify-content: flex-end;
padding: 0.5rem;
}
.badge {
padding: 0.2rem 0.55rem;
border-radius: 12px;
font-size: 0.72rem;
font-weight: bold;
}
.badge-new { background: #2ecc71; color: white; }
.badge-hot { background: #e74c3c; color: white; }
.badge-free { background: #f0f0f0; color: #555; }
.card-body { padding: 0.85rem; }
.card-body h3 { font-size: 0.95rem; margin-bottom: 0.35rem; color: #222; }
.card-body p { font-size: 0.82rem; color: #666; line-height: 1.45; }
.card-footer {
padding: 0.6rem 0.85rem;
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1px solid #f0f0f0;
}
.price { font-weight: bold; color: #e74c3c; font-size: 0.9rem; }
.btn { display:inline-flex;align-items:center;padding:0.3rem 0.75rem;border:none;border-radius:6px;font-size:0.8rem;font-weight:500;cursor:pointer;transition:all 0.2s; }
.btn:hover { opacity: 0.88; }
.btn-primary { background:#4472c4;color:white; }
.btn-success { background:#2ecc71;color:white; }
.btn-sm {}
Bình luận