SASS优化响应式断点管理
来源:互联网 发布:用户上下级数据库设计 编辑:程序博客网 时间:2024/05/01 02:33
原文:《Managing Responsive Breakpoints with Sass》
作者:Hugo Giraudel,来自法国,著名SASS大牛,在SassWay等多个网站撰文推广sass,是SassyJSON、SassyMatrix等多个开源项目的开发者,大家可以到他的官方网站、github上了解详情。
翻译:前端开发whqet,以意译为主,不当之处请大家批评指正。
---------------------------------------------------------------------------------------------------------------------------------
当你需要搞定响应式布局时,一堆堆的媒体查询、大量的属性、属性值往往可以把你搞颠,SASS(或者诸如此类的预处理器)被认为是处理响应式断点的最佳利器。
说到响应式断点处理,很多种方式涌上心头,经常有人问哪种方式最优,正如前端开发领域的大多数问题一样,这个问题同样没有标准答案,我们需要具体问题具体分析。更确切的说,难度不在于提出一个系统,而是提出一个既足够灵活(适用大部分场合)又不非常复杂的系统。
在今天的文章里,我将给大家介绍若干种响应式布局断点的解决方案,每一种都经过实践验证,一些方案可能优于其他方案,我会把决定的权利交给大家。
1.使用变量(With variables)
// Defining values$screen-sm-min: 768px;$screen-xs-max: ($screen-sm-min - 1);$screen-md-min: 992px;$screen-sm-max: ($screen-md-min - 1);$screen-lg-min: 1200px;$screen-md-max: ($screen-lg-min - 1); // Usage@media (max-width: $screen-xs-max) { ... }@media (min-width: $screen-sm-min) { ... }@media (max-width: $screen-sm-max) { ... }@media (min-width: $screen-md-min) { ... }@media (max-width: $screen-md-max) { ... }@media (min-width: $screen-lg-min) { ... }Foudation更进一步,使用跨范围的媒体查询,避免使用过多的max-width和min-width。
// Defining values$small-range: (0em, 40em); /* 0, 640px */$medium-range: (40.063em, 64em); /* 641px, 1024px */$large-range: (64.063em, 90em); /* 1025px, 1440px */$xlarge-range: (90.063em, 120em); /* 1441px, 1920px */$xxlarge-range: (120.063em); /* 1921px */ // Defining media queries$screen: "only screen" !default;$landscape: "#{$screen} and (orientation: landscape)" !default;$portrait: "#{$screen} and (orientation: portrait)" !default;$small-up: $screen !default;$small-only: "#{$screen} and (max-width: #{upper-bound($small-range)})" !default;$medium-up: "#{$screen} and (min-width:#{lower-bound($medium-range)})" !default;$medium-only: "#{$screen} and (min-width:#{lower-bound($medium-range)}) and (max-width:#{upper-bound($medium-range)})" !default;$large-up: "#{$screen} and (min-width:#{lower-bound($large-range)})" !default;$large-only: "#{$screen} and (min-width:#{lower-bound($large-range)}) and (max-width:#{upper-bound($large-range)})" !default;$xlarge-up: "#{$screen} and (min-width:#{lower-bound($xlarge-range)})" !default;$xlarge-only: "#{$screen} and (min-width:#{lower-bound($xlarge-range)}) and (max-width:#{upper-bound($xlarge-range)})" !default;$xxlarge-up: "#{$screen} and (min-width:#{lower-bound($xxlarge-range)})" !default;$xxlarge-only: "#{$screen} and (min-width:#{lower-bound($xxlarge-range)}) and (max-width:#{upper-bound($xxlarge-range)})" !default; // Usage@media #{$small-up} { ... }@media #{$small-only} { ... }@media #{$medium-up} { ... }@media #{$medium-only} { ... }@media #{$large-up} { ... }@media #{$large-only} { ... }@media #{$xlarge-up} { ... }@media #{$xlarge-only} { ... }@media #{$xxlarge-up} { ... }@media #{$xxlarge-only} { ... }两种方法各有一个不爽的地方,在Bootstrap里每次都要使用max-width,在Foundation里我们需要使用插值变量这种又丑又烦的方式。显示我们需要想办法解决这些问题。
2.使用独立Mixin(With a standalone mixin)
《media queries in Sass 3.2》是CSS-Tricks里最火的文章之一,在这篇文章里Chris Coyier在借鉴a former idea by Mason Wendell和a former idea by Jeff Croft两文的基础上,如何使用sass实现响应式布局的断点管理。@mixin respond-to($breakpoint) { @if $breakpoint == "small" { @media (min-width: 767px) { @content; } } @else if $breakpoint == "medium" { @media (min-width: 992px) { @content; } } @else if $breakpoint == "large" { @media (min-width: 1200px) { @content; } }}然后,我们这样使用mixin。
@include respond-to(small) { ... }@include respond-to(medium) { ... }@include respond-to(large) { ... }这个方法是极好的(甄嬛体,老外也看?),原因有二:抽象数据有意义,大量断点集中管理。如果你想把“992px”改成“970px”,你不需要爬过每一个css文件,而只需更新mixin,然后全部更新。
3. 可配置的mixin(With a configurable mixin )
$breakpoints: ( 'small' : 767px, 'medium' : 992px, 'large' : 1200px);然后原来的mixin进行相应的修改
@mixin respond-to($breakpoint) { // Retrieves the value from the key $value: map-get($breakpoints, $breakpoint); // If the key exists in the map @if $value != null { // Prints a media query based on the value @media (min-width: $value) { @content; } } // If the key doesn't exist in the map @else { @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. " + "Please make sure it is defined in `$breakpoints` map."; }}我们在修改mixin的同时也进行了一些提高,不要小看这些提高,我们加上了错误处理,如果在maps中没有找到断点值,将会弹出一个错误提示,这将便于我们开发过程中的调试。
$breakpoints: ( 'small' : ( min-width: 767px ), 'medium' : ( min-width: 992px ), 'large' : ( min-width: 1200px )); @mixin respond-to($name) { // If the key exists in the map @if map-has-key($breakpoints, $name) { // Prints a media query based on the value @media #{inspect(map-get($breakpoints, $name))} { @content; } } // If the key doesn't exist in the map @else { @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. " + "Please make sure it is defined in `$breakpoints` map."; }}在这里,我们主要做了三个事情
4. 使用外部工具(With an external tool)
Breakpoint by Mason Wendell and Sam Richard
Breakup by Ben Scott
*-width
anyanyNo Query fallbackyepyepyepAPI complexitysimplevery simplemediumCode complexityvery simplecomplexesimpleExtraDebug modeSingularity.gs—基本上是这样,如果发现有没有涉及的,记得一定告诉我。SassMQ
// Configuration$mq-responsive: true;$mq-static-breakpoint: desktop;$mq-breakpoints: ( mobile: 320px, tablet: 740px, desktop: 980px, wide: 1300px); // Exampleselector { @include mq($from: mobile) { property: value; }}
BreakPoints
$high-tide: 500px;$ex-presidents: 600px 800px;$surfboard-width: max-width 1000px;$surfboard-height: (min-height 1000px) (orientation portrait); selector { @include breakpoint($high-tide) { property: value; }}
Breakup
$breakup-breakpoints: ( 'thin' '(max-width: 35.999em)', 'wide' '(min-width: 36em)', 'full' '(min-width: 61em)'); selector { @include breakup-block('thin') { property: value; }}
总结
我们在这篇文章里看到的这么些个方案,都有长有短,没有一个完美的方案。最后我觉得还是由你来决定怎么把握可用性和复杂性的平衡。----------------------------------------------------------
前端开发whqet,关注web前端开发,分享相关资源,欢迎点赞,欢迎拍砖。
---------------------------------------------------------------------------------------------------------
- SASS优化响应式断点管理
- SASS Mixin实现响应式布局
- bootstrap-sass 响应式网页布局
- sass实战演练04 - 响应式处理(2):最外层container的响应式宽度写法
- 项目中sass管理
- sass实战演练03 - 响应式处理(1):变量模板、mixin实战用法
- 管理Sass项目文件结构
- 管理Sass项目文件结构
- 性能优化:RxJava异步响应式编程提升响应速度
- 响应式前端设计的优化
- Fiddler 设置断点,修改服务器响应消息
- Fiddler 设置断点,修改服务器响应消息
- 管理Less/Sass项目文件结构
- Sass
- sass
- sass
- sass
- SASS
- 兼容手机和平板的Fragment
- cisco(思科)交换机操作(基本查询命令)【一】
- 开启蓝牙
- 幕后英雄的用武之地——浅谈Java内部类的四个应用场景
- 说好的幸福
- SASS优化响应式断点管理
- zip_support/unzip
- no XXX in java.library.path的解决办法
- phoenix代码分析
- 北漂梦归传智播客,成长无极限
- Windows上使用Git前需要进行的操作
- 【容易打工网】办公室礼仪 职场生存十八定律
- 半链接和关联转换
- 一个IT男的创业感言