01
Chọn layout
Chọn loại bàn phím phù hợp với bàn phím bạn đang sử dụng.
/* =========================================
1. RESET & ROOT
========================================= */
:root {
–bg: #111615;
–bg-soft: #181d1c;
–bg-card: #1b201f;
–bg-card-hover: #222827;
–border: #303837;
–border-light: #3a4543;
–text: #e8e2da;
–text-muted: #9ba19e;
–text-dark: #737b78;
–primary: #df8958;
–primary-hover: #ee9d6d;
–primary-soft: rgba(223, 137, 88, 0.12);
–green: #76b69c;
–green-soft: rgba(70, 150, 115, 0.2);
–yellow: #dca95f;
–red: #d77979;
–blue: #8fa9cc;
–radius-sm: 10px;
–radius-md: 16px;
–radius-lg: 22px;
–container: 1280px;
–transition: all 0.2s ease;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
}
body {
background: var(–bg);
color: var(–text);
font-family:
Inter,
-apple-system,
BlinkMacSystemFont,
“Segoe UI”,
Roboto,
Arial,
sans-serif;
font-size: 15px;
line-height: 1.6;
}
button,
input,
select {
font: inherit;
}
button {
cursor: pointer;
}
a {
color: inherit;
text-decoration: none;
}
.container {
width: min(
calc(100% – 40px),
var(–container)
);
margin: 0 auto;
}
/* =========================================
2. HEADER
========================================= */
.site-header {
border-bottom: 1px solid var(–border);
background: rgba(17, 22, 21, 0.9);
backdrop-filter: blur(12px);
}
.site-header .container {
min-height: 72px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 30px;
}
.logo {
font-size: 20px;
font-weight: 800;
letter-spacing: -0.5px;
}
.main-menu {
display: flex;
align-items: center;
gap: 28px;
}
.main-menu a {
color: var(–text-muted);
font-size: 14px;
transition: var(–transition);
}
.main-menu a:hover {
color: var(–primary);
}
/* =========================================
3. HERO
========================================= */
.hero {
padding: 36px 0 18px;
}
.hero-inner {
display: grid;
grid-template-columns: auto minmax(280px, 1fr) auto auto;
align-items: center;
gap: 36px;
padding: 28px 32px;
background:
linear-gradient(
100deg,
rgba(223, 137, 88, 0.16),
rgba(29, 35, 34, 0.9) 35%,
rgba(223, 137, 88, 0.13)
);
border: 1px solid var(–border);
border-radius: var(–radius-lg);
}
.hero-icon {
width: 76px;
height: 76px;
display: flex;
align-items: center;
justify-content: center;
font-size: 38px;
border: 1px solid #515a57;
border-radius: 22px;
background:
linear-gradient(
145deg,
#2a2f2e,
#1a1f1e
);
}
.hero-content {
min-width: 0;
}
.hero-badge {
display: inline-flex;
padding: 4px 12px;
margin-bottom: 8px;
border-radius: 999px;
background: rgba(223, 137, 88, 0.1);
color: var(–primary);
font-size: 12px;
font-weight: 800;
letter-spacing: 0.5px;
}
.hero h1 {
font-size: clamp(25px, 3vw, 34px);
line-height: 1.2;
letter-spacing: -0.8px;
margin-bottom: 4px;
}
.hero p {
max-width: 550px;
color: var(–text-muted);
font-size: 14px;
}
.hero-stats {
display: flex;
align-items: center;
gap: 34px;
}
.hero-stat {
display: flex;
flex-direction: column;
gap: 2px;
white-space: nowrap;
}
.hero-stat strong {
font-size: 17px;
font-weight: 800;
}
.hero-stat span {
color: var(–text-muted);
font-size: 12px;
}
.hero-button,
.cta-button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 52px;
padding: 0 26px;
border-radius: 14px;
background:
linear-gradient(
135deg,
var(–primary),
#efa875
);
color: #fff7f0;
font-weight: 800;
white-space: nowrap;
box-shadow:
0 10px 30px
rgba(223, 137, 88, 0.16);
transition: var(–transition);
}
.hero-button:hover,
.cta-button:hover {
transform: translateY(-2px);
background:
linear-gradient(
135deg,
var(–primary-hover),
#f3b17d
);
}
/* =========================================
4. KEYBOARD TESTER
========================================= */
.keyboard-tester {
padding: 0 0 70px;
}
.test-summary,
.keyboard-panel,
.tested-keys-section {
background: var(–bg-soft);
border: 1px solid var(–border);
border-radius: var(–radius-lg);
}
/* =========================================
5. TEST SUMMARY
========================================= */
.test-summary {
padding: 16px;
margin-bottom: 12px;
}
.section-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 30px;
padding-bottom: 16px;
margin-bottom: 16px;
border-bottom: 1px solid var(–border);
}
.section-heading h2 {
font-size: 15px;
text-transform: uppercase;
letter-spacing: 0.4px;
}
.section-heading p {
margin-top: 2px;
color: var(–text-muted);
font-size: 13px;
}
.reset-button,
.sound-toggle,
.expand-button {
min-height: 46px;
padding: 0 18px;
border: 1px solid var(–border-light);
border-radius: 14px;
background:
linear-gradient(
180deg,
#252b2a,
#1c2221
);
color: var(–text);
font-weight: 700;
transition: var(–transition);
}
.reset-button:hover,
.sound-toggle:hover,
.expand-button:hover {
border-color: var(–primary);
color: var(–primary);
}
.test-stats {
display: grid;
grid-template-columns:
minmax(220px, 1.35fr)
repeat(5, minmax(120px, 1fr));
gap: 10px;
}
.stat-card {
min-height: 86px;
padding: 15px 14px;
display: flex;
flex-direction: column;
justify-content: space-between;
border: 1px solid var(–border);
border-radius: var(–radius-md);
background:
linear-gradient(
145deg,
#1d2221,
#181d1c
);
}
.stat-label {
color: #b9bfbc;
font-size: 13px;
font-weight: 700;
}
.stat-number {
font-size: 25px;
line-height: 1;
font-weight: 800;
color: var(–green);
}
.progress-card {
justify-content: flex-start;
}
.stat-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
font-size: 14px;
}
.stat-header strong {
font-weight: 800;
}
#progressPercent {
color: var(–primary);
font-weight: 800;
}
.progress-bar {
width: 100%;
height: 8px;
overflow: hidden;
border-radius: 999px;
background: #353d3b;
}
.progress-value {
width: 0%;
height: 100%;
border-radius: inherit;
background:
linear-gradient(
90deg,
var(–primary),
#efad79
);
transition: width 0.25s ease;
}
.test-status {
margin-top: 14px;
padding: 10px 16px;
min-height: 42px;
display: flex;
align-items: center;
justify-content: center;
border: 1px dashed #3b4543;
border-radius: 12px;
color: var(–text-muted);
font-size: 13px;
}
/* =========================================
6. KEYBOARD PANEL
========================================= */
.keyboard-panel {
padding: 16px;
overflow: hidden;
}
.keyboard-controls {
display: flex;
align-items: center;
gap: 12px;
padding-bottom: 14px;
}
.layout-selector {
display: flex;
align-items: center;
gap: 14px;
}
.control-label {
color: var(–text-muted);
font-size: 11px;
font-weight: 800;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.layout-buttons {
display: flex;
gap: 5px;
padding: 5px;
border-radius: 16px;
background: #2b3230;
}
.layout-button {
min-width: 92px;
min-height: 36px;
padding: 0 15px;
border: 0;
border-radius: 10px;
background: transparent;
color: var(–text-muted);
font-size: 13px;
font-weight: 700;
transition: var(–transition);
}
.layout-button:hover {
color: var(–text);
}
.layout-button.active {
background: #1a201f;
color: var(–text);
box-shadow:
0 2px 8px
rgba(0, 0, 0, 0.25);
}
.sound-selector {
margin-left: auto;
display: flex;
align-items: center;
gap: 8px;
}
.sound-selector label {
color: var(–text-muted);
font-size: 12px;
font-weight: 700;
}
.sound-selector select {
min-width: 220px;
height: 44px;
padding: 0 14px;
outline: none;
border: 1px solid var(–border);
border-radius: 12px;
background: #1b201f;
color: var(–text);
font-weight: 700;
}
.sound-selector select:focus {
border-color: var(–primary);
}
/* =========================================
7. KEYBOARD WRAPPER
========================================= */
.keyboard-wrapper {
overflow-x: auto;
padding: 12px 0 0;
}
.keyboard {
min-width: 980px;
padding: 16px;
border-top: 1px solid rgba(255, 255, 255, 0.03);
background:
linear-gradient(
180deg,
#242a28,
#1c2220
);
}
.keyboard-row {
display: flex;
align-items: center;
gap: 5px;
margin-bottom: 5px;
}
.keyboard-row:last-child {
margin-bottom: 0;
}
.keyboard-row-function {
margin-bottom: 10px;
}
/* =========================================
8. KEY STYLE
========================================= */
.key {
width: 54px;
height: 48px;
flex: 0 0 auto;
display: flex;
align-items: center;
justify-content: center;
padding: 5px;
border: 1px solid #3a4441;
border-radius: 11px;
background:
linear-gradient(
145deg,
#232a28,
#1a201e
);
color: #dedbd4;
font-size: 13px;
font-weight: 700;
box-shadow:
inset 0 1px 0
rgba(255, 255, 255, 0.025);
transition:
background 0.12s ease,
border-color 0.12s ease,
transform 0.08s ease,
box-shadow 0.12s ease;
}
.key:hover {
border-color: #596562;
}
.key:active,
.key.is-pressed {
transform: translateY(2px);
border-color: var(–primary);
background:
linear-gradient(
145deg,
#d88152,
#bb6740
);
color: #fff;
}
.key.is-tested {
border-color: #43806b;
background:
linear-gradient(
145deg,
#24473b,
#1d362e
);
color: #9dd4bd;
}
.key.is-tested.is-pressed {
border-color: var(–primary);
background:
linear-gradient(
145deg,
#df8958,
#c87346
);
color: #fff;
}
/* KEY SIZES */
.key-backspace {
width: 120px;
}
.key-tab {
width: 82px;
}
.key-slash {
width: 78px;
}
.key-caps {
width: 100px;
}
.key-enter {
width: 112px;
}
.key-shift {
width: 132px;
}
.key-ctrl {
width: 70px;
}
.key-win {
width: 70px;
}
.key-alt {
width: 70px;
}
.key-space {
width: 340px;
}
.key-spacer {
width: 22px;
flex: 0 0 22px;
}
.key-spacer.small {
width: 10px;
flex-basis: 10px;
}
/* =========================================
9. TESTED KEYS
========================================= */
.tested-keys-section {
margin-top: 12px;
padding: 22px;
}
.tested-keys-section h2 {
margin-bottom: 14px;
font-size: 17px;
}
.tested-keys {
min-height: 50px;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
color: var(–text-muted);
font-size: 13px;
}
.tested-key {
display: inline-flex;
align-items: center;
padding: 6px 11px;
border: 1px solid #3e6759;
border-radius: 8px;
background: var(–green-soft);
color: #9cd4bb;
font-weight: 700;
}
/* =========================================
10. SECTION COMMON
========================================= */
.how-to-use,
.features,
.faq,
.bottom-cta {
padding: 80px 0;
}
.section-title {
max-width: 720px;
margin: 0 auto 42px;
text-align: center;
}
.section-title > span {
display: inline-block;
margin-bottom: 10px;
color: var(–primary);
font-size: 12px;
font-weight: 800;
text-transform: uppercase;
letter-spacing: 1px;
}
.section-title h2 {
font-size: clamp(26px, 4vw, 38px);
line-height: 1.25;
letter-spacing: -0.8px;
}
/* =========================================
11. HOW TO USE
========================================= */
.how-to-use {
background: #151a19;
border-top: 1px solid var(–border);
border-bottom: 1px solid var(–border);
}
.steps {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 18px;
}
.step {
padding: 28px;
background: var(–bg-soft);
border: 1px solid var(–border);
border-radius: var(–radius-lg);
}
.step-number {
display: inline-flex;
align-items: center;
justify-content: center;
width: 46px;
height: 46px;
margin-bottom: 22px;
border-radius: 12px;
background: var(–primary-soft);
color: var(–primary);
font-size: 14px;
font-weight: 900;
}
.step h3 {
margin-bottom: 8px;
font-size: 19px;
}
.step p {
color: var(–text-muted);
}
/* =========================================
12. FEATURES
========================================= */
.feature-list {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
}
.feature-item {
padding: 24px;
border: 1px solid var(–border);
border-radius: var(–radius-lg);
background:
linear-gradient(
145deg,
#1c2220,
#171c1b
);
transition: var(–transition);
}
.feature-item:hover {
transform: translateY(-4px);
border-color: #4a5652;
}
.feature-icon {
width: 50px;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
border-radius: 14px;
background: var(–primary-soft);
font-size: 24px;
}
.feature-item h3 {
margin-bottom: 8px;
font-size: 17px;
}
.feature-item p {
color: var(–text-muted);
font-size: 14px;
}
/* =========================================
13. FAQ
========================================= */
.faq {
background: #151a19;
border-top: 1px solid var(–border);
}
.faq-list {
max-width: 900px;
margin: 0 auto;
}
.faq-item {
margin-bottom: 10px;
border: 1px solid var(–border);
border-radius: 14px;
background: var(–bg-soft);
overflow: hidden;
}
.faq-item summary {
position: relative;
padding: 20px 52px 20px 20px;
cursor: pointer;
list-style: none;
font-weight: 700;
}
.faq-item summary::-webkit-details-marker {
display: none;
}
.faq-item summary::after {
content: “+”;
position: absolute;
top: 50%;
right: 20px;
transform: translateY(-50%);
color: var(–primary);
font-size: 24px;
font-weight: 400;
}
.faq-item[open] summary::after {
content: “−”;
}
.faq-item p {
padding:
0
20px
20px;
color: var(–text-muted);
}
/* =========================================
14. CTA
========================================= */
.bottom-cta {
padding: 70px 0;
}
.cta-content {
padding: 60px 30px;
text-align: center;
border: 1px solid var(–border);
border-radius: 28px;
background:
radial-gradient(
circle at top center,
rgba(223, 137, 88, 0.18),
transparent 45%
),
linear-gradient(
145deg,
#202624,
#171c1b
);
}
.cta-content h2 {
margin-bottom: 10px;
font-size: clamp(28px, 4vw, 42px);
line-height: 1.2;
}
.cta-content p {
max-width: 600px;
margin:
0 auto
28px;
color: var(–text-muted);
}
.cta-button {
min-height: 54px;
}
/* =========================================
15. FOOTER
========================================= */
.site-footer {
padding: 50px 0 24px;
border-top: 1px solid var(–border);
background: #0d1110;
}
.footer-logo {
margin-bottom: 6px;
font-size: 20px;
font-weight: 900;
}
.site-footer > .container > p {
color: var(–text-muted);
font-size: 14px;
}
.footer-bottom {
margin-top: 36px;
padding-top: 20px;
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1px solid #252c2a;
color: var(–text-dark);
font-size: 13px;
}
.footer-bottom nav {
display: flex;
gap: 22px;
}
.footer-bottom a {
transition: var(–transition);
}
.footer-bottom a:hover {
color: var(–primary);
}
/* =========================================
16. SCROLLBAR
========================================= */
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-track {
background: #111615;
}
::-webkit-scrollbar-thumb {
border: 2px solid #111615;
border-radius: 999px;
background: #3a4542;
}
::-webkit-scrollbar-thumb:hover {
background: #4a5753;
}
/* =========================================
17. RESPONSIVE – TABLET
========================================= */
@media (max-width: 1100px) {
.hero-inner {
grid-template-columns: auto 1fr;
}
.hero-stats {
grid-column: 2;
}
.hero-button {
grid-column: 1 / -1;
}
.test-stats {
grid-template-columns:
repeat(3, 1fr);
}
.progress-card {
grid-column: span 3;
}
.keyboard-controls {
flex-wrap: wrap;
}
.sound-selector {
margin-left: 0;
}
.feature-list {
grid-template-columns:
repeat(2, 1fr);
}
}
/* =========================================
18. RESPONSIVE – MOBILE
========================================= */
@media (max-width: 768px) {
.container {
width: min(
calc(100% – 28px),
var(–container)
);
}
.site-header .container {
min-height: 62px;
}
.main-menu {
display: none;
}
.hero {
padding-top: 18px;
}
.hero-inner {
grid-template-columns: 1fr;
gap: 20px;
padding: 24px;
}
.hero-icon {
width: 64px;
height: 64px;
}
.hero-stats {
grid-column: auto;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
.hero-stat strong {
font-size: 15px;
}
.hero-stat span {
font-size: 11px;
}
.hero-button {
grid-column: auto;
width: 100%;
}
.section-heading {
align-items: flex-start;
flex-direction: column;
}
.reset-button {
width: 100%;
}
.test-stats {
grid-template-columns:
repeat(2, 1fr);
}
.progress-card {
grid-column: span 2;
}
.keyboard-panel {
padding: 12px;
}
.keyboard-controls {
align-items: stretch;
flex-direction: column;
}
.layout-selector {
align-items: flex-start;
flex-direction: column;
}
.layout-buttons {
width: 100%;
}
.layout-button {
flex: 1;
min-width: 0;
}
.sound-selector {
width: 100%;
align-items: stretch;
flex-direction: column;
}
.sound-selector select {
width: 100%;
}
.sound-toggle,
.expand-button {
width: 100%;
}
.steps {
grid-template-columns: 1fr;
}
.feature-list {
grid-template-columns: 1fr;
}
.how-to-use,
.features,
.faq,
.bottom-cta {
padding: 55px 0;
}
.footer-bottom {
align-items: flex-start;
flex-direction: column;
gap: 16px;
}
.footer-bottom nav {
flex-wrap: wrap;
gap: 12px 20px;
}
}
/* =========================================
19. RESPONSIVE – SMALL MOBILE
========================================= */
@media (max-width: 480px) {
.hero-stats {
grid-template-columns: 1fr;
}
.test-stats {
grid-template-columns: 1fr;
}
.progress-card {
grid-column: auto;
}
.stat-card {
min-height: 74px;
}
.cta-content {
padding: 42px 20px;
}
}
ĐỪNG ĐOÁN NỮA!
Gõ thử bàn phím ngay trên web, không cần cài đặt phần mềm.
Kiểm tra phản hồi của từng phím trực tiếp trên trình duyệt.
Tiến độ test và các lỗi phát hiện trong quá trình kiểm tra.
OK
0
Đang nhấn
0
Nghi lỗi
0
Kẹt phím
0
Loạn phím
0
Chọn layout
Hướng dẫn sử dụng
Chọn loại bàn phím phù hợp với bàn phím bạn đang sử dụng.
Nhấn lần lượt các phím trên bàn phím vật lý của bạn.
Theo dõi các phím đã được ghi nhận trực tiếp trên màn hình.
Keyboard Tester
Phím được hiển thị ngay khi người dùng thao tác.
Có thể bật hoặc tắt âm thanh phản hồi khi nhấn phím.
Hỗ trợ Fullsize, TKL và layout bàn phím 60%.
Sử dụng trực tiếp trên trình duyệt mà không cần phần mềm.
Câu hỏi thường gặp
Đây là công cụ giúp ghi nhận các phím được nhấn trực tiếp trên trình duyệt.
Không. Công cụ hoạt động trực tiếp trên trình duyệt web.
Có. Công cụ có thể ghi nhận các sự kiện bàn phím được trình duyệt hỗ trợ.
Bắt đầu gõ và theo dõi các phím được ghi nhận ngay trên màn hình.