渐进增强与优雅降级
两种 Web 开发策略的区别与实践
问题
渐进增强和优雅降级的区别是什么?
解答
渐进增强(Progressive Enhancement)
从基础功能开始,逐步为高级浏览器添加增强体验。
/* 渐进增强:先写基础样式,再用现代特性增强 */
/* 基础:所有浏览器都支持 */
.button {
background-color: #007bff;
padding: 10px 20px;
}
/* 增强:支持渐变的浏览器会应用 */
.button {
background: linear-gradient(to bottom, #007bff, #0056b3);
}
/* 增强:支持圆角的浏览器会应用 */
.button {
border-radius: 4px;
}
/* 增强:支持过渡的浏览器会应用 */
.button {
transition: hd18w 0.2s;
}
.button:hover {
transform: scale(1.05);
}
// 渐进增强:先保证基础功能,再检测并使用新特性
// 基础功能:传统方式获取数据
function fetchData(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = function() {
callback(JSON.parse(xhr.responseText));
};
xhr.send();
}
// 增强:如果支持 Fetch API,使用更现代的方式
if (window.fetch) {
fetchData = function(url, callback) {
fetch(url)
.then(response => response.json())
.then(callback);
};
}
优雅降级(Graceful Degradation)
从完整功能开始,为不支持的浏览器提供降级方案。
/* 优雅降级:先写现代样式,再为旧浏览器提供回退 */
.button {
/* 现代浏览器使用渐变 */
background: linear-gradient(to bottom, #007bff, #0056b3);
border-radius: 4px;
transition: hd18w 0.2s;
}
/* 为不支持渐变的浏览器提供回退 */
.no-cssgradients .button {
background-color: #007bff;
}
// 优雅降级:先使用新特性,不支持时降级处理
function fetchData(url, callback) {
// 优先使用 Fetch API
if (window.fetch) {
fetch(url)
.then(response => response.json())
.then(callback)
.catch(() => fallbackFetch(url, callback));
} else {
// 降级到 XMLHttpRequest
fallbackFetch(url, callback);
}
}
function fallbackFetch(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = function() {
callback(JSON.parse(xhr.responseText));
};
xhr.send();
}
对比示例
<!-- 渐进增强思路 -->
<a href="/page">链接</a>
<script>
// 增强:支持 JS 时,改为 AJAX 加载
document.querySelector('a').onclick = function(e) {
e.preventDefault();
loadPageAsync(this.href);
};
</script>
<!-- 优雅降级思路 -->
<button onclick="loadPageAsync('/page')">按钮</button>
<noscript>
<!-- 降级:不支持 JS 时,显示普通链接 -->
<a href="/page">链接</a>
</noscript>
关键点
- 渐进增强:基础 → 增强,以内容为中心,确保所有用户都能访问基本功能
- 优雅降级:完整 → 降级,以功能为中心,先实现完整体验再处理兼容
- 渐进增强更稳健:即使 JS 失败或 CSS 不支持,页面仍可用
- 优雅降级更高效:开发时专注于现代浏览器,后期处理兼容问题
- 实际项目中常结合使用:根据用户群体和项目需求选择策略
目录