1. CSS code组织 and 命名规范
良 good code组织 and 命名规范 is writing可maintenance, 可scaleCSS Basics. 它们可以improvingcode readable 性, reducingconflict, 并使团队协作更加 high 效.
1.1 CSS code组织principles
- module化: 将CSScode分解 for 独立 module, 每个module负责specific functions or component.
- 关注点分离: 将不同class型 样式 (such as布局, 颜色, 字体etc.) 分离 to 不同 file or 区域.
- 可reusability: creation可复用 样式class, 避免重复code.
- 可scale性: design样式时考虑未来 scalerequirements, usingvariable and 混合宏etc.techniques.
- consistency: 保持code风格 consistency, includingindent, 命名, commentetc..
1.2 common CSS命名规范
1.2.1 BEM命名规范
BEM (Block, Element, Modifier) is a流行 CSS命名method论, 它using简洁 命名约定来表示component structure and relationships.
/* BEM命名格式: block__element--modifier */
/* Block (块) : 独立 component */
.card {
/* 样式 */
}
/* Element (元素) : 块 组成部分 */
.card__header {
/* 样式 */
}
.card__body {
/* 样式 */
}
.card__footer {
/* 样式 */
}
/* Modifier (修饰符) : 块 or 元素 变体 */
.card--primary {
/* 主色调卡片样式 */
}
.card--large {
/* big 尺寸卡片样式 */
}
.card__header--centered {
/* 居in for 齐 卡片头部 */
}
1.2.2 OOCSS命名规范
OOCSS (Object-Oriented CSS) is a面向object CSSdesignmethod, 强调将structure and 样式分离, creation可复用 object.
/* structure样式 (可复用) */
.box {
display: block;
padding: 10px;
border: 1px solid #e0e0e0;
border-radius: 4px;
}
/* out 观样式 (可复用) */
.rounded {
border-radius: 8px;
}
.shadow {
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}
/* 组合using */
.card {
@extend .box;
@extend .rounded;
@extend .shadow;
}
.button {
@extend .box;
@extend .rounded;
}
1.2.3 SMACSS命名规范
SMACSS (Scalable and Modular Architecture for CSS) is amodule化 CSSarchitecture, 将样式分 for 5个class别:
- Base: Basics样式, such asreset样式, 默认字体etc..
- Layout: 布局样式, such as页面structure, 网格systemetc..
- Module: module样式, such ascomponent, small 部件etc..
- State: status样式, such as隐藏, 激活, 禁用etc..
- Theme: 主题样式, such as颜色solutions, 字体etc..
/* Base样式 */
body {
font-family: 'Microsoft YaHei', Arial, sans-serif;
color: #333;
line-height: 1.6;
}
/* Layout样式 ( before 缀: l-) */
.l-header {
/* 头部布局 */
}
.l-main {
/* 主 in 容布局 */
}
.l-sidebar {
/* 侧edge栏布局 */
}
/* Module样式 */
.card {
/* 卡片component */
}
/* State样式 ( before 缀: is-) */
.is-hidden {
display: none;
}
.is-active {
/* 激活status样式 */
}
/* Theme样式 */
.theme-light {
background-color: white;
color: #333;
}
.theme-dark {
background-color: #333;
color: white;
}
1.3 CSS code组织example
推荐 CSSfilestructure
/* 1. reset样式 */
@import 'reset.css';
/* 2. variable定义 */
@import 'variables.css';
/* 3. Basics样式 */
@import 'base.css';
/* 4. 布局样式 */
@import 'layout.css';
/* 5. component样式 */
@import 'components/button.css';
@import 'components/card.css';
@import 'components/nav.css';
@import 'components/form.css';
/* 6. 页面specific样式 */
@import 'pages/home.css';
@import 'pages/about.css';
/* 7. response式样式 */
@import 'responsive.css';
/* 8. toolclass */
@import 'utilities.css';
2. CSS performanceoptimization
CSSperformanceoptimization可以improving页面加载速度 and 渲染performance, 提升user体验. 以 under is 一些common CSSperformanceoptimizationtechniques.
2.1 reducingCSSfile big small
- 移除未using CSS: usingtool (such asPurgeCSS, UnCSS) 检测并移除未using CSScode.
- 压缩CSS: using压缩tool (such asCSSNano, CleanCSS) 压缩CSSfile, reducingfile big small .
- mergeCSSfile: 将 many 个CSSfilemerge for 一个, reducingHTTPrequest次数.
- usingCSSvariable: usingCSSvariable代替重复 颜色, 尺寸etc.值, reducingcode量.
2.2 optimizationCSS选择器
CSS选择器 匹配顺序 is from right to left , 因此应该optimization选择器 写法, reducing匹配 complexity.
CSS选择器optimizationexample
不 good 实践
/* 过于具体 选择器 */
div.container ul.nav li a {
color: #4285F4;
}
/* tag限定 */
ul.nav-item {
/* 样式 */
}
/* ID选择器 and class选择器结合 */
#header .nav {
/* 样式 */
}
/* common选择器 */
* {
box-sizing: border-box;
} /* 这个 is 可以接受 , 但要谨慎using */
/* many 层嵌套 */
.container {
.row {
.col {
.card {
.card-header {
/* 样式 */
}
}
}
}
}
good 实践
/* 简洁 class选择器 */
.nav-link {
color: #4285F4;
}
/* 不带tag限定 class选择器 */
.nav-item {
/* 样式 */
}
/* 单独usingclass选择器 */
.nav {
/* 样式 */
}
/* reducing嵌套层级 (建议不超过3层) */
.container .row .col {
/* 样式 */
}
.card .card-header {
/* 样式 */
}
2.3 optimizationCSS渲染performance
- 避免using昂贵 CSSproperty: such asbox-shadow, border-radius, filteretc., 这些property会增加渲染成本.
- usingGPU加速: for 于动画效果, 优先usingtransform and opacityproperty, 它们可以由GPU加速.
- 避免频繁 回流 (Reflow) and 重绘 (Repaint) :
- 避免频繁modify布局property (such aswidth, height, top, leftetc.)
- usingtransform代替top/leftfor定位
- usingvisibility:hidden代替display:none, 避免回流
- 批量modifyDOM元素, usingDocumentFragment or 离线DOM
- usingwill-changeproperty: 提 before 告知浏览器哪些property将要发生变化, 让浏览器提 before 做 good optimization准备.
2.4 字体optimization
- usingsystem字体: 优先usingsystem预装 字体, reducing字体file under 载.
- 字体子集化: 只package含页面所需 字符, reducing字体file big small .
- usingfont-displayproperty: 控制字体 加载 and 显示方式, 避免文本闪烁.
- latency加载非关键字体: for 不 is 立即需要 字体forlatency加载.
/* usingfont-displayproperty */
@font-face {
font-family: 'MyFont';
src: url('myfont.woff2') format('woff2');
font-display: swap; /* 可选值: auto, block, swap, fallback, optional */
}
/* usingsystem字体栈 */
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
}
2.5 graph片optimization
- using合适 graph片格式: 根据graph片 in 容选择合适 格式 (JPEG for photos, PNG for graphics, WebP for modern browsers) .
- optimizationgraph片 big small : 压缩graph片, reducingfile big small .
- usingCSS Sprites: 将 many 个 small graph片merge for 一个 big graph, reducingHTTPrequest次数.
- usingCSS渐变代替graph片: for 于 simple 渐变效果, usingCSS渐变代替graph片.
- usinggraph标字体 or SVGgraph标: for 于graph标, 优先usinggraph标字体 or SVGgraph标, reducinggraph片request.
3. CSS 浏览器compatibilityprocessing
不同浏览器 for CSSfeatures support程度不同, 因此需要for浏览器compatibilityprocessing, 确保页面 in 不同浏览器in都能正常显示.
3.1 浏览器compatibility检测
using以 under tool检测CSSfeatures in 不同浏览器in supportcircumstances:
- Can I use: https://caniuse.com/ - 查看CSSfeatures 浏览器supportcircumstances.
- BrowserStack: https://www.browserstack.com/ - 跨浏览器test平台.
- Sauce Labs: https://saucelabs.com/ - 跨浏览器test平台.
3.2 CSS before 缀processing
for 于一些 new CSSfeatures, 需要添加浏览器 before 缀以确保 in old 浏览器in compatibility.
CSS before 缀example
/* 带 before 缀 CSSproperty */
.box {
/* 过渡效果 */
-webkit-transition: all 0.3s ease;
-moz-transition: all 0.3s ease;
-o-transition: all 0.3s ease;
transition: all 0.3s ease;
/* 变换效果 */
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
/* 动画效果 */
-webkit-animation: slideIn 1s ease;
-moz-animation: slideIn 1s ease;
-o-animation: slideIn 1s ease;
animation: slideIn 1s ease;
/* 弹性布局 */
display: -webkit-flex;
display: -moz-flex;
display: -ms-flexbox;
display: flex;
}
/* usingAutoprefixer自动添加 before 缀 */
/* 原始code */
.box {
transition: all 0.3s ease;
transform: rotate(45deg);
animation: slideIn 1s ease;
display: flex;
}
/* Autoprefixerprocessing after code */
.box {
-webkit-transition: all 0.3s ease;
transition: all 0.3s ease;
-webkit-transform: rotate(45deg);
transform: rotate(45deg);
-webkit-animation: slideIn 1s ease;
animation: slideIn 1s ease;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
3.3 优雅降级 and 渐进增强
in processing浏览器compatibility时, 可以adopts以 under 两种策略:
3.3.1 渐进增强 (Progressive Enhancement)
from basicfunctions开始, 然 after for supportadvanced features 浏览器添加增强效果.
/* basic样式 */
.card {
background-color: white;
padding: 20px;
border: 1px solid #e0e0e0;
}
/* 增强样式: 仅 in support 浏览器in生效 */
@supports (display: grid) {
.card {
display: grid;
grid-template-columns: 1fr 2fr;
gap: 20px;
}
}
@supports (backdrop-filter: blur(10px)) {
.card {
background-color: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
}
}
3.3.2 优雅降级 (Graceful Degradation)
from 完整functions开始, 然 after for 不supportadvanced features 浏览器providing备选solutions.
/* advanced样式 */
.card {
display: grid;
grid-template-columns: 1fr 2fr;
gap: 20px;
background-color: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
}
/* 备选样式: 针 for 不supportgrid 浏览器 */
@supports not (display: grid) {
.card {
display: flex;
flex-wrap: wrap;
}
}
/* 备选样式: 针 for 不supportbackdrop-filter 浏览器 */
@supports not (backdrop-filter: blur(10px)) {
.card {
background-color: white;
}
}
3.4 usingCSS Reset or Normalize.css
不同浏览器 for HTML元素 has 不同 默认样式, usingCSS Reset or Normalize.css可以reset or 统一这些默认样式.
3.4.1 CSS Reset
CSS Reset会移除所 has 浏览器 默认样式, 让Development者 from 头开始定义样式.
/* simple CSS Reset */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333;
background-color: #fff;
}
ul, ol {
list-style: none;
}
a {
text-decoration: none;
color: inherit;
}
img {
max-width: 100%;
height: auto;
display: block;
}
3.4.2 Normalize.css
Normalize.css不会移除所 has 默认样式, 而 is 统一 and 修复不同浏览器之间 diff, 保留 has 用 默认样式.
usingmethod: in HTMLfilein引入Normalize.cssfile, 然 after writing自定义样式.
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css">
4. CSS best practicessummarized
以 under is 一些CSSDevelopment best practices, has 助于writing high quality, 可maintenance CSScode.
4.1 writing清晰, readable code
- using一致 indent and 换行
- for important 样式添加comment
- using has 意义 class名
- 保持选择器 简洁性
4.2 优先usingCSSvariable
usingCSSvariable代替硬编码 颜色, 尺寸etc.值, 便于统一management and 主题切换.
4.3 adoptsmove优先 designmethod
先designmove设备 样式, 然 after using媒体query for big 屏幕设备添加增强样式.
4.4 避免using!important
尽量避免using!important, 它会破 bad CSS 层叠mechanism, 导致样式难以maintenance.
4.5 using相 for 单位
优先using相 for 单位 (such asrem, em, %, vw/vh) 代替绝 for 单位 (such aspx) , improving样式 flexible性 and response性.
4.6 test不同浏览器 and 设备
in 不同浏览器 and 设备 on testCSS样式, 确保compatibility and consistency.
4.7 定期refactorCSScode
定期refactorCSScode, 移除冗余code, optimization选择器, improvementcode组织, improvingcodequality.
5. 练习
练习 1: codeoptimization
- analysis以 under CSScode, 找出其in issues:
div.container ul.nav-menu li.menu-item a { color: #4285F4; font-size: 16px; padding: 10px 15px; display: block; } div.container ul.nav-menu li.menu-item.active a { color: #34A853; font-weight: bold; } div.container ul.nav-menu li.menu-item:hover a { background-color: #f0f0f0; border-radius: 4px; } #header .logo { width: 100px; height: 50px; } #header .nav { display: flex; justify-content: space-between; align-items: center; } #header .nav ul li { margin-right: 20px; } #header .nav ul li:last-child { margin-right: 0; } - usingBEM命名规范refactor这段code
- optimization选择器, reducing匹配complexity
- usingCSSvariable代替硬编码 颜色值
- 添加适当 comment
练习 2: performanceoptimization
- analysis以 under CSScode, 找出performanceissues:
/* 频繁 回流 and 重绘 */ .animated-box { width: 100px; height: 100px; background-color: #4285F4; position: relative; animation: moveBox 2s infinite; } @keyframes moveBox { 0% { left: 0; top: 0; } 25% { left: 200px; top: 0; } 50% { left: 200px; top: 200px; } 75% { left: 0; top: 200px; } 100% { left: 0; top: 0; } } /* complex 选择器 */ body div.container section.main-content article.post:nth-child(odd) .post-content .post-title { color: #34A853; font-size: 24px; margin-bottom: 15px; } /* 未optimization 字体加载 */ @font-face { font-family: 'CustomFont'; src: url('custom-font.woff2') format('woff2'); font-weight: normal; font-style: normal; } body { font-family: 'CustomFont', Arial, sans-serif; } /* big 量 box-shadow效果 */ .card { box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1), 0 4px 20px rgba(0, 0, 0, 0.05), 0 6px 30px rgba(0, 0, 0, 0.03); transition: all 0.3s ease; } .card:hover { box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15), 0 8px 40px rgba(0, 0, 0, 0.1), 0 12px 60px rgba(0, 0, 0, 0.05); transform: translateY(-5px); } - optimization这段code, improvingperformance:
- optimization动画performance, usingGPU加速
- 简化选择器
- optimization字体加载
- optimizationbox-shadow效果
练习 3: 浏览器compatibilityprocessing
- creation一个HTMLfile, package含一个usingCSS Grid布局 卡片component
- for 卡片component添加以 under 样式:
- usingCSS Grid布局排列卡片 in 容
- 添加渐变背景
- 添加阴影效果
- 添加悬停动画
- using优雅降级 方式, for 不supportGrid布局 浏览器providing备选样式
- for 需要 CSSproperty添加浏览器 before 缀
- in HTMLfilein引入CSSfile, test效果
练习 4: CSSarchitecturedesign
- design一个 simple 博客页面布局, including:
- 头部导航
- 侧edge栏
- 主 in 容区域 (package含文章list)
- 文章卡片component
- 底部页脚
- usingBEM命名规范designCSSclass名
- adoptsmove优先 designmethod
- usingCSSvariable定义颜色, 尺寸etc.
- 组织CSSfilestructure, including:
- reset样式
- variable定义
- Basics样式
- 布局样式
- component样式
- response式样式
- creationHTML and CSSfile, implementationdesign