媒体查询本身就很棒。Sass 中的媒体查询也很棒。Sass 3.2 中的媒体查询将变得**非常**棒。以下是如何让 CodeKit 开始使用它。
这不是一个全新的想法。Ben Schwarz 在 7 分钟的精彩视频 中向我们展示了它的工作原理(7 个月前)。Jeff Croft 写过关于它(4 个月前)。Mason Wendell 写过关于它(3 个月前)。
魔法就在这里
您已经在 Sass 的稳定版本(3.1.2)中可以做到这一点
.column-1-3 {
width: 33.3333%;
@media (max-width: 600px) {
width: 100%;
}
}
Sass 会将其转换为如下有效的 CSS
.column-1-3 {
width: 33.3333%;
}
@media (max-width: 600px) {
.column-1-3 {
width: 100%;
}
}
但是您可能希望在 CSS 中**多次多次**这样做,因为在编写时它非常方便且很有意义(而不是将它们全部放在最后,这会破坏认知关联)。
现在您陷入了重复代码的困境,而 Sass 正是为了帮助我们避免这种情况而存在的。在 Sass 3.2(处于 alpha 阶段并且已经持续很长时间了)中,有一个解决方案。我们可以编写一个@mixin
,它允许我们为媒体查询“命名”。
我
- 喜欢将媒体查询称为“断点”
- 不喜欢根据任何特定内容为其命名,例如“iPad”
- 喜欢童话般的比喻
所以,我这样编写我的 mixin
@mixin breakpoint($point) {
@if $point == papa-bear {
@media (max-width: 1600px) { @content; }
}
@else if $point == mama-bear {
@media (max-width: 1250px) { @content; }
}
@else if $point == baby-bear {
@media (max-width: 650px) { @content; }
}
}
现在我可以编写如下代码
.page-wrap {
width: 75%;
@include breakpoint(papa-bear) { width: 60%; }
@include breakpoint(mama-bear) { width: 80%; }
@include breakpoint(baby-bear) { width: 95%; }
}
它将按我想要的方式工作。很酷吧?(注意:这完全是说明要点的人为代码,用法取决于项目)
但是如果你使用 CodeKit 呢?
CodeKit 仅附带 Sass 的稳定版本,目前尚不支持此功能。我不知道 Sass 3.2 何时会进入稳定版。至少已经 7 个月了,我个人很着急想让它运行起来。值得庆幸的是,CodeKit 最近发布了一个新功能,使这成为可能。
从 CodeKit 1.2 版(6449)开始,您现在可以告诉 CodeKit 使用外部编译器

以下是使用方法
- 确保您至少拥有该版本的 CodeKit
- 打开终端
- 键入
rvm system
。我不知道这到底做了什么,但 CodeKit 无法处理安装在 rvm 目录中的 Sass。 - 然后使用命令
sudo gem install sass --pre
安装 Sass 3.2 - 您可能需要输入密码。 - Sass 现在应该安装在 /usr/bin/ 目录下
- 打开 CodeKit 首选项,然后转到语言和 Sass/Scss
- 在高级编译器设置下单击选择…
- 选择该目录中的 Sass 文件
搞定。请注意,现在您将负责保持 Sass 更新。但最终,Sass 将发布 3.2 的最终版本,CodeKit 将随之更新,我们可以返回使用内部编译器。
尽情享受吧!用这种方式处理媒体查询确实令人愉快。感谢 Christopher Eppstein 对我的帮助。这提醒了我,您也可以对 Compass 做完全相同的事情,只需sudo gem install compass
并将 CodeKit 指向它即可。
这就是 Sass 胜过 Less 的原因。无需多言。
同意。我仍然使用 LESS(并且打算在新的 SASS 版本发布之前继续使用),因为它拥有更好的教程和网站。然后我会切换,但我仍然希望 SASS 能拥有更好的网站/教程。
我同意 Sam 的观点。SASS 文档不如 LESS 发达,这使得学习曲线更加陡峭。在此之前,它将仍然是 LESS 的二流选择。
我想使用 Zurb 的新 needs-3.2-SASS 版本的 Foundation,但我还需要以与之前更新 SASS 相同的方式更新 CodeKit 中的 Compass,然后这些新的媒体查询才能生效。
希望这对其他使用 Foundation、SASS 3.2、Compass 和 CodeKit 的人有所帮助。
Less 在 1.3 中添加了 @media 冒泡,工作方式相同,语法相同。 https://github.com/cloudhead/less.js/blob/master/CHANGELOG
仅供参考:Less 也能做到这一点。我已经使用 CodeKit 使用了几个月了。它非常方便,尤其是在您将断点设置为易于记忆的变量时。
这种技术的问题在于,您最终会得到一个 CSS 文件,其中包含数十个重复的媒体查询断点。断点过多会导致渲染速度变慢。
我正在等待一个编译器,嗯,将所有不同的媒体查询断点编译成一个语句。不确定这是否会发生。
合并媒体查询的问题在于它会更改声明的顺序,并且您可能会最终覆盖您的样式,因为它们的顺序错误。
在使用
@extend
时偶尔发生这种情况已经够糟糕了。这会将问题升级到一个全新的水平。我编写了一些代码,您可以在编译成 CSS 后运行它来解决此问题。您可以在 GitHub 上找到存储库。我仍在完善确保所有断点都按正确顺序应用的过程,但它可能对您有所帮助。我已经将其设置为在使用 Live Reload 编译后自动运行。
使用 Jeremy Worboys 的这些示例,在 {LESS} 中可以使用
执行以下操作:(将两个媒体查询都放在编译后的 .css 文件的末尾)
因为当我尝试使用 {LESS} 编译器时,最终代码如下
它们重复了 min-width 40em。
很棒的东西。我刚开始接触 SASS,并且非常喜欢看到这样的东西。感谢 Chris,我迫不及待地想看到 Kickstarter 屏幕截图开始滚动。
试试这位伟大的 Eric Meyer 的作品: http://susy.oddbird.net/
你以后会感谢我的。
我发现,尤其是在响应式设计中,网格往往会限制您的功能和自由度。此外,使用 mixin 为不同尺寸的屏幕创建自己的基本网格,通过 Sass 变得更加容易!
我倾向于同意 Terence 的观点 - 如果您正在寻找响应式网格,Susy 看起来是一个很棒的系统……但我认为完全放弃网格可以为您提供一些非常有创意的解决方案,以随着页面宽度的增加扩展内容。
这篇文章激励我使用 SASS。我很久以来都没有好好了解 SASS。但在阅读了这篇文章后,我开始考虑使用 SASS。我从未想过 SASS 能做到什么。感谢这篇文章!
-ikay
很棒的建议.. 我会自己考虑一下。
很棒的文章 Chris!现在很高兴尝试一下。
关于“rvm system”的一点说明,Mac OS X预装了Ruby,版本为1.8(.x?)。rvm是Ruby版本管理器,您可能在某个时间点安装了它,以便使用更新的版本,比如1.9.1。由于某种原因,sass 3.2或CodeKit与已安装的rvm版本的Ruby不兼容。输入“rvm system”会告诉您的电脑/rvm使用系统预装的Ruby版本,而不是rvm的较新版本。请注意,这可能会干扰您为1.9和其他更新版本安装的其他内容,因此您可能需要在某个时间点切换回来。任何执行此操作的人,您可能需要弄清楚您还使用了哪些需要rvm的内容,以便知道何时切换到哪个版本。
在使用了一段时间的Less之后,我刚刚开始学习Sass、Compass和Susy。和其他开发者一样,我看到了Sass的强大功能。很棒的功能。希望它值得一试!
“.net magazine”的读者可能会想知道,几个月前我也有介绍Sass 3.2媒体查询(得到了尊敬的Eppstein先生的意见)。由于出版时间(印刷版等),它刚刚出现在目前的印刷版中。目前,它在netmagazine.com网站上进行推广。此外,Sass 3.2还可以与LiveReload(我认为是beta 3.16)愉快地配合使用。
有一点是肯定的:一旦你使用3.2媒体查询混合器完成了一些响应式网站,你就永远不会再回头了。
在SCSS中,您还可以像这样设置断点
然后…
稍微简单一点?可能没什么区别……除非有人能指出区别?
我已经这样做了有一段时间了,它似乎可以完成工作。
虽然我渴望能够将所有元素等在单个断点变量下编译到最终CSS表的单个部分。
这很酷,但是如果您的媒体查询更复杂怎么办?
仅仅使用变量是不够的,最好将整个媒体查询作为变量。我想像我上面这样的教程应该用这样的例子来更强有力地说明这一点。
是的,这几乎就是我想要的反馈。说得好。
Chris,对于“如果媒体查询更复杂怎么办”的答案是Breakpoint
http://github.com/canarymason/breakpoint
Compass扩展,用于超级简单的媒体查询,基本上是前面提到的变量方法,但具有创建超级复杂媒体查询的功能。查看一下。
有趣。我最近参加了一个关于*另一个*Breakpoint库的演示——https://github.com/lesjames/breakpoint。
它可能与您提到的断点方法类似,但它具有基于网格的优势——因此,您无需计算宽度并使用变量,只需确定特定布局需要多少列,它就会为您计算。例如
我还没有尝试过(没有使用Sass 3.2,在Windows上),但作者的演示非常棒。
我正在尝试集成这种技术(感谢Chris,它很棒!),但我很难处理视网膜目标媒体查询。
这无法编译。如果有人知道原因。或者它是否可以使用Sass实现。
没关系,我终于解决了。
因此,执行此操作会为每个选择器输出多个@media查询。您是否进行过性能测试,以查看对相同断点使用多个媒体查询是否优于对每个断点使用单个媒体查询?
例如
如果您的每个CSS选择器都包含它,那会不会影响性能?我假设每个断点一个媒体查询是有原因的,它是事实上的标准。
我想我错过了Jeremy关于他的Sassy Media编译器的帖子。看起来很棒!如果他能将其构建到Sublime Text插件中,那将非常棒!
嗨,Brian,我已经在GitHub上为Sublime Text 2插件打开了一个新的问题。我希望了解您希望如何与该插件交互。
非常期待这个Sublime Text插件(假设其他人知道如何实现它)。
嗨,David,我将编写这个插件。如果您访问GitHub上的问题,您将看到Brian和我关于如何运行它的讨论。请随时发表您的意见。
“这提醒了我,您可以使用Compass做完全相同的事情,只需sudo gem install compass并将CodeKit指向它即可。”
这简直救了我一命。
我从未成功使用过Compass插件。整个Compass插件世界又重新打开了。哇哦。
Codekit + Adobe Shadow + Dev Tools + Sublime Text。
现在的工具真是太棒了。
Jeff,您提到的这套工具确实很棒,我同意。我知道Codekit、Adobe Shadow和Sublime Text,但是Dev Tools是什么?
我猜您指的是WebKit开发工具吧?
这可以应用于移动优先方法吗?我的意思是,媒体查询是否仅放置在一个特殊的css文件中,用于支持媒体查询的浏览器,同时创建一个固定宽度的IE版本?如果我所说的有任何意义。
顺便说一句,如果您使用的是Foundation 3,则如果您想将CodeKit指向外部Compass编译器,则需要使用0.13.alpha.x版本的Compass。当Compass正式发布此版本并且CodeKit包含此编译器时,您可以直接使用CodeKit的编译器。
执行
sudo gem install compass --pre
以获取最新版本。对我来说,Sass和Compass没有安装到/usr/bin目录,而是安装到了/Library/Ruby/Gems/1.8/gems/[sass/compass版本]/bin目录
我按照上述说明在Codekit中使用Sass 3.2(感谢Chris),看起来一切顺利……除了我认为Codekit没有真正使用Sass 3.2。占位符选择器功能不起作用,即:无法对%classname进行@extend。
Codekit似乎使用了新的Sass路径,并显示它正在使用/usr/bin/sass,当使用sass –version测试时,它确实是3.2.0.alpha.277。
有人能猜到我可能哪里做错了吗?提前感谢!
为了永久记录我的愚蠢行为:我使用了@extend .placeholder而不是@extend %placeholder。更新Sass和Compass确实有效。
我没有使用断点,而是称之为respond-to,并且有一个默认选项和一个平板电脑选项
对我来说不起作用……我收到以下错误
无效的CSS,在“…ond-to(tablet) ”之后:预期为“}”,实际为“{width:60%;}”
这是我的代码
然后我在下面调用它
呃,respond-to(tablet)
我的CSS中拼写正确,我只是在评论中拼写错了。
搞定了。我使用的是Sass 3.1,需要升级才能使其工作。
有没有办法在编译后的CSS中将所有这些断点合并到一个非常大的部分?我的意思是,有没有办法设置样式表中的位置,将所有这些内容粘贴在一起,比如……一个“响应式”部分?此外,如果多个类使用相同的断点,是否有办法将它们编译成一个查询?
嗨,Daniel,我也想知道这个。刚刚开始使用此页面上的代码片段,但它只是将多个媒体查询一个接一个地输出,即使它们是相同的断点。
$small:480;
$med:720;
$large:1280;
@mixin breakpoint($point, $dir: min) {
@media (#{$dir}-width: $point) {
@content;
}
}