百分百正确设置CSS断点的方法 – Free Code Camp
gz11001
8年前
<p>接下来近一分钟里,我希望你暂且将CSS、web开发、数字化用户界面抛之脑后。</p> <p>接着,我想让你畅想时光回退,回到年少时,回到上学第一天。</p> <p>那时的你更简单,只担心画没画好图形,有没有尿裤子。</p> <p><img src="https://simg.open-open.com/show/3a68b2df9fb281eed295f697121adf42.png"></p> <p>现在,看看上图中的点,注意有些点是怎样聚在一起的,有些点又是怎样分开的?我想让你把这些点分为五组,把你认为适合的分在一起。</p> <p>开始吧,先检查下有没有人作弊,检查完后,你就可以用你那孩子般的手指沿着每组的周围画一个圆。</p> <p>你可能会画成下面这样吧?(无论你做什么,只要别告诉你啥也没做屏幕它就自己滚下去了,我不会相信的!)</p> <p><img src="https://simg.open-open.com/show/aec5df0d4b5056c2ab015f0a5b529ef6.png"></p> <p>确实,本来无论怎么划分右边的两个点都可以。我认为它们划分在一起也没错。有人说没有错误的答案,但我从来没错过,所以我也从不认可这个特别陈词滥调的说法。</p> <p>在我继续往下说之前,让我猜猜你刚才画的是否像下面这样呢?</p> <p><img src="https://simg.open-open.com/show/54d8f1464e56a2a5ce0cac99a35c3377.png"></p> <p>可能也不像,对吧?</p> <p>但如果你要将你的断点设置在能匹配流行设备的确切宽度(320px,768px,1024px)的位置,那如上图这样划分是最基本的。</p> <p><img src="https://simg.open-open.com/show/284b5404e8c3224060d5e3972d25c3ce.png"></p> <p>你曾经是否有在不经意间听过或说过下面这些话?</p> <p>中间断点应该是一直到768像素呢,还是包括768像素呢?我明白了,那就是ipad横屏的大小啊,它就是大(large)吗?哦,大(large)是768像素及其以上。我知道了,那小(small)就是320像素吗?那在0到319像素范围内的又是什么呢?难道是蚂蚁断点?</p> <p>我本可以不管上面那个问题继续告诉你正确的做法,但我发现上述方法("愚蠢的分组")却非常广泛,对此我感到十分好奇。</p> <p>为什么会这样呢?</p> <p>我认为这个问题的答案,就像很多的问题一样,归结为术语不一致。毕竟,如果你都不了解 关塔那摩湾 那些事的话,你可能还认为那里的水刑听起来超级棒。(哦, <a href="/misc/goto?guid=4959731688731843875" rel="nofollow,noindex">我希望</a> 这是我的玩笑话)</p> <p>因为我认为我们在讨论和实现断点时将"边界"和"范围"这两个术语搞混淆了。</p> <p>如果你在Sass中设置断点,你会有一个叫 $large 的变量吗?也就是768像素。</p> <p>你是把范围的下边界当作是大(large)呢,还是上边界当作是大(large)呢?如果是下边界,那么你一定不需要再有 $small 变量了,它应该就是0了,是吧?</p> <p>而如果这是上边界那么你又如何定义一个 $large-and-up 断点呢?那就必须是 min-width 为 $medium 的媒体查询,没错吧?</p> <p>当你说大(large)的时候你是指一个边界,那么我们就陷入困惑了,因为媒体查询总是一个范围。</p> <p>这种情况很混乱,弄清楚它实在很浪费时间。所以我给出三条建议:</p> <ol> <li>正确设置断点</li> </ol> <ol> <li>合理命名范围</li> </ol> <ol> <li>声明</li> </ol> <h3>Tip #1: 正确设置断点</h3> <p>那什么断点才是正确的呢?</p> <p>还记得刚才让你在上学第一天画的那些圆圈吧。我现在只是为你把它变成了矩形。</p> <p><img src="https://simg.open-open.com/show/b81144d80dda5f9a21c74240d78c63c9.png"></p> <p>如果你打算给监控巨型显示器的人显示跟其他显示器不一样的东西,那么将600像素, 900像素, 1200像素 和 1800像素设置为断点就是正确的。另提醒哟,如果你要在网上购买一个巨型显示器(giant monitor),一定要确保它确实是台计算机。</p> <p>其实刚让你回到年少时玩的那些点实际上代表14种最常见的屏幕尺寸:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/16edbd6ea9b89b3aff071de6d0a1f894.png"></p> <p>所以我们现在可以制作如下一张漂亮的小图片方便让商人,设计师,开发人员,测试人员之间进行畅通无阻的交流啦。</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/cc64de54341f1480e449e3d6b6684dd9.png"></p> <p>我突然有点后悔选择了橘色和绿色搭配,但我不会重新再做这些图片的。</p> <h3>Tip #2: 合理命名范围</h3> <p>当然,只要你喜欢,你可以命名断点为 熊爸爸和熊宝宝 。但如果我正要坐下和设计人员讨论网站在不同设备上应该如何显示的时候,我希望这个命名能让大家很快明白,尽快结束讨论。如果为了方便命名为某个大小的平板电脑,那我就完蛋了。真见鬼,你甚至命名为"iPad平板电脑(iPad portrait)"都比那名字好。</p> <p>"但是外观在时刻变化!"你也许会反驳说,"手机越变越大,平板越变越小"。</p> <p>但你网站的CSS能用三年(除非它是Gmail)。三年iPad已经换了两代,CSS都还能用。大家肯定都知道,苹果已不再制造新产品,只是在已有的东西(按钮、孔啊等等)上删减而已。</p> <p>所以亲们啊,1024 x 768的分辨率会保留的。别用沙子埋了脑子(有趣的事实:鸵鸟没在城市生活是因为没沙子来躲避捕食者)。</p> <p>结论:沟通很重要,命名时要合理,使用有用的词汇。</p> <h3>Tip #3: 声明</h3> <p>我知道,我知道,又在重复 “声明”这个词了。我换种方式说明:你的css应该定义它想要发生的事情,而不是它应该怎样发生。因为怎样发生应该隐藏于某种混合(mixin)里。</p> <p>早前,围绕断点的讨论有部分略显混乱,把适用于范围的命名乱用于定义一个范围边界的变量。如果 large 是一个范围那么简单地使用 $large: 600px 是没有意义的。就像是说 var coordinates = 4; 。</p> <p>所以我们可以在一个混合(mixin)里隐藏这些细节的实现而不是直接在代码里暴露它们,或者我们可以想个更好的方法完全不使用变量。</p> <p>首先我给出下面片段做为一个简单的例子。但我真的认为它涵盖了所有的基础。看个实际应用, 查看在codeopen上的pen .我使用Sass是因为我不能想象没有它怎么建设网站,这样的逻辑同样适用于CSS或Less。</p> <p>`@mixin for-phone-only { @media (max-width: 599px) { @content; } } @mixin for-tablet-portrait-up { @media (min-width: 600px) { @content; } } @mixin for-tablet-landscape-up { @media (min-width: 900px) { @content; } } @mixin for-desktop-up { @media (min-width: 1200px) { @content; } } @mixin for-big-desktop-up { @media (min-width: 1800px) { @content; } }</p> <p>// usage .my-box { padding: 10px; @include for-desktop-up { padding: 20px; } } `</p> <p>我可能有点偏见,但这些CSS的声明真的超级棒。</p> <p>请注意,我强迫开发人员要指定 -up 或者 -only 做为后缀。</p> <p>歧义滋生混乱</p> <p>上述代码一个明显的诟病可能是没有处理自定义媒体查询。各位,这是好消息啊。如果你想定义一个自定义媒体查询,就写一个自定义媒体查询(在实践中,如果我需要实现比上面更复杂的效果,那为了减少损失我会义无反顾地选择使用 Susy 工具包)</p> <p>另一个诟病可能是我上面用了8个混合(mixin)。当然使用单个混合(mixin)会更符合正常习惯,然后只需传递所需的大小,像这样: ` @mixin for-size($size) { @if $size == phone-only { @media (max-width: 599px) { @content; } } @else if $size == tablet-portrait-up { @media (min-width: 600px) { @content; } } @else if $size == tablet-landscape-up { @media (min-width: 900px) { @content; } } @else if $size == desktop-up {</p> <pre> <code class="language-css">@media (min-width: 1200px) { @content; } } @else if $size == big-desktop-up { @media (min-width: 1800px) { @content; } }</code></pre> <p>} // usage .my-box { padding: 10px; @include for-size(desktop-up) { padding: 20px; } } ` 当然,这能行得通。但如果你传入不受支持的命名在编译时并不会报错。而且仅仅为了传递一个Sass变量到混合(mixin)开关中,却会暴露8个变量。</p> <p>更不用说 @include for-desktop-up {...} 语法比 @include for-size(desktop-up) {...} 漂亮多了。</p> <p>两段代码片段的诟病可能是我输出了两次900px,还有899px。当然也许我应该只使用变量然后在需要的时候让变量减1。</p> <p>但如果你想那样做,简直令人发狂。但我不这么做,有两个原因:</p> <ol> <li> <p>这些不会经常改变,这些数字也不是在代码库任何其他地方都会使用。实际上它们不是变量也不会造成问题——除非你想在你的页面中将你的Sass断点暴露给一个脚本,而该脚本注入了带有这些变量的JS对象。</p> </li> <li> <p>The syntax is <em>nasty</em> when you want to turn numbers into strings with Sass. Below is the price you pay for believing that repeating a number twice is the worst of all evils: 用Sass把数字转为字符串的语法很令人讨厌。如果你认为重复一个数字两次是最差的选择,那你会为此付出这些代价。 ` @mixin for-size($range) { $phone-upper-boundary: 600px; $tablet-portrait-upper-boundary: 900px; $tablet-landscape-upper-boundary: 1200px; $desktop-upper-boundary: 1800px; @if $range == phone-only { @media (max-width: #{$phone-upper-boundary - 1}) { @content; } } @else if $range == tablet-portrait-up { @media (min-width: $phone-upper-boundary) { @content; } } @else if $range == tablet-landscape-up { @media (min-width: $tablet-landscape-upper-boundary) { @content; } } @else if $range == desktop-up { @media (min-width: $tablet-landscape-upper-boundary) { @content; } } @else if $range == big-desktop-up { @media (min-width: $desktop-upper-boundary) { @content; } } }</p> </li> </ol> <p>// usage .my-box { padding: 10px; @include for-size(desktop-up) { padding: 20px; } } `</p> <p>理解起来会更容易了呢,还是更难呢?</p> <p>哦,在前面几个段落我言辞有些激昂...因为我为有些傻瓜感到可怜,因为他们做些让人费解的事,比如将断点存储在一个Sass列表里然后循环输出媒体查询,或做些荒谬的事让接手的开发人员难以理解和维护。</p> <p>越复杂越容易出现bug</p> <p>最后,你也许会想“我难道不应该将断点设在内容而不是设备的基础上吗?”我很惊讶你能想到这点,答案是肯定的...但前提是对一个布局单一的网站而言。如果你想要多种布局,你就要为每种布局设置一个断点。哦,还有除非你的网站设计不经常变化,或者你很乐意在网站设计更新时也更新断点,因为你想让它们设置在内容的基础上嘛,对吧?</p> <p>对于复杂的网站,建议网站少设置一些断点,你才会更轻松。</p> <p>好了,我已经说完了!但这篇文章没有我想要的那么令人毛骨悚然,让我看看能想到什么借口,包括一些。。。。</p> <p>哦,我知道了!</p> <p>###断点开发奖励提示</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/835db1529ecfda9dc0822b16178060c1.png"></p> <p>是的,即使是 flickr 都设置了768到1400的断点。</p> <ol> <li> <p>如果你需要体验比你现在坐着的这台显示器更大的屏幕尺寸的CSS断点,可以在Chrome 开发工具里使用"responsive"模式,键入你喜欢的任何尺寸。</p> </li> <li> <p>蓝色栏显示媒体查询"max-width",橘色栏显示媒体查询"min-width",绿色栏显示媒体查询的MIN和MAX</p> </li> <li> <p>点击媒体查询把屏幕设置到该尺寸,如果你多次点击绿色的媒体查询,它会在最大和最小间切换显示。</p> </li> <li> <p>在媒体查询栏右键单击某一个媒体查询可以看到该媒体查询在CSS规则中的定义。</p> </li> </ol> <p> </p> <p>来自:http://www.zcfy.cc/article/the-100-correct-way-to-do-css-breakpoints-free-code-camp-2083.html</p> <p> </p>