响应式开发中合理选定CSS媒体查询分割点

简介:

本文响应式开发中合理选定CSS媒体查询分割点翻译自David Gilbertson的The-100%-Correct-Way-To-Do-CSS-breakpoints一文。本文唔看上去有些拗口,不过其核心是在于给出合适的Media Query命名与编写方式。

本文从属于笔者的Web 前端入门与最佳实践中的Web 响应式开发系列文章。  

在阅读本文的时候,反而希望你能先忘却关于CSS、Web开发那些你已经知道的东西,我们今天讨论的并不是多么复杂深奥的内容,如果你觉得准备好了那我们可以从下面这个简单的点图开始:

上面这些点分布的有些随意,分分合合,有近有远,我们的问题就是如何将这些点划分入到五个组中。最简单的,我们可以在那些相距较远的两个点之间设置为分隔区划分到不同的组合中。

上面这几个圈都是我随手画出来的,你当然可以选择其他的划分方式,譬如将最右边的两个点划分到一个分组中。其实这个问题并无所谓错误答案,不过如果你以如下方式划分的话: 

看上去是不是觉得怪怪的?我问这个问题也不是无中生有,当我们需要为不同尺寸的屏幕设置不同的CSS样式稿时,会有人喜欢按照最常见的尺寸作为分割点,即320px,768px与1024px。

不知道你有没有听过或者说过下面这些话:中等屏幕的话是不是按照768px来划分?还是应该把768px也划分到中等屏幕的范围内?不过这个尺寸是iPad横屏状态下的尺寸,应该算是大屏幕了吧?唔那大屏幕就是768px和以上尺寸咯?然后320px左右的是小屏幕?那319px算啥?区分蚂蚁的吗?本文的主旨即使讨论如何选择合适的分割点与分隔组。

选择合适的分隔点

你在幼儿园里就会画上面的这些圆吧,我现在用矩形度量来详细阐述下:

我们在这里选择了600px,900px,1200px以及1800px作为分割点,这些分隔组包含了最常见的14个机型: 

我们把这两张图合并下,可以得出下面这个更适合你的老板、设计师、开发者以及测试人员看的一张图: 

用更直观的方式命名你的分组

你愿意的话,也可以使用Papa-Bear与Baby-Bear来称呼你选定的分割点。不过当你和设计师一起讨论网站在不同屏幕上的展示效果时,肯定希望双方都能够在脑海中形成感性直观的认知。如果你用平板竖屏尺寸来形容的话,那到底是iPad还是Surface呢?特别是现在这种手机越来越大,平板越来越小的情况,你很难用单纯的平板或者手机来划分尺寸。不过好消息是苹果已经不做新产品了,他们只是不断地将按钮、耳机口从现在的产品中移除。这边我也不好给出什么建议,只能说设计师和产品之间需要多多沟通。

声明式的设置响应式布局

声明式的概念在前端很是流行,譬如著名的React就是典型的声明式组件库。声明式编程应用到CSS中即是CSS应当定义What it wants,而不是How it should。我们上面讨论过的一个关于分割点的容易混淆之处就是分割点同时代表了某个范围。譬如$large:600px这种定义在large这个词本身代表一个范围值的时候就会混淆。因此在具体的某个组件或者标签中,我们应该对其隐藏具体的尺寸设置,譬如:

 
  1. @mixin for-phone-only { 
  2.   @media (max-width: 599px) { @content; } 
  3. @mixin for-tablet-portrait-up { 
  4.   @media (min-width: 600px) { @content; } 
  5. @mixin for-tablet-portait-only { 
  6.   @media (min-width: 600px) and (max-width: 899px) { @content; } 
  7. @mixin for-tablet-landscape-up { 
  8.   @media (min-width: 900px) { @content; } 
  9. @mixin for-tablet-landscape-only { 
  10.   @media (min-width: 900px) and (max-width: 1199px) { @content; } 
  11. @mixin for-desktop-up { 
  12.   @media (min-width: 1200px) { @content; } 
  13. @mixin for-desktop-only { 
  14.   @media (min-width: 1200px) and (max-width: 1799px) { @content; } 
  15. @mixin for-big-desktop-up { 
  16.   @media (min-width: 1800px) { @content; } 
  17.  
  18. // usage 
  19. .my-box { 
  20.   padding: 10px; 
  21.    
  22.   @include for-desktop-up { 
  23.     padding: 20px; 
  24.   } 
  25. }  

你会发现在上面的定义中我很推荐使用-up与-only后缀,在具体使用样式的地方:

 
  1. .phone-only { 
  2.   @include for-phone-only { background: purple; } 
  3.  
  4. .tablet-portait-only { 
  5.   @include for-tablet-portait-only { background: purple; } 
  6.  
  7. .tablet-portrait-up { 
  8.   @include for-tablet-portrait-up { background: purple; } 
  9.  
  10. .tablet-landscape-only { 
  11.   @include for-tablet-landscape-only { background: purple; } 
  12.  
  13. .tablet-landscape-up { 
  14.   @include for-tablet-landscape-up { background: purple; } 
  15.  
  16. .desktop-only { 
  17.   @include for-desktop-only { background: purple; } 
  18.  
  19. .desktop-up { 
  20.   @include for-desktop-up { background: purple; } 
  21.  
  22. .big-desktop-up { 
  23.   @include for-big-desktop-up { background: purple; } 
  24. }  

不过这种方式在需要大量自定义媒介查询搭配的时候就显得不是那么灵活,我们可以提供更加细粒度的控制方式:

 
  1. @mixin for-size($size) { 
  2.   @if $size == phone-only { 
  3.     @media (max-width: 599px) { @content; } 
  4.   } @else if $size == tablet-portrait-up { 
  5.     @media (min-width: 600px) { @content; } 
  6.   } @else if $size == tablet-portait-only { 
  7.     @media (min-width: 600px) and (max-width: 899px) { @content; } 
  8.   } @else if $size == tablet-landscape-up { 
  9.     @media (min-width: 900px) { @content; } 
  10.   } @else if $size == tablet-landscape-only { 
  11.     @media (min-width: 900px) and (max-width: 1199px) { @content; } 
  12.   } @else if $size == desktop-up { 
  13.     @media (min-width: 1200px) { @content; } 
  14.   } @else if $size == desktop-only { 
  15.     @media (min-width: 1200px) and (max-width: 1799px) { @content; } 
  16.   } @else if $size == big-desktop-up { 
  17.     @media (min-width: 1800px) { @content; } 
  18.   } 
  19.  
  20. // usage 
  21. .my-box { 
  22.   padding: 10px; 
  23.    
  24.   @include for-size(desktop-up) { 
  25.     padding: 20px; 
  26.   } 
  27. }  

这种方式自然能够达成预期的效果,不过如果某个粗心的开发者传入了某个未预定义的范围名,那么久尴尬了,因此我们还是建议不要传入某个具体的尺寸,而是传入某个范围:

 
  1. @mixin for-size($range) { 
  2.   $phone-upper-boundary: 600px; 
  3.   $tablet-portrait-upper-boundary: 900px; 
  4.   $tablet-landscape-upper-boundary: 1200px; 
  5.   $desktop-upper-boundary: 1800px; 
  6.  
  7.   @if $range == phone-only { 
  8.     @media (max-width: #{$phone-upper-boundary - 1}) { @content; } 
  9.   } @else if $range == tablet-portrait-up { 
  10.     @media (min-width: $phone-upper-boundary) { @content; } 
  11.   } @else if $range == tablet-portait-only { 
  12.     @media (min-width: $phone-upper-boundary) and (max-width: #{$tablet-portrait-upper-boundary - 1}) { @content; } 
  13.   } @else if $range == tablet-landscape-up { 
  14.     @media (min-width: $tablet-landscape-upper-boundary) { @content; } 
  15.   } @else if $range == tablet-landscape-only { 
  16.     @media (min-width: $tablet-portrait-upper-boundary) and (max-width: $tablet-landscape-upper-boundary - 1px) { @content; } 
  17.   } @else if $range == desktop-up { 
  18.     @media (min-width: $tablet-landscape-upper-boundary) { @content; } 
  19.   } @else if $range == desktop-only { 
  20.     @media (min-width: $tablet-landscape-upper-boundary) and (max-width: $desktop-upper-boundary - 1px) { @content; } 
  21.   } @else if $range == big-desktop-up { 
  22.     @media (min-width: $desktop-upper-boundary) { @content; } 
  23.   } 
  24.  
  25. // usage 
  26. .my-box { 
  27.   padding: 10px; 
  28.    
  29.   @include for-size(desktop-up) { 
  30.     padding: 20px; 
  31.   } 
  32. }  



作者:王下邀月熊_Chevalier

来源:51CTO

相关文章
|
5天前
|
移动开发 前端开发 JavaScript
:掌握移动端开发:HTML5 与 CSS3 的高效实践
:掌握移动端开发:HTML5 与 CSS3 的高效实践
21 1
|
10天前
|
前端开发 UED 开发者
【专栏:HTML与CSS实战项目篇】制作一个响应式图片画廊
【4月更文挑战第30天】本文介绍了如何使用HTML和CSS创建响应式图片画廊。响应式画廊能根据用户设备屏幕大小自动调整布局。首先规划结构,包含一个图片容器和每张图片元素,并为图片提供替代文本。接着设计样式,设置图片大小、间距和视觉效果。然后通过媒体查询实现响应式设计,根据不同屏幕尺寸调整图片排列。同时考虑性能优化,如压缩图片和使用懒加载技术。最后,测试和调试确保画廊在各种设备上正常工作。这个过程强调了响应式设计和用户体验的重要性。
|
10天前
|
缓存 前端开发 JavaScript
【专栏:HTML与CSS移动端开发篇】移动端网页性能优化策略
【4月更文挑战第30天】本文探讨了移动端网页性能优化的重要性,并提出了优化策略。HTML方面,建议精简结构、使用语义化标签、异步加载脚本和压缩文件;CSS优化包括精简样式、使用CSS3动画、媒体查询和压缩文件。其他策略涉及图片和字体压缩、缓存利用、数据压缩、减少HTTP请求及根据网络状态调整加载。综合运用这些策略能提升网页性能和用户体验。
|
10天前
|
前端开发 JavaScript UED
【专栏:HTML与CSS移动端开发篇】移动端触摸事件与手势识别
【4月更文挑战第30天】本文探讨了移动端触摸事件和手势识别在网页开发中的重要性。介绍了基础触摸事件如`touchstart`, `touchmove`, `touchend`, `touchcancel`及相关属性。文章列举了处理触摸事件的方法,包括单点触摸、多点触摸、滑动、长按、捏合缩放、旋转检测和事件代理。建议使用第三方库如Hammer.js简化手势处理,并分享了最佳实践,如避免意外触摸、提供视觉反馈、考虑性能和跨设备测试。理解并有效利用这些技术能提升用户交互体验。
|
10天前
|
编解码 前端开发 UED
【专栏:HTML 与 CSS 移动端开发篇】CSS 媒体查询与移动端特定样式
【4月更文挑战第30天】CSS媒体查询在移动端开发中至关重要,它基于设备特性(如屏幕尺寸、分辨率、方向)应用特定样式,实现响应式设计。通过`@media`规则定义条件,如`(max-width: 600px)`,当屏幕宽度小于或等于600px时应用相应样式。常见条件包括屏幕宽度、高度、方向和分辨率。媒体查询可用于响应式布局、导航菜单优化、图片加载及字体调整。在实践中,需注意保持查询简洁,充分测试,渐进增强,并提前规划。掌握媒体查询能提升移动端用户体验,创造更优秀的网页设计。
|
10天前
|
编解码 移动开发 前端开发
【专栏:HTML与CSS移动端开发篇】使用Viewport Meta标签优化移动端显示
【4月更文挑战第30天】本文介绍了HTML的Viewport Meta标签在移动端网页优化中的作用。Viewport Meta标签定义了视口属性,如宽度、高度、初始缩放等,解决移动设备因屏幕尺寸差异导致的显示问题。主要属性包括width(常用device-width)、initial-scale、maximum-scale、minimum-scale和user-scalable。
|
1天前
|
移动开发 HTML5
HTML5/CSS3粒子效果进度条代码
HTML5/CSS3进度条应用。这款进度条插件在播放进度过程中出现粒子效果,就像一些小颗粒从进度条上散落下来
13 0
HTML5/CSS3粒子效果进度条代码
|
10天前
|
缓存 移动开发 前端开发
【专栏:HTML与CSS前端技术趋势篇】HTML与CSS在PWA(Progressive Web Apps)中的应用
【4月更文挑战第30天】PWA(Progressive Web Apps)结合现代Web技术,提供接近原生应用的体验。HTML在PWA中构建页面结构和内容,响应式设计、语义化标签、Manifest文件和离线页面的创建都离不开HTML。CSS则用于定制主题样式、实现动画效果、响应式布局和管理字体图标。两者协同工作,保证PWA在不同设备和网络环境下的快速、可靠和一致性体验。随着前端技术进步,HTML与CSS在PWA中的应用将更广泛。
|
10天前
|
前端开发 JavaScript 开发者
【专栏:HTML与CSS前端技术趋势篇】前端框架(React/Vue/Angular)与HTML/CSS的结合使用
【4月更文挑战第30天】前端框架React、Vue和Angular助力UI开发,通过组件化、状态管理和虚拟DOM提升效率。这些框架与HTML/CSS结合,使用模板语法、样式管理及组件化思想。未来趋势包括框架简化、Web组件标准采用和CSS在框架中角色的演变。开发者需紧跟技术发展,掌握新工具,提升开发效能。
|
10天前
|
前端开发 JavaScript UED
【专栏:HTML 与 CSS 前端技术趋势篇】Web 性能优化:CSS 与 HTML 的未来趋势
【4月更文挑战第30天】本文探讨了CSS和HTML在Web性能优化中的关键作用,包括样式表压缩、选择器优化、DOM操作减少等策略。随着未来趋势发展,CSS模块系统、自定义属性和响应式设计将得到强化,HTML新特性也将支持复杂组件构建。同时,应对浏览器兼容性、代码复杂度和性能功能平衡的挑战是优化过程中的重要任务。通过案例分析和持续创新,我们可以提升Web应用性能,创造更好的用户体验。