HTML
HTML
DOCTYPE html>
<html lang="vi" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-
scale=1.0">
<title>Portfolio | Trần Trọng Thế Anh</title>
======================================
=================== */
:root[data-theme="dark"] {
--bg-color: #030305;
--nav-bg: rgba(3, 3, 5, 0.4);
--surface-color: rgba(20, 20, 25, 0.6);
--text-primary: #ffffff;
--text-secondary: #888888;
--accent-color: #2997ff;
--accent-glow: rgba(41, 151, 255, 0.5);
--border-color: rgba(255, 255, 255, 0.08);
--modal-bg: rgba(15, 15, 20, 0.95);
--orb-1: #2997ff;
--orb-2: #bf55ff;
--orb-3: #00ffcc;
}
:root[data-theme="light"] {
--bg-color: #f5f5f7;
--nav-bg: rgba(245, 245, 247, 0.5);
--surface-color: rgba(255, 255, 255, 0.7);
--text-primary: #1d1d1f;
--text-secondary: #86868b;
--accent-color: #0066cc;
--accent-glow: rgba(0, 102, 204, 0.3);
--border-color: rgba(0, 0, 0, 0.08);
--modal-bg: rgba(255, 255, 255, 0.95);
--orb-1: #80c0ff;
--orb-2: #e0a6ff;
--orb-3: #a6ffe0;
}
/*
======================================
===================
2. MÀN HÌNH NẠP ĐIỆN ẢNH (PRELOADER)
======================================
=================== */
.preloader {
position: fixed; top: 0; left: 0; width: 100vw; height: 100vh;
background: var(--bg-color); z-index: 99999; display: flex;
flex-direction: column;
justify-content: flex-end; padding: 5vw;
}
.preloader-content { display: flex; justify-content: space-
between; align-items: flex-end; border-bottom: 1px solid var(--
border-color); padding-bottom: 20px;}
.preloader-title { font-size: 16px; font-weight: 500; color: var(--
text-secondary); text-transform: uppercase; letter-spacing:
2px;}
.preloader-counter { font-size: 8vw; font-weight: 700; line-
height: 0.8; font-family: 'JetBrains Mono', monospace; color:
var(--text-primary);}
.preloader-progress-bar { width: 100%; height: 2px;
background: rgba(255,255,255,0.1); margin-top: 2px; }
.preloader-progress { width: 0%; height: 100%; background:
var(--accent-color); box-shadow: 0 0 20px var(--accent-glow); }
/*
======================================
===================
3. NAVBAR TỪ TÍNH
======================================
=================== */
nav {
position: fixed; top: 0; left: 0; width: 100%; height: 80px;
background: var(--nav-bg);
backdrop-filter: blur(24px) saturate(180%); -webkit-
backdrop-filter: blur(24px) saturate(180%);
border-bottom: 1px solid var(--border-color); z-index: 5000;
display: flex; align-items: center; justify-content: space-
between; padding: 0 5%;
transform: translateY(-100%); /* Ẩn đi chờ Preloader chạy
xong */
}
.logo { font-size: 24px; font-weight: 700; letter-spacing: -1px;
background: linear-gradient(90deg, #fff, var(--accent-color)); -
webkit-background-clip: text; color: transparent; }
:root[data-theme="light"] .logo { background: linear-
gradient(90deg, #000, var(--accent-color)); -webkit-
background-clip: text; }
.theme-btn {
background: rgba(255,255,255,0.05); border: 1px solid var(--
border-color); color: var(--text-primary);
width: 45px; height: 45px; border-radius: 50%; font-size:
18px; cursor: pointer; display: flex; justify-content: center;
align-items: center;
backdrop-filter: blur(10px);
}
/*
======================================
===================
4. HERO SECTION
======================================
=================== */
.hero-section { height: 100vh; display: flex; justify-content:
center; align-items: center; overflow: hidden; perspective:
1000px; }
.hero-image {
width: 100%; height: 100%;
background: linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.6)),
url('[Link]
a83a8bd57fbe?q=80&w=2564&auto=format&fit=crop')
center/cover no-repeat;
display: flex; flex-direction: column; justify-content: center;
align-items: center; text-align: center; padding: 0 20px;
}
.hero-title { font-size: 6vw; font-weight: 700; color: white;
letter-spacing: -2px; line-height: 1.1; margin-bottom: 24px; }
.hero-title span { background: linear-gradient(90deg, #fff, var(--
accent-color)); -webkit-background-clip: text; color: transparent;
}
.hero-subtitle { font-size: 1.4vw; color: rgba(255,255,255,0.8);
max-width: 800px; font-weight: 300; line-height: 1.6; }
/*
======================================
===================
5. TRANG GIỚI THIỆU
======================================
=================== */
.section-title { font-size: 46px; font-weight: 700; margin-
bottom: 60px; text-align: center; letter-spacing: -1.5px; }
.intro-grid { display: grid; grid-template-columns: 1fr 1.4fr; gap:
60px; margin-bottom: 150px; align-items: center; }
.avatar-box { display: flex; flex-direction: column; align-items:
center; text-align: center; position: relative; }
.avatar-glow { width: 240px; height: 240px; border-radius: 50%;
object-fit: cover; border: 2px solid var(--border-color); box-
shadow: 0 20px 50px rgba(0,0,0,0.4); transition: transform 0.6s
cubic-bezier(0.34, 1.56, 0.64, 1); margin-bottom: 25px; }
.avatar-glow:hover { transform: scale(1.05) translateY(-10px);
border-color: var(--accent-color); }
.name-title { font-size: 28px; font-weight: 700; letter-spacing: -
0.5px; margin-bottom: 5px; color: var(--text-primary); }
.name-subtitle { color: var(--accent-color); font-weight: 500;
font-size: 16px; letter-spacing: 0.5px;}
/*
======================================
===================
6. THANH TIMELINE
======================================
=================== */
.timeline-section { margin-bottom: 150px; }
.timeline { position: relative; max-width: 900px; margin: 0 auto;
padding: 40px 0; }
.timeline::before { content: ''; position: absolute; left: 50%; top:
0; bottom: 0; width: 1px; background: linear-gradient(to
bottom, transparent, var(--border-color) 10%, var(--border-
color) 90%, transparent); transform: translateX(-50%); }
.timeline-item { position: relative; width: 50%; padding: 0 50px;
margin-bottom: 60px; }
.[Link] { left: 0; text-align: right; }
.[Link] { left: 50%; text-align: left; }
.timeline-dot { position: absolute; top: 25px; width: 14px;
height: 14px; border-radius: 50%; background: var(--bg-color);
border: 2px solid var(--accent-color); z-index: 5; box-shadow: 0
0 15px var(--accent-glow); transition: all 0.4s cubic-bezier(0.34,
1.56, 0.64, 1); }
.timeline-item:hover .timeline-dot { transform: scale(1.6);
background: var(--accent-color); box-shadow: 0 0 30px var(--
accent-glow); }
.[Link] .timeline-dot { right: -7px; }
.[Link] .timeline-dot { left: -7px; }
.timeline-content { background: var(--surface-color); border:
1px solid var(--border-color); padding: 35px; border-radius:
30px; backdrop-filter: blur(15px); transition: border-color 0.4s; }
.timeline-content:hover { border-color:
rgba(255,255,255,0.3); }
.timeline-content span { font-family: 'JetBrains Mono',
monospace; color: var(--accent-color); font-size: 13px; font-
weight: 600; text-transform: uppercase; }
.timeline-content h4 { font-size: 22px; margin: 12px 0 15px; }
.timeline-content p { color: var(--text-secondary); font-size:
16px; line-height: 1.6;}
/*
======================================
===================
7. BỘ LỌC & BENTO GRID VỚI PHẢN XẠ QUANG HỌC
======================================
=================== */
.filter-container { display: flex; justify-content: center; gap:
15px; margin-bottom: 40px; flex-wrap: wrap; }
.filter-btn {
background: var(--nav-bg); border: 1px solid var(--border-
color); color: var(--text-primary);
padding: 10px 24px; border-radius: 30px; font-size: 15px;
font-weight: 500; cursor: pointer;
backdrop-filter: blur(10px); transition: border-color 0.3s, color
0.3s;
}
.filter-btn:hover { border-color: var(--text-secondary); }
.[Link] { background: var(--accent-color); color: #fff;
border-color: var(--accent-color); box-shadow: 0 10px 20px
var(--accent-glow); }
/*
======================================
===================
8. GHIM TỔNG KẾT
======================================
=================== */
.sticky-wrapper { display: flex; align-items: flex-start; gap:
80px; padding: 120px 0; position: relative; }
.sticky-visual { width: 45%; height: 80vh; position: sticky; top:
10vh; border-radius: 40px; overflow: hidden; box-shadow: 0
40px 80px rgba(0,0,0,0.4); border: 1px solid var(--border-color);
}
.sticky-visual-inner { width: 100%; height: 130%; background:
url('[Link]
9bc0b252726f?q=80&w=2000&auto=format&fit=crop')
center/cover; position: absolute; top: -15%; left: 0; will-change:
transform; }
.sticky-content { width: 55%; padding: 40px 0; }
.sticky-text-block { height: 70vh; display: flex; flex-direction:
column; justify-content: center; opacity: 0.2; transition: opacity
0.5s ease, transform 0.5s ease; transform: translateX(30px); }
.[Link] { opacity: 1; transform: translateX(0); }
.sticky-text-block h3 { font-size: 34px; color: var(--text-
primary); margin-bottom: 20px; display: flex; align-items:
center; gap: 15px; letter-spacing: -1px; }
.sticky-text-block h3 i { color: var(--accent-color); }
.sticky-text-block p { font-size: 19px; color: var(--text-
secondary); line-height: 1.8; }
/*
======================================
===================
9. POPUP & BACK TO TOP
======================================
=================== */
.pdf-modal { position: fixed; top: 0; left: 0; width: 100vw;
height: 100vh; background: rgba(0, 0, 0, 0.8); backdrop-filter:
blur(25px); -webkit-backdrop-filter: blur(25px); z-index: 20000;
display: none; justify-content: center; align-items: center; }
.modal-container { width: 90%; max-width: 1100px; height:
88vh; background: var(--modal-bg); border-radius: 30px;
overflow: hidden; border: 1px solid var(--border-color); position:
relative; box-shadow: 0 50px 100px rgba(0, 0, 0, 0.6); display:
flex; flex-direction: column; }
.modal-header { padding: 20px 30px; display: flex; justify-
content: space-between; align-items: center; border-bottom:
1px solid var(--border-color); background:
rgba(255,255,255,0.02); }
.modal-title { font-weight: 600; font-size: 18px; letter-spacing: -
0.5px; color: var(--text-primary); }
.modal-actions { display: flex; align-items: center; gap: 20px; }
.fallback-btn { background: var(--accent-color); color: #fff;
padding: 10px 24px; border-radius: 30px; font-size: 14px; font-
weight: 600; text-decoration: none; display: flex; align-items:
center; gap: 8px; transition: transform 0.3s, box-shadow 0.3s; }
.fallback-btn:hover { transform: scale(1.05); box-shadow: 0
10px 20px var(--accent-glow); }
.close-btn { background: transparent; border: none; color: var(--
text-secondary); font-size: 28px; cursor: pointer; transition:
color 0.3s, transform 0.4s; }
.close-btn:hover { color: #ff453a; transform: rotate(90deg)
scale(1.2); }
.pdf-iframe { width: 100%; flex-grow: 1; border: none;
background: #fff; }
/* RESPONSIVE */
@media (max-width: 900px) {
.intro-grid, .sticky-wrapper { flex-direction: column; gap:
40px; }
.sticky-visual { width: 100%; position: relative; top: 0; height:
50vh; }
.sticky-content { width: 100%; }
.sticky-text-block { height: auto; margin-bottom: 60px;
opacity: 1; transform: none;}
.bento-grid { grid-template-columns: 1fr; grid-auto-rows:
auto; }
.item-large, .item-wide, .item-square { grid-column: span 1;
grid-row: auto; min-height: 280px; }
.hero-title { font-size: 40px; }
.hero-subtitle { font-size: 18px; }
.reveal-text { font-size: 28px; }
.timeline::before { left: 20px; }
.timeline-item { width: 100%; padding-left: 60px; padding-
right: 0; margin-bottom: 50px;}
.[Link], .[Link] { left: 0; text-align:
left; }
.[Link] .timeline-dot, .timeline-
[Link] .timeline-dot { left: 14px; right: auto; }
.back-to-top { bottom: 20px; right: 20px; width: 45px;
height: 45px; }
.fallback-btn span { display: none; }
.preloader-counter { font-size: 15vw; }
}
</style>
</head>
<body>
<div class="preloader">
<div class="preloader-content">
<div class="preloader-title">Thiết lập Không gian Kỹ thuật
số...</div>
<div class="preloader-counter">0%</div>
</div>
<div class="preloader-progress-bar">
<div class="preloader-progress"></div>
</div>
</div>
<div class="noise-bg"></div>
<div class="ambient-orbs">
<div class="orb orb-1"></div>
<div class="orb orb-2"></div>
<div class="orb orb-3"></div>
</div>
<div class="scroll-progress" id="scrollProgress"></div>
<div id="particles-js"></div>
<nav id="navbar">
<div class="logo">MyPortfolio.</div>
<button class="theme-btn magnetic" id="themeToggle"><i
class="fa-solid fa-moon"></i></button>
</nav>
<section class="hero-section">
<div class="hero-image">
<h1 class="hero-title">Nơi Lưu Trữ <span>Sáng
Tạo</span><br>& Tinh Hoa Kỹ Năng</h1>
<p class="hero-subtitle text-stagger">Trang web này ghi
lại toàn bộ hành trình trải nghiệm, những kiến thức số đã tích
lũy và các dự án thực tế tôi đã triển khai.</p>
</div>
</section>
<section class="marquee-section">
<div class="marquee-content">
<span>Sư phạm Vật lí</span> <span>Tích hợp Giáo dục
STEM</span> <span>Prompt Engineering (CLEAR)</span>
<span>Tư duy Hệ thống</span> <span>Quản trị Dự
án</span> <span>Sáng tạo Nội dung Số</span>
<span>Sư phạm Vật lí</span> <span>Tích hợp Giáo dục
STEM</span> <span>Prompt Engineering (CLEAR)</span>
<span>Tư duy Hệ thống</span> <span>Quản trị Dự
án</span> <span>Sáng tạo Nội dung Số</span>
</div>
</section>
<section class="container">
<h2 class="section-title">Trang Giới Thiệu</h2>
<div class="intro-grid">
<div class="avatar-box">
<img src="Ảnh đại diệ[Link]" alt="Trần Trọng Thế Anh"
class="avatar-glow">
<div class="name-title">Trần Trọng Thế Anh</div>
<div class="name-subtitle">Sinh viên Sư phạm Vật
Lí</div>
</div>
<div class="intro-card">
<h3>Thông Tin Cá Nhân & Mục Tiêu</h3>
<ul>
<li><i class="fa-solid fa-id-card"></i>
<span><strong>Mã sinh viên:</strong>
25010045</span></li>
<li><i class="fa-solid fa-school"></i>
<span><strong>Trường:</strong> Đại học Giáo dục -
ĐHQGHN</span></li>
<li><i class="fa-solid fa-graduation-cap"></i>
<span><strong>Lớp:</strong> Sư phạm Vật Lí</span></li>
<li><i class="fa-solid fa-lightbulb"></i>
<span><strong>Mục tiêu:</strong> Đổi mới phương pháp
luận giáo dục Vật lí bằng công nghệ số và phương pháp
STEM.</span></li>
</ul>
<p>
Tập hồ sơ năng lực này được thiết kế theo cấu trúc
phi tuyến tính, ứng dụng giao diện vật lý học để phản ánh tư
duy logic. Tại đây, mọi dự án từ nghiên cứu chuyên môn đến
truyền thông đa phương tiện đều được lưu trữ trực quan và bảo
mật cao.
</p>
</div>
</div>
</section>
<div class="filter-container">
<button class="filter-btn magnetic active" data-
filter="all">Tất cả bài tập</button>
<button class="filter-btn magnetic" data-
filter="stem">Vật lí & Khai thác DL</button>
<button class="filter-btn magnetic" data-filter="ai">AI &
Kỹ năng số</button>
<button class="filter-btn magnetic" data-
filter="design">Sáng tạo & Đạo đức</button>
</div>
</div>
</section>
<section class="container">
<h2 class="section-title">Trang Tổng Kết</h2>
<div class="sticky-wrapper">
<div class="sticky-visual">
<div class="sticky-visual-inner"></div>
</div>
<div class="sticky-content">
<div class="sticky-text-block text-block-anim">
<h3><i class="fa-solid fa-satellite-dish"></i> Trải
nghiệm & Cảm nhận</h3>
<p>Quá trình xây dựng Portfolio này mang lại một
lăng kính mới để nhìn lại chặng đường học tập. Từ những ý
tưởng lý thuyết thô sơ đến các dự án có cấu trúc chặt chẽ, sự
tiến bộ này mang lại động lực to lớn.</p>
</div>
<div class="sticky-text-block text-block-anim">
<h3><i class="fa-solid fa-microchip"></i> Kiến thức
& Kỹ năng</h3>
<p>Tôi đã thuần thục việc điều phối công cụ số. Kỹ
năng thiết kế đồ họa, tổ chức dữ liệu phi cấu trúc và tư duy làm
việc nhóm trên nền tảng đám mây đã được định hình rõ
nét.</p>
</div>
<div class="sticky-text-block text-block-anim">
<h3><i class="fa-solid fa-atom"></i> Triết lý làm
việc</h3>
<p>Điều làm tôi tâm đắc nhất là sự giao thoa giữa tư
duy hệ thống của khoa học tự nhiên và tính linh hoạt của công
nghệ số. Nó tạo ra một phong cách làm việc chuyên nghiệp,
luôn hướng tới thực tiễn.</p>
</div>
</div>
</div>
</section>
<footer>
<p>© 2026 Portfolio of Trần Trọng Thế Anh - Sư phạm
Vật Lí. Thiết kế tối ưu cho trải nghiệm người dùng.</p>
</footer>
<script
src="[Link]
[Link]"></script>
<script
src="[Link]
[Link]"></script>
<script
src="[Link]
[Link]"></script>
<script
src="[Link]
[Link]"></script>
<script>
// 1. MÀN HÌNH NẠP ĐIỆN ẢNH (PRELOADER GIA TỐC)
let progress = { value: 0 };
[Link](progress, {
value: 100, duration: 2.5, ease: "[Link]",
onUpdate: () => {
[Link]('.preloader-counter').innerText =
[Link]([Link]) + '%';
[Link]('.preloader-progress').[Link]
= [Link] + '%';
},
onComplete: () => {
[Link](".preloader", { yPercent: -100, duration: 1.2, ease:
"[Link]", onComplete: () => {
[Link] = 'auto'; // Mở khóa cuộn
[Link](); // Trị dứt điểm lỗi lệch khung hình
khi tải xong
}});
// Gọi thanh Navbar rơi xuống
[Link]("#navbar", {y: 0, duration: 1, ease: "[Link]",
delay: 0.2});
// 3. HIỆU ỨNG TILT & PHẢN XẠ QUANG HỌC TRÊN THẺ BENTO
[Link]('.bento-item').forEach(item => {
[Link]('mousemove', e => {
if ([Link]('dimmed')) return;
const rect = [Link]();
const x = [Link] - [Link];
const y = [Link] - [Link];
[Link]('--mouse-x', `${x}px`);
[Link]('--mouse-y', `${y}px`);
[Link](btn => {
[Link]('click', () => {
[Link](b => [Link]('active'));
[Link]('active');
[Link](item => {
if (filterValue === 'all')
{ [Link]('dimmed'); }
else {
if ([Link]('data-
category').includes(filterValue))
{ [Link]('dimmed'); }
else { [Link]('dimmed'); }
}
});
});
});
particlesJS("particles-js", {
"particles": {
"number": { "value": 30, "density": { "enable": true,
"value_area": 1000 } },
"color": { "value": "#ffffff" }, "shape": { "type": "circle" },
"opacity": { "value": 0.2, "random": true }, "size":
{ "value": 2, "random": true },
"line_linked": { "enable": true, "distance": 180, "color":
"#ffffff", "opacity": 0.1, "width": 1 },
"move": { "enable": true, "speed": 1, "direction": "none",
"random": true, "out_mode": "out" }
}, "interactivity": { "events": { "onhover": { "enable": false }
} }, "retina_detect": true
});
// Nút Cuộn lên đầu trang
const backToTopBtn = [Link]('backToTop');
[Link]('scroll', () => {
const winScroll = [Link];
const height = [Link] -
[Link];
[Link]("scrollProgress").[Link] =
(winScroll / height) * 100 + "%";
function closePdfModal() {
[Link](".modal-container", { scale: 0.9, opacity: 0, y: 30,
duration: 0.4, ease: "[Link]", onComplete: () => {
[Link] = 'none';
[Link] = "";
}});
}
[Link]('click', (e) => { if ([Link] ===
pdfModal) closePdfModal(); });
</script>
</body>
</html>