团队前端编码规范
团队前端编码规范 (HTML/CSS)
1. 总则
1.1 目标
- 提高代码可读性和可维护性
- 保证跨浏览器兼容性和响应式支持
- 确保无障碍访问和SEO友好
- 优化性能与加载速度
1.2 基本原则
- 语义化优先:使用最合适的HTML元素
- 移动优先:从小屏幕开始设计
- 渐进增强:基础功能广泛兼容,高级特性增强体验
- DRY原则:避免重复代码
2. HTML规范
2.1 文档结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="页面描述">
<title>页面标题 - 网站名称</title>
<!-- 预加载关键资源 -->
<link rel="preload" href="styles/main.css" as="style">
<link rel="preconnect" href="https://fonts.gstatic.com">
<!-- 主样式表 -->
<link rel="stylesheet" href="styles/main.css">
<!-- Favicon (现代格式) -->
<link rel="icon" href="favicon.ico" sizes="any">
<link rel="icon" href="icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
</head>
<body>
<!-- 使用WAI-ARIA地标角色 -->
<header role="banner">...</header>
<main role="main" id="main-content">
<!-- 页面主要内容 -->
</main>
<footer role="contentinfo">...</footer>
<!-- 脚本放在body末尾 -->
<script src="scripts/main.js" defer></script>
</body>
</html>
2.2 语义化标签
场景 | 推荐标签 |
---|---|
主导航 | <nav> |
文章内容 | <article> |
独立内容区块 | <section> |
侧边栏 | <aside> |
标题组 | <hgroup> |
时间日期 | <time datetime=""> |
按钮 | <button> |
表单分组 | <fieldset> + <legend> |
2.3 属性书写规范
-
属性顺序:
class
id
data-*
src
,href
,value
title
,alt
role
,aria-*
tabindex
-
布尔属性省略值:
<!-- 推荐 --> <input type="text" disabled> <input type="checkbox" checked> <!-- 避免 --> <input type="text" disabled="disabled">
2.4 注释规范
<!-- 区块注释 -->
<section class="product-grid">
<!-- 产品卡片组件 -->
<article class="product-card">...</article>
<!-- 分页组件 -->
<nav class="pagination">...</nav>
</section>
3. CSS规范
3.1 文件组织
styles/
├── base/
│ ├── _reset.css # 重置样式
│ ├── _variables.css # 全局变量
│ ├── _typography.css # 字体排版
│ └── _global.css # 全局基础样式
├── components/
│ ├── _buttons.css
│ ├── _cards.css
│ ├── _navigation.css
│ └── _forms.css
├── layouts/
│ ├── _grid.css
│ ├── _header.css
│ ├── _footer.css
│ └── _sidebar.css
├── utilities/
│ ├── _spacing.css
│ ├── _display.css
│ └── _helpers.css
├── themes/
│ ├── _dark.css # 暗黑主题
│ └── _high-contrast.css # 高对比主题
└── main.css # 主入口文件
3.2 命名规范(BEM)
/* Block */
.search-form {}
/* Element */
.search-form__input {}
.search-form__button {}
/* Modifier */
.search-form--compact {}
.search-form__button--disabled {}
3.3 样式声明顺序
- 布局属性:
display
,position
,float
,clear
,flex
,grid
... - 盒模型:
width
,height
,margin
,padding
,border
... - 视觉属性:
background
,color
,box-shadow
,opacity
... - 排版:
font
,line-height
,text-align
,white-space
... - 变换与动画:
transform
,transition
,animation
... - 其他:
cursor
,overflow
,z-index
...
3.4 响应式实现
/* 移动优先 - 默认移动端样式 */
.card {
width: 100%;
margin-bottom: 1rem;
}
/* 平板 (≥768px) */
@media (min-width: 768px) {
.card {
width: calc(50% - 1rem);
float: left;
margin-right: 1rem;
}
}
/* 桌面 (≥1024px) */
@media (min-width: 1024px) {
.card {
width: calc(33.333% - 1rem);
}
}
/* 大屏 (≥1440px) */
@media (min-width: 1440px) {
.card {
width: calc(25% - 1rem);
}
}
3.5 暗黑模式适配
/* 基础变量定义 */
:root {
/* 色彩系统 */
--color-primary: #2563eb;
--color-text: #1e293b;
--color-bg: #ffffff;
--color-surface: #f8fafc;
--color-border: #e2e8f0;
/* 间距系统 */
--spacing-xs: 0.25rem;
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
--spacing-lg: 1.5rem;
/* 过渡效果 */
--transition-base: all 0.3s ease;
}
/* 暗黑主题变量 */
@media (prefers-color-scheme: dark) {
:root {
--color-text: #e2e8f0;
--color-bg: #0f172a;
--color-surface: #1e293b;
--color-border: #334155;
}
}
/* 高对比度主题 */
@media (prefers-contrast: more) {
:root {
--color-text: #000;
--color-bg: #fff;
--color-border: #000;
}
}
/* 组件样式 */
.card {
background-color: var(--color-surface);
border: 1px solid var(--color-border);
color: var(--color-text);
padding: var(--spacing-md);
border-radius: 8px;
transition: var(--transition-base);
}
3.6 性能优化实践
/* 使用CSS变量 */
:root {
--shadow-sm: 0 1px 3px rgba(0,0,0,0.1);
}
.card {
box-shadow: var(--shadow-sm);
}
/* 避免昂贵选择器 */
/* 不推荐 */
header nav ul li a {}
/* 推荐 */
.nav-link {}
/* 使用will-change优化动画 */
.animated-element {
will-change: transform, opacity;
}
/* 减少重排属性 */
/* 优先使用transform/opacity */
.slide-in {
transform: translateX(0);
transition: transform 0.3s ease;
}
4. 最佳实践
4.1 HTML最佳实践
-
图片优化:
<img src="image.jpg" srcset="image-480.jpg 480w, image-800.jpg 800w" sizes="(max-width: 600px) 480px, 800px" alt="描述性文本" loading="lazy" width="800" height="600">
-
视频嵌入:
<video controls width="640" poster="preview.jpg"> <source src="video.mp4" type="video/mp4"> <source src="video.webm" type="video/webm"> <track label="中文" kind="subtitles" srclang="zh" src="captions.vtt"> </video>
4.2 CSS最佳实践
-
现代布局技术:
/* Flexbox */ .flex-container { display: flex; flex-wrap: wrap; gap: 1rem; justify-content: space-between; } /* CSS Grid */ .grid-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1.5rem; } /* 多列布局 */ .multi-column { column-count: 3; column-gap: 2rem; }
-
实用工具类:
/* 间距工具 */ .mt-0 { margin-top: 0 !important; } .mt-1 { margin-top: 0.25rem; } .mt-2 { margin-top: 0.5rem; } /* 响应式显示工具 */ .mobile-only { display: block; } @media (min-width: 768px) { .mobile-only { display: none; } }
5. 工作流程规范
5.1 代码提交
-
功能分支命名:
feature/描述性名称
-
提交信息格式:
[类型] 简要描述 详细说明(可选) - 变更点1 - 变更点2
类型示例:
feat
,fix
,docs
,style
,refactor
,perf
5.2 代码审查
- 必须通过Pull Request合并代码
- 审查重点:
- 是否符合本规范
- 是否影响性能
- 是否考虑无障碍访问
- 响应式是否正常
- 是否添加适当注释
5.3 工具链
// .prettierrc
{
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"bracketSpacing": true,
"arrowParens": "avoid"
}
// .stylelintrc
{
"extends": "stylelint-config-standard",
"rules": {
"selector-class-pattern": "^[a-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$",
"max-nesting-depth": 3,
"no-descending-specificity": null,
"declaration-block-no-redundant-longhand-properties": true
}
}
6. 附录:无障碍要求
6.1 关键要求
- 色彩对比度:文本4.5:1,大文本3:1
- 键盘导航:所有功能可通过键盘访问
- 焦点管理:可见焦点指示器
- 语义结构:正确使用标题层级 (h1-h6)
- 表单标签:所有表单元素必须有
<label>
6.2 ARIA使用指南
<!-- 当原生语义不足时使用ARIA -->
<nav aria-label="主菜单">
<ul role="menu">
<li role="menuitem"><a href="/">首页</a></li>
</ul>
</nav>
<!-- 动态区域 -->
<div aria-live="polite" aria-atomic="true">
动态更新的内容
</div>
版本控制
本文档版本:1.2
最后更新:2025年8月1日
维护团队:前端架构组
生效日期:即日起