Skip to content

Lỗi CSS thường gặp trong Svelte

Khi làm việc với Svelte, đặc biệt là trong các dự án phức tạp, bạn sẽ gặp phải nhiều vấn đề về CSS. Bài viết này tổng hợp các lỗi thường gặp và cách khắc phục dựa trên kinh nghiệm thực tế.

1. Menu bị nhỏ/teo do thiếu font-size

Section titled “1. Menu bị nhỏ/teo do thiếu font-size”
/* ❌ SAI - CSS global thiếu font-size */
.nav-link {
text-decoration: none;
color: var(--color-base-content);
/* Thiếu font-size! */
}

Svelte scoped CSS có thể override global CSS nếu specificity không đủ mạnh. Khi component con định nghĩa style riêng, nó có thể kế thừa giá trị nhỏ từ browser default.

/* ✅ ĐÚNG - Định nghĩa đầy đủ trong CSS global */
.nav-link {
text-decoration: none;
color: var(--color-base-content);
font-size: 1rem; /* ← Quan trọng! */
font-weight: 500;
transition: background 0.2s ease, color 0.2s ease;
}

2. Chữ bị “nhảy”/flicker khi hover

Section titled “2. Chữ bị “nhảy”/flicker khi hover”

Khi hover vào menu item, chữ bị giật/nhảy gây khó chịu.

/* ❌ SAI - Opacity change gây visual flicker */
.nav-link {
opacity: 0.7; /* Mặc định mờ */
}
.nav-link:hover {
opacity: 1; /* Hover sáng lên */
}

Thay đổi opacity khi hover làm thay đổi layout nhẹ, gây hiệu ứng giật lag.

/* ✅ ĐÚNG - Dùng color transition thay vì opacity */
.nav-link {
opacity: 1; /* Luôn giữ opacity = 1 */
color: var(--color-base-content);
transition: background 0.2s ease, color 0.2s ease;
}
.nav-link:hover {
color: var(--color-primary); /* Đổi màu thay vì opacity */
background: rgba(0, 0, 0, 0.05);
}

3. CSS Scoped không hoạt động như mong đợi

Section titled “3. CSS Scoped không hoạt động như mong đợi”

Style trong component Svelte ảnh hưởng đến các component khác.

<style>
/* ❌ SAI - Dùng :global() không cẩn thận */
:global(p) {
color: red;
}
</style>

:global() làm cho CSS apply cho toàn bộ page, không chỉ component.

<style>
/* ✅ ĐÚNG - Scope CSS trong component */
p {
color: red;
}
/* Chỉ dùng :global khi thực sự cần */
:global(body) {
background: #f0f0f0;
}
</style>

Component Svelte không thay đổi màu sắc khi switch dark mode.

<style>
/* ❌ SAI - Hard code màu */
.card {
background: white;
color: black;
}
</style>
<style>
/* ✅ ĐÚNG - Dùng CSS variables */
.card {
background: var(--color-base-100);
color: var(--color-base-content);
}
/* Hoặc dùng Starlight variables */
.card {
background: var(--sl-color-bg);
color: var(--sl-color-text);
}
</style>

5. Glassmorphism không hiển thị đúng

Section titled “5. Glassmorphism không hiển thị đúng”

Glass card có nền xám/sáng trong dark mode, làm chữ khó đọc.

/* ❌ SAI - Hard code rgba values */
.glass-card {
background: rgba(255, 255, 255, 0.7);
}
<style>
/* ✅ ĐÚNG - Dùng theme variables */
.glass-card {
background: var(--sl-color-bg-inline-code);
border: 1px solid var(--sl-color-border);
color: var(--sl-color-text);
}
/* Đảm bảo child elements cũng dùng đúng màu */
.glass-card :global(*) {
color: var(--sl-color-text);
}
</style>

6. Component trong MDX không hoạt động

Section titled “6. Component trong MDX không hoạt động”

Svelte component import vào MDX nhưng không tương tác được.

<!-- SAI - Thiếu client directive -->
import Counter from './Counter.svelte';
<Counter />
<!-- ĐÚNG - Thêm client:load -->
import Counter from './Counter.svelte';
<Counter client:load />

Lỗi 500 Internal Server Error khi build.

<!-- ❌ SAI - Dư dấu " ở cuối -->
<div class:dark={variant === 'dark'}"">
<!-- ✅ ĐÚNG - Syntax chuẩn -->
<div class:dark={variant === 'dark'}>
  • Định nghĩa font-size cho text elements trong global CSS
  • Không dùng opacity change khi hover (dùng color thay thế)
  • Dùng CSS variables thay vì hard code màu sắc
  • Thêm client:load cho Svelte components trong MDX
  • Test dark mode ở tất cả các trang
  • Kiểm tra responsive trên mobile
  • Không còn lỗi syntax trong terminal