Magic Numbers in CSS

尽管名字听起来很有趣,魔力数是一个坏事情。他是一种老的“未命名数字常量”的学院派处理方法。因此,一些可能是对样式至关重要的数字“扑通”沉进代码里,但是却对那些不怎么熟悉这部分代码的人来说,十分难去理解为什么去这么做。CSS 和未命名常量一起载入进来,但是他们通常和其他样式成对出现,而且有上下文关联,所以看来有点神秘。尽管我们一直能看到CSS中的魔力数,但是他们还是不好的。

CSS中的魔力数通常在某些特定的场景下生效,但是很脆弱,换了个场景他很就很容易失效。他们通常和字体在某种程度上有关。他们通常被一个只在自己的浏览器中,理想环境下测试的人创造。让我们看一些例子来让我们了解他们究竟是什么,并且希望能在未来避免他们。


看看这个tab的例子:

图片 tab1

每一个tab都被设置成width:100px;.在这个例子中100px就是我们所说的神奇数。很可能各种错误都会因此发生。简单点加上另外一个有着常温本长文本的tab就能解释了:

图片tab2

有点奇怪,并且是我们不希望看到的结果。我们可以用white-space: nowrap来防止文字换行,但是结果可能更糟糕:

图片3

如果用min-width来代替的话,我们的tabs可能不那么容易崩溃:

图片4

或者干脆不设定width:

图片5

当然,如果你坚定地要把所有tab的大小统一,你可以这样overflow:hiddentext-overflow:ellipsis,大概就会是这样:

图片tab6

在这种情况下,你可能就需要一个title属性来用某种方式显示整个tab的名称。你可能觉得这可以在CMS中直接限定tab的字符长度来防止这样的事情发生。但是如果用户他在客户端为了方便增大了字体大小呢?这会让他们很受伤。

在最近一个叫Line-On-Sides Headers的post中,我使用的line-height值也是一个魔力数。我让你在有有着华丽的@font-face属性的文本中使用这个技术。假设这个字体没有被载入或者用户覆盖了他或者用户的浏览器根本不支持这个属性。那么后备的字体就会被载入。后备字体可能和我们定制的大小相差很多,那么使用后备的字体后,行就会被摆出一种奇怪的样式,不是我们想要的居中样式。魔力数跪了。

图片font1

这个特别的例子有点做作,但是我肯定你已经见过很多有着超夸张的X字高的定制字体。

小科普,X字高是,或corpus size 是指字母的基本高度,精确地说,就是基线(baseline)和主线之间的距离,是字体设计的重要因素。
在西文的具体字体以及排版术语中,x字高通常被称为一个 ex,这和把大写字母M宽度称为一个em的习惯类似。


假设你有一堆有着不同多内容的盒子模型。你想把他们排列整齐进入一个网格,就把他们float: left;了,有点乱:

图片grid-mess

如果他们有同样的高度你就不用愁了!

图片grid2

这样的前提是,如果用户在浏览网站时用的恰巧是和你一样的字体设置。但是用户可以变啊。

图片chrome-settings

现在就像一个忧伤的长号:

图片trombone

使用min-height代替可以防止这样的重叠的尴尬,但那是盒子将会形状不同并且浮动问题会再次出现。我不打算在解决方案上花太多力气因为现在已经够抽象的了,但是你也许可以在盒子里使用滚动条,或者用一些JavaScript来调整大小,或者用其他的样式。


Harry Roberts 指出了一个典型的在CSS中使用了魔力数的例子
<pre>
.site-nav > li:hover .dropdown {
position: absolute;
top: 37px;
left: 0;
}
</pre>

这本该是一个CSS控制的下拉框。菜单只有在父元素被hover上时被打开,下拉框出现。他应当在父菜单的下面。写这个代码的开发者在他当时的浏览器中,这个菜单确实是37px的高度。我敢确定你能想象出这不可能永远都是对的。37px是一个魔力数。Harry建议使用top: 100%来取代,这个属性的意思是从顶部开始计算,相比起来不容易出差错。


在文章Fighting the Space Between Inline-Block Elements中,-4px是一个可以除掉分割的数字。那绝对是一个神奇数。4px只有在默认16px下的某些情况可以解决这些问题。

换一个类似Monaco的字体?你跪了。换大一点或者小一点的字体呢?你还是跪了。

See that article for other fixes.
看看这篇文章的补救方法。

定义的困惑

Because we're trying to say "don't use these," it is important we we define the term properly as it relates to CSS. I've seen a number of threads in the past where not everyone is on the same page. (1) (2) (3).
因为我们一直在说“别这么干”,如何去正确区分他们也是相当重要的。我看到过去有很多的问题上大家对于魔力数的定性意见不一。

这里有一些例子:

-webkit-transform: translateZ(0);
魔力数?不。这只是性能调优的一个hack。

.parent { 
    padding: 22px;
}
.child {
  bottom: 22px;
  left: 22px;
}

魔力数?不是。这数字的确奇怪但是不属于那个范畴。子元素被定位于底部左边的元素,sams-padding.因为这些数字互相匹配,所以他们在一起就会make-sense。如果数字都不相同的话,那么就意味着很可能和字体大小等有一点关系,也很可能就是一个魔力数。

top: 37px;
假设这是一个魔力数,就像上面提到的下拉框例子。我们能用Sass解决他么?

$topDistance: 37px;

.dropdown {
  top: $topDistance;
}

这就不再是一个“未命名”的变量了,但是就因为我们命名了它?他依然是个CSS中的魔力数,并且和原来的看起来一样奇怪。

letter-spacing: -.05em;
魔力数?不。如果它是用px的话很可能是,因为像素的值是不变的常量所以他的变化是依据现在的字体大小。Huge font-size, barely any change, small font-size, big change(这句还是英文比较顺口)。因为em是相关联的,所以没那么容易出差错。

所以结论是
我不喜欢这样的blog 但是对于那些“仅此适用”的东西,这也是一个不错的吐嘈。

WordPress 的CSS 代码规范说你不该学他们。还有什么其他的?
如果你在适用icon 字体,记住他们是字体,所以他们会变换大小。你不能为他们设一个px 的值来“保留空间”,因为字体大小会变但是px 的值也许会不工作。
我愿意更新这些有趣的使用魔力数导致跪了的例子,请跟去原文评论。
如果你尝试居中一个图片和文本的时候,vertical-align这个属性干得不错,但是我发现总有1px左右的偏差, 所以我写postion: relative; top: 1px;来矫正。这是个魔力数吗?不太确定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容