# 精简版
***
**渐进增强 progressive enhancement**:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
**优雅降级 graceful degradation**:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
区别:
  a. 优雅降级是从复杂的现状开始,并试图减少用户体验的供给
  b. 渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要
  c. 降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带
# 详细版
***
[前端开发之优雅降级与渐进增强](https://www.cnblogs.com/web-wjg/p/7240985.html)
## 名词解释
  * **渐进增强(Progressive Enhancement)**:一开始就针对低版本浏览器进行构建页面,完成基本的功能,然后再针对高级浏览器进行效果、交互、追加功能达到更好的体验。
  * **优雅降级(Graceful Degradation)**:一开始就构建站点的完整功能,然后针对浏览器测试和修复。比如一开始使用 CSS3 的特性构建了一个应用,然后逐步针对各大浏览器进行 hack 使其可以在低版本浏览器上正常浏览。
  其实渐进增强和优雅降级并非什么新概念,只是旧的概念换了一个新的说法。在传统软件开发中,经常会提到**向上兼容**和**向下兼容**的概念。渐进增强相当于向上兼容,而优雅降级相当于向下兼容。向下兼容指的是高版本支持低版本的或者说后期开发的版本支持和兼容早期开发的版本,向上兼容的很少。大多数软件都是向下兼容的,比如说Office2010能打开Office2007,Office2006,Office2005,Office2003等建的word文件,但是用Office2003就不能打开用Office2007,Office2010等建的word文件!
## 二者区别
  * **优雅降级和渐进增强只是看待同种事物的两种观点**。优雅降级和渐进增强都关注于同一网站在不同设备里不同浏览器下的表现程度。关键的区别则在于它们各自关注于何处,以及这种关注如何影响工作的流程。
  * **优雅降级**观点认为应该针对那些最高级、最完善的浏览器来设计网站。而将那些被认为“过时”或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段,并把测试对象限定为主流浏览器(如 IE、Mozilla 等)的前一个版本。在这种设计范例下,旧版的浏览器被认为仅能提供“简陋却无妨 (poor, but passable)” 的浏览体验。你可以做一些小的调整来适应某个特定的浏览器。但由于它们并非我们所关注的焦点,因此除了修复较大的错误之外,其它的差异将被直接忽略。
**渐进增强**观点则认为应关注于内容本身。
## 案例分析
看如下这两段代码的书写顺序,表示了我们开发的着重点。
~~~
.transition { /*渐进增强写法*/
-webkit-transition: all .5s;
-moz-transition: all .5s;
-o-transition: all .5s;
transition: all .5s;
}
.transition { /*优雅降级写法*/
transition: all .5s;
-o-transition: all .5s;
-moz-transition: all .5s;
-webkit-transition: all .5s;
}
~~~
前缀CSS3(-webkit-*/ -moz-*/ -o-\*)和正常CSS3在浏览器中的支持情况是这样的:
  1. **很久以前**:浏览器前缀CSS3和正常CSS3**都不支持**;
  2. **不久之前**:浏览器**只支持**前缀CSS3,**不支持**正常CSS3;
  3. **现在**:浏览器**既支持**前缀CSS3,**又支持**正常CSS3;
  4. **未来**:浏览器**不支持**前缀CSS3,**仅支持**正常CSS3.
  渐进增强的写法,优先考虑老版本浏览器的可用性,最后才考虑新版本的可用性。在时期3前缀CSS3和正常CSS3都可用的情况下,正常CSS3会覆盖前缀CSS3。优雅降级的写法,优先考虑新版本浏览器的可用性,最后才考虑老版本的可用性。在时期3前缀CSS3和正常CSS3都可用的情况下,前缀CSS3会覆盖正常的CSS3。
  就CSS3这种例子而言,我更加推崇渐进增强的写法。因为前缀CSS3的某些属性在浏览器中的实现效果有可能与正常的CSS3实现效果不太一样,所以最终还是得以正常CSS3为准。如果你好奇究竟是什么属性在前缀CSS3和正常CSS3中显式效果不一样,可以看看这篇文章《[需警惕CSS3属性的书写顺序](http://www.zhangxinxu.com/wordpress/2010/09/%E9%9C%80%E8%AD%A6%E6%83%95css3%E5%B1%9E%E6%80%A7%E7%9A%84%E4%B9%A6%E5%86%99%E9%A1%BA%E5%BA%8F/)》。
## 如何抉择
  如果软件开发的预算和时间充足,就不存在抉择的问题。然而现实很残酷,要么开发周期短,要么开发预算少,或者二者兼而有之,这个时候该如何抉择?就我个人而言,讲讲我的观点。
  应**根据你的用户所使用的客户端的版本来做决定**。请注意我的措辞,我没有用浏览器,而是用客户端。因为渐进增强和优雅降级的概念本质上是软件开发过程中低版本软件与高版本软件面对新功能的兼容抉择问题。服务端程序很少存在这种问题,因为开发者可以控制服务端运行程序的版本,就无所谓渐进增强和优雅降级的问题。但是客户端程序则不是开发者所能控制的(你总不能强制用户去升级它们的浏览器吧)。我们所谓的客户端,可以指浏览器,移动终端设备(如:手机,平板电脑,智能手表等)以及它们对应的应用程序(浏览器对应的是网站,移动终端设备对应的是相应的APP)。
  现在有很成熟的技术,能够让你分析使用你客户端程序的版本比例。如果低版本用户居多,当然优先采用渐进增强的开发流程;如果高版本用户居多,为了提高大多数用户的使用体验,那当然优先采用优雅降级的开发流程。
  然而事实情况是怎么样的呢?绝大多数的大公司都是采用渐进增强的方式,因为业务优先,提升用户体验永远不会排在最前面。例如:新浪微博网站前端的更新,拥有这种亿级用户的网站,绝对不可能追求某个特效而不考虑低版本用户可不可用,一定是确保低版本到高版本的可访问性,再去渐进增强,采用新功能给高版本用户提供更好的用户体验。但也不是没有反例。如果你开发的是一款面向青少年的软件(或网站),你知道这个群体的人总是喜欢尝试新事物,总是喜欢酷炫的特效,总是喜欢把它们的软件更新到最新版本(而不像我们老一辈的用户)。面对这种情况,渐进增强的开发流程实为上选。
  * **软件开发中,从来就[没有银弹](https://en.wikipedia.org/wiki/No_Silver_Bullet)。具体的抉择,请读者视情况而定**
- 前言
- 前端概念
- 优雅降级和渐进增强
- XSS攻击与CSRF攻击
- MVC / MVP / MVVM
- 内存泄漏
- HTML
- 基础
- Title 和 Alt 有什么区别?
- 语义化
- iFrame有那些优缺点?
- 全局属性有哪些?
- <style>写在<body>前和<body>后有什么区别?
- 浏览器相关
- 如何让Chrome浏览器显示小于12px的文字?
- 浏览器是如何渲染页面的
- 浏览器内核
- WEB标准 & W3C标准
- 严格模式 & 混杂模式
- 常见元素/标签
- 渲染机制及重绘和回流
- 其他
- HTML5 为什么只写<!DOCTYPE HTML> ?
- link 和 @import 有什么区别?
- HTML 5
- 常见浏览器兼容问题
- CSS
- 基础
- px、em、rem、vw、vh 的区别
- src 和 href 的区别
- Css Hack 是什么?
- 图像优化
- 定位方式有哪些?
- 居中方式有哪些?
- 伪元素和伪类
- ::before 和 :after 中双冒号和单冒号有什么区别?
- 常用选择器
- 选择器优先级
- 用纯CSS创建一个三角形
- 初始化CSS样式
- BFC规范(块级格式化上下文)
- 上下margin重合
- 全屏滚动的原理是什么?
- box-sizing
- 文本超出隐藏
- 盒模型
- 什么是盒模型?
- 响应式布局
- 媒体查询
- 浮动与清除浮动
- CSS 3
- CSS3 animation 渲染优化
- Canvas
- FlexBox 弹性盒布局模型
- 新特性
- 常见布局方式有哪些?
- 预处理器 less & sass
- JavaScript
- 同步和异步
- async & await
- Promise
- Promise.all
- Promise.race
- Promise.finally
- 添加、移除、复制、创建、和查找节点
- 数组去重
- 数据类型
- 如何判断数据类型?
- 数据类型转变
- == 和 ===的区别
- 原型 与 原型链
- 事件
- 事件委托
- 冒泡 与 捕获
- 如何阻止默认事件?
- 函数
- 箭头函数是什么?
- 闭包
- 递归
- Ajax
- Ajax 是什么?
- 手写一个 Ajax
- HTTP 常见状态码
- 一次完整的 HTTP 事务是怎么一个过程
- HTTP 和 HTTPS 有什么区别?
- HTTP协议 和 TCP协议 有什么区别?
- 跨域及常见解决办法
- RESTful 协议
- Xml 和 Json的区别
- Json对象 与 JS对象 转换
- This 指向
- 变量与常量
- 什么是变量提升?
- 正则表达式
- 性能优化(基础篇)
- 前端本地存储
- 刷新页面,js请求一般会有哪些地方有缓存处理
- 如何实现页面每次打开时清除本页缓存?
- Cookies & SessionStorage & LocalStorage
- 防抖和节流
- 垃圾回收机制
- 前端加密
- SEO 与 服务端渲染
- 模块化
- AMD、CMD、CommonJs
- Import / Export
- 面向对象
- 深拷贝和浅拷贝
- Vue
- Vue 常见面试题
- Vue 优缺点?
- 响应式原理?
- 组件如何传参?
- 前端三大框架区别
- 单页面应用和多页面应用区别及优缺点
- 常用指令有哪些?
- v-if 和 v-for 的优先级
- 生命周期
- 路由
- Cli 工程化
- Axios
- VueX
- VueX 是什么?
- 怎么用?
- 使用场景
- 常见问题
- Vue 性能优化
- WebPack 性能优化
- Virtual DOM(虚拟Dom)
- ES6
- ES6 新特性有哪些?
- TypeScript
- React
- 微信小程序
- 常见Bug
- 支付
- 支付宝小程序
- 后台集成方案
- 前端鉴权
- HTTP基本认证
- session-cookie
- Token
- OAuth
- 目录结构
- WebPack
- EsLint
- 前后端交互
- 多环境部署
- Axios封装
- 项目经验
- 项目开发流程
- 支付
- 支付宝支付
- 余额支付/积分支付
- WX 支付
- 常用库
- jQuery
- Loadsh