XOOPS 主題的 CSS 最佳實踐
本指南涵蓋 XOOPS 主題開發的 CSS 組織、現代佈局技巧和效能最佳化。
CSS 架構
Section titled “CSS 架構”themes/mytheme/css/├── style.css # Main stylesheet (imports others)├── base/│ ├── _reset.css # CSS reset/normalize│ ├── _typography.css # Font styles│ └── _variables.css # CSS custom properties├── components/│ ├── _blocks.css # Block styling│ ├── _buttons.css # Button styles│ ├── _forms.css # Form elements│ └── _navigation.css # Nav menus├── layout/│ ├── _header.css # Site header│ ├── _footer.css # Site footer│ ├── _sidebar.css # Sidebars│ └── _grid.css # Grid system└── modules/ # Module-specific overrides ├── _news.css └── _publisher.css@import 'base/_variables.css';@import 'base/_reset.css';@import 'base/_typography.css';
@import 'layout/_grid.css';@import 'layout/_header.css';@import 'layout/_footer.css';@import 'layout/_sidebar.css';
@import 'components/_blocks.css';@import 'components/_buttons.css';@import 'components/_forms.css';@import 'components/_navigation.css';
@import 'modules/_news.css';@import 'modules/_publisher.css';CSS 自訂屬性
Section titled “CSS 自訂屬性”:root { /* Colors */ --color-primary: #3498db; --color-primary-dark: #2980b9; --color-secondary: #2c3e50; --color-accent: #e74c3c;
--color-text: #333; --color-text-light: #666; --color-text-muted: #999;
--color-bg: #fff; --color-bg-alt: #f5f5f5; --color-border: #ddd;
/* Typography */ --font-family: system-ui, -apple-system, sans-serif; --font-family-heading: var(--font-family); --font-size-base: 16px; --line-height: 1.6;
/* Spacing */ --spacing-xs: 0.25rem; --spacing-sm: 0.5rem; --spacing-md: 1rem; --spacing-lg: 1.5rem; --spacing-xl: 2rem;
/* Layout */ --max-width: 1200px; --sidebar-width: 250px; --header-height: 60px;
/* Borders */ --border-radius: 4px; --border-width: 1px;
/* Shadows */ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.1); --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
/* Transitions */ --transition-fast: 150ms ease; --transition-normal: 300ms ease;}@media (prefers-color-scheme: dark) { :root { --color-text: #e0e0e0; --color-text-light: #b0b0b0; --color-bg: #1a1a1a; --color-bg-alt: #2d2d2d; --color-border: #444; }}
/* Manual toggle */[data-theme="dark"] { --color-text: #e0e0e0; --color-bg: #1a1a1a;}頁面佈局的 CSS Grid
Section titled “頁面佈局的 CSS Grid”.page-container { display: grid; grid-template-columns: var(--sidebar-width) 1fr var(--sidebar-width); grid-template-areas: "header header header" "left main right" "footer footer footer"; gap: var(--spacing-lg); max-width: var(--max-width); margin: 0 auto; padding: var(--spacing-md);}
.site-header { grid-area: header; }.sidebar-left { grid-area: left; }.content-main { grid-area: main; }.sidebar-right { grid-area: right; }.site-footer { grid-area: footer; }
/* No left sidebar */.no-left-sidebar .page-container { grid-template-columns: 1fr var(--sidebar-width); grid-template-areas: "header header" "main right" "footer footer";}
/* No sidebars */.no-sidebars .page-container { grid-template-columns: 1fr; grid-template-areas: "header" "main" "footer";}元件的 Flexbox
Section titled “元件的 Flexbox”.block-header { display: flex; align-items: center; justify-content: space-between; gap: var(--spacing-sm);}
.nav-menu { display: flex; flex-wrap: wrap; gap: var(--spacing-md); list-style: none; padding: 0;}行動優先斷點
Section titled “行動優先斷點”/* Mobile first - base styles */.page-container { display: block; padding: var(--spacing-sm);}
/* Tablet */@media (min-width: 768px) { .page-container { display: grid; grid-template-columns: var(--sidebar-width) 1fr; gap: var(--spacing-md); }}
/* Desktop */@media (min-width: 1024px) { .page-container { grid-template-columns: var(--sidebar-width) 1fr var(--sidebar-width); gap: var(--spacing-lg); }}/* Modern container queries */.block { container-type: inline-size;}
@container (min-width: 300px) { .block-content { display: grid; grid-template-columns: repeat(2, 1fr); }}.block { background: var(--color-bg); border: var(--border-width) solid var(--color-border); border-radius: var(--border-radius); margin-bottom: var(--spacing-md); overflow: hidden;}
.block-title { background: var(--color-bg-alt); padding: var(--spacing-sm) var(--spacing-md); margin: 0; font-size: 1rem; font-weight: 600; border-bottom: var(--border-width) solid var(--color-border);}
.block-content { padding: var(--spacing-md);}
.block-content ul { list-style: none; padding: 0; margin: 0;}
.block-content li { padding: var(--spacing-sm) 0; border-bottom: var(--border-width) solid var(--color-border);}
.block-content li:last-child { border-bottom: none;}關鍵 CSS
Section titled “關鍵 CSS”<head> <!-- Inline critical CSS --> <style> /* Above-the-fold styles */ body { font-family: system-ui; margin: 0; } .header { background: #fff; height: 60px; } </style>
<!-- Load full CSS async --> <link rel="preload" href="style.css" as="style" onload="this.rel='stylesheet'"> <noscript><link rel="stylesheet" href="style.css"></noscript></head>- 最小化特異性 - 避免深度嵌套
- 使用現代屬性 - 使用
gap代替邊界 - 減少重新繪製 - 使用
transform進行動畫 - 延遲載入 - 僅在需要時載入模組 CSS
/* Good - low specificity */.block-title { }
/* Avoid - high specificity */.sidebar .block .block-header .block-title { }- Theme-Structure - 主題檔案組織
- Theme-Development - 完整主題指南
- ../Templates/Smarty-Templating - 範本整合
- ../../03-Module-Development/Block-Development - 區塊樣式