跟着 MDN 学CSS day_51:支持旧浏览器的布局策略
引言现代与传统的平衡艺术在Web开发的世界中新技术的诞生与旧浏览器的存在始终是一对矛盾。当我们热衷于使用CSS网格布局、弹性盒等现代特性构建精美的网页时总有一部分用户仍在使用不支持这些特性的旧浏览器。这并不意味着我们要放弃现代技术而是需要掌握一种平衡的艺术让网站在现代浏览器上展现出色的视觉效果同时在旧浏览器上保持基本可用。本文将深入探讨如何在不牺牲现代技术的前提下为旧浏览器用户提供可接受的浏览体验。一、了解你的浏览器生态每个网站的受众群体都是不同的在决定采用何种技术方案之前必须首先了解访问你网站的用户使用什么样的浏览器。分析用户数据的方法如果你已经有一个正在运行的网站最直接的方法是查看网站的分析数据。Google Analytics、百度统计等工具可以提供详细的浏览器版本分布信息让你清楚知道有多少用户在使用旧版浏览器。通过这些数据你可以做出基于事实的决策而不是盲目猜测。如果你正在开发一个全新的网站没有现成的分析数据可以参考那么可以使用Statcounter等第三方统计数据服务。这类网站提供了按地区分类的浏览器使用数据可以帮助你了解目标用户群体的技术环境。例如在某些地区旧版IE浏览器的使用率可能仍然较高而在另一些地区用户则普遍使用最新的现代浏览器。设备类型与无障碍需求除了浏览器版本还需要考虑用户访问网站的设备类型。移动设备的访问量在许多网站上已经超过桌面设备这意味着你需要特别关注移动端的兼容性问题。更重要的是无障碍需求始终不应被忽视。使用屏幕阅读器的视障用户、需要放大页面阅读的老年人这些用户群体可能比使用旧版浏览器的用户数量多得多。在实际开发中过度关注1%的旧浏览器用户而忽视相当数量的无障碍需求用户是一种资源分配上的错位。二、理解特性的浏览器支持情况一旦了解了用户的浏览器分布就可以针对你想要使用的技术特性进行支持情况的评估。MDN与Can I Use的使用方法MDN的每个CSS属性页面都提供了详细的浏览器兼容性表格。以grid-template-columns属性为例页面底部列出了Chrome、Firefox、Safari、Edge等主流浏览器开始支持该属性的版本号。通过这个表格你可以快速判断目标浏览器是否支持某个特性。Can I Use网站是另一个权威的兼容性查询工具。它列出了所有主流Web平台特性的浏览器支持信息并且可以按地区筛选使用数据。更强大的是你可以链接自己的Google Analytics账户系统会根据你的实际用户数据来显示支持情况使决策更加精准。基于数据的技术选型理解用户拥有的技术环境和支持情况后就可以在理想的视觉效果和实际的支持程度之间做出权衡。例如如果数据显示98%的用户使用支持CSS网格的浏览器那么完全可以大胆使用网格布局同时为剩下的2%用户准备一个可用的回滚方案。相反如果目标用户群体中仍有相当比例使用旧版浏览器则需要更加谨慎地选择技术方案。三、支持不等于视觉一致一个常见的误解是支持旧浏览器意味着网站在所有浏览器上看起来必须完全相同。这种想法既不现实也不必要。内容优先的设计哲学网站可能在不同浏览器、不同设备上呈现不同的外观。手机用户看到的是单列布局桌面用户看到的是多列布局。旧版浏览器用户看到的是简化版本现代浏览器用户看到的是精美版本。这些差异是正常的也是可接受的。核心原则是无论使用什么浏览器用户都应该能够访问和理解网站的内容。正常文档流的价值最基本的支持级别来源于良好组织的HTML文档。如果完全移除样式表页面内容应该仍然按照有意义的顺序流畅地排列。这就是为什么在编写CSS之前必须先构建语义正确、结构清晰的HTML。一个使用功能极其受限的手机的用户可能无法加载你的CSS但内容会以易于阅读的方式自然排列。从这个角度来看HTML结构本身就是最可靠的回滚方案。将网站的原始视图作为旧浏览器的回滚方案往往是最务实的做法。如果访问你网站的旧浏览器用户数量极少花费大量时间试图为他们提供与现代浏览器相同的体验可能没有商业价值。相比之下将时间投入到无障碍优化上服务更多的用户群体可能是更好的选择。四、在CSS中构建回滚机制CSS规范本身为构建回滚机制提供了支持。浏览器会忽略无法理解的CSS规则同时规范也定义了当多种布局方式应用于同一元素时的行为。浮动与网格的回滚示例下面的示例演示了如何同时使用浮动布局和网格布局让旧浏览器使用浮动方案现代浏览器使用网格方案。divclasswrapperdivclassitemItem One/divdivclassitemItem Two/divdivclassitemItem Three/div/divcss * { box-sizing: border-box; } .wrapper { background-color: rgb(79, 185, 227); padding: 10px; max-width: 400px; display: grid; grid-template-columns: 1fr 1fr 1fr; } .item { float: left; border-radius: 5px; background-color: rgb(207, 232, 220); padding: 1em; }在这个示例中三个div元素首先被设置为左浮动在不支持网格的浏览器中会并排显示为一行的三个盒子。wrapper同时被设置为网格容器。根据CSS规范当一个浮动元素成为网格项目时浮动行为会失效。因此支持网格的浏览器会忽略浮动效果使用网格布局。不支持网格的浏览器则无法理解display: grid和grid-template-columns属性会忽略这些规则使用浮动布局。这种方法的妙处在于你不需要编写任何条件注释或JavaScript检测代码纯粹的CSS就能自动完成布局方案的选择。多种回滚方式的选择除了浮动和网格的组合还有其他多种布局方式可以互相作为回滚。display: inline-block方式可以用来建立列布局。当一个元素被设置为inline-block但后来变成了弹性或网格项目时inline-block行为会被忽略。display: table方式建立的CSS表格布局也可以作为回滚当元素变为弹性或网格项目时表格布局行为同样会失效。多列布局也可以作为回滚方案。如果一个容器的column-*属性被定义后变成了网格容器多列行为就不会生效。弹性盒作为网格的回滚尤其值得注意因为弹性盒在IE10和IE11中就得到了支持比网格的支持范围更广。处理宽度百分比的问题在同时使用浮动回滚和网格布局时可能会遇到一个细节问题。在浮动布局中为了创建类似网格的效果常常会给浮动元素设置百分比宽度。.item{float:left;border-radius:5px;background-color:rgb(207,232,220);padding:1em;width:33.333%;}在浮动布局中33.333%是相对于父容器宽度计算的表示父容器宽度的三分之一。但在网格布局中当一个元素既是浮动元素又是网格项目时宽度百分比是相对于该元素所在的网格区域计算的。这会导致在支持网格的浏览器中元素的实际宽度变得不正确。为了解决这个问题需要使用特性查询来检测浏览器是否支持网格如果支持则覆盖宽度设置。五、特性查询的使用方法特性查询是CSS提供的一个强大工具允许你检测浏览器是否支持特定的CSS特性并根据检测结果应用不同的样式。特性查询的基本语法特性查询使用supports规则语法类似于媒体查询。supports(display:grid){.item{width:auto;}}这个特性查询检测浏览器是否支持display: grid属性。如果支持则应用规则块内的样式将item的宽度设置为auto。如果不支持则忽略整个规则块。将特性查询应用到前面的示例中可以完美解决宽度百分比的问题。*{box-sizing:border-box;}.wrapper{background-color:rgb(79,185,227);padding:10px;max-width:400px;display:grid;grid-template-columns:1fr 1fr 1fr;}.item{float:left;border-radius:5px;background-color:rgb(207,232,187);padding:1em;width:33.333%;}supports(display:grid){.item{width:auto;}}在这个完整的示例中不支持网格也不支持特性查询的浏览器会使用浮动布局和33.333%的宽度。支持特性查询但不支持网格的浏览器实际上这种情况不存在因为特性查询和网格基本上是同时代的技术。但对于实际开发而言编写旧CSS在特性查询之外然后使用特性查询内的代码进行覆盖是确保最广泛支持的最佳实践。特性查询的浏览器支持特性查询在现代浏览器中的支持情况非常好。需要注意的是那些既不支持CSS网格也不支持特性查询的浏览器会直接使用我们在特性查询外部编写的回滚代码。这正是我们想要的结果。未来特性查询规范可能会增加检测不支持的能力但目前的最佳实践仍然是先编写面向旧浏览器的CSS然后使用特性查询为支持新特性的浏览器提供增强版本。六、旧浏览器的测试方法在实施了回滚方案之后还需要验证方案是否真正有效。测试旧浏览器有多种方法。本地虚拟机测试可以在本地计算机上安装虚拟机运行不同版本的Windows操作系统然后安装需要测试的旧版浏览器。这种方法最为精确但需要较多的存储空间和配置时间。在线测试服务Sauce Labs、BrowserStack等在线测试服务提供了便捷的跨浏览器测试平台。你可以在云端运行各种浏览器版本包括旧版IE、旧版Firefox等。这些服务通常提供截图比对、实时交互等功能大大提高了测试效率。浏览器内置的开发工具现代浏览器如Chrome、Firefox的开发工具中通常包含了设备模拟和网络节流功能。虽然不能完全模拟旧版浏览器的渲染引擎差异但可以模拟不同的屏幕尺寸和网络条件对于移动端适配测试很有帮助。总结渐进增强的思维模式支持旧浏览器的核心是一种思维模式渐进增强。从最基础、最广泛支持的技术开始确保内容在任何环境下都可用。然后逐层添加增强特性为支持新技术的浏览器提供更好的体验。特性查询是实现这种思维模式的有力工具它让你能够精确地为支持特定特性的浏览器提供增强样式。在资源有限的情况下应该根据实际数据做出理性决策。如果旧浏览器用户只占极小比例花费大量时间追求像素级的一致体验可能不是最优选择。相反将精力投入到提升无障碍性、优化性能、改善主流用户体验上可以获得更高的回报。Web开发的终极目标不是让每个像素在每个浏览器上都相同而是让每个用户无论使用什么设备都能访问和理解你的内容。还在纠结 CSS 样式写得杂乱无章、布局频频踩坑收藏此文持续跟进后续分享 CSS 高效简写、兼容适配方案、经典布局案例、样式避坑干货从基础样式到实战排版一站式学透快速提升前端页面编写能力