在 CSS 中使用简写属性时,您会设置所有与它相关的属性所有值。这不是错误,只是 CSS 的工作方式。我曾多次看到它让人感到困惑。让我们揭示这个问题,希望让它更容易理解。
以下是一个示例
.module {
background-repeat: no-repeat;
background: url(lion.jpg);
/* Oops! This will repeat. */
}
简写 CSS background 属性会覆盖所有子属性。background-repeat 的默认值为 repeat,因此在简写中未声明它时,它将被设置为该默认值。
对于每个背景子属性,它都以这种方式工作
.module {
/* This will get set to `repeat` */
background-repeat: no-repeat;
/* This will get set to `0 0` */
background-position: top right;
/* This will get set to `auto auto` */
background-size: 100px;
/* This will get set to `scroll` */
background-attachment: fixed;
/* This will get set to `border-box` */
background-origin: content-box;
/* This will get set to `border-box` */
background-clip: padding-box;
/* This will get set to `transparent` */
background-color: red;
/* This will get overridden */
background-image: url(cool.png);
/* OVERRIDE */
background: url(lion.jpg);
}
对于盒子模型(及相关)内容,情况也是如此,例如
.module {
margin-right: 20px;
margin: 10px;
/* margin-right will be 10px now */
padding-top: 30px;
padding: 10px;
/* padding-top will be 10px now */
border-left: 1px;
border: 0;
/* border-left will be removed */
}
字体是另一个您可能会意外重置自己的情况
p {
/* Will get reset to what is set in shorthand (required) */
font-family: Sans-Serif;
/* Will get reset to what is set in shorthand (required) */
font-size: 24px;
/* Will get reset to `normal` */
line-height: 2;
/* Will get reset to `normal` */
font-style: italic;
/* will get reset to `normal` */
font-weight: bold;
/* will get reset to `normal` */
font-variant: small-caps;
/* OVERRIDE */
font: 16px Serif;
}
请注意,简写至少需要 font-family 和 font-size 才能工作。
列表是另一个
ul {
/* Will get reset to what is set in shorthand */
list-style-type: square;
/* Will get reset to `outside` */
list-style-position: inside;
/* Will get reset to `none` */
list-style-image: url(cooldot.png);
/* OVERRIDE */
list-style: disc;
}
flexbox 布局中的 flex 属性也是简写
.flex > span {
/* Will be reset to `auto` (or `main-size` if supported) */
flex-basis: 150px;
/* Will be reset to `1` */
flex-grow: 0;
/* Will be reset to `1` */
flex-shrink: 0;
/* OVERRIDE */
flex: auto;
}
不过,这是一个不寻常的情况,因为简写不仅重置了您可能不希望重置的内容,而且以您可能希望重置但可能不知道的方式重置了它们。 Fantasai
我们(Flexbox 规范编辑)强烈建议不要使用 'flex' 的长格式,除非您真的非常希望从其他样式规则级联 flex 设置,因此我建议以某种方式阻止使用 'flex-grow/shrink/basis'(或者,最好是将其省略或放在高级部分)。简写以适当的方式重置内容,因此将导致更少的级联错误。请使用简写!
这是一个 Pen,其中包含一些实际代码中的这些内容。
我认为您应该在这个例子中提到,还有一个“inherit”属性,这样您就可以编写例如
它将只重写 URL 和位置,但保留颜色和重复
嗯,
inherit
有特殊含义。它仍然会覆盖在同一选择器内设置的其他属性。例如div 的 background-color 将是什么? 蓝色,而不是红色.
我总是告诉我的客户和实习生在任何东西之前都放置“重置”。然后在之后添加您的样式。;)
我告诉他们底线:CSS 中下一行的任何内容都是最新的“覆盖”,就像您上面的示例一样。 :)
此外,如果使用 IE7,编写简写边距不会重置,两个边距会加在一起。
例如
一个严肃的问题,在 2015 年是否需要考虑 IE7?
并非对所有人都是这样,这取决于网站。这就是分析的作用。不幸的是,我仍然遇到很多。
恕我直言,我建议客户不要使用 IE7,因为他们的安全系统已经过时了……而 XP 也不再受支持。仅此而已。
这正是我尝试阻止人们使用简写属性的原因,除非您有意设置简写中的所有属性(在某些情况下,其中隐含的内容比您通常担心的要多)。始终在简写中设置每个属性的规范(使用
inherit
如果您愿意)也能避免在默认值不完全符合预期时出现意外行为。我认为您使用简写并没有真正节省太多空间,因为压缩会抹去很多额外的空间。
它也与文档有关。即使您知道没有设置其他背景属性,使用
background-color
也能让您清楚地了解您的意图。是的!这也是我以前经常遇到的问题。我倾向于将简写用于元素的“基本样式”,并将更具体的属性用于覆盖样式或修饰符类。对我来说通常效果很好
刚注意到 Flexbox 规范编辑的说明。是的,这几乎是我通常处理所有简写的方式。我喜欢使用它们,除非它专门用于覆盖其他内容。
@David:我认为你错了(虽然现在已经不重要了),但 IE7 对重置水平边距没有任何问题,并且不会将它们加在一起(除非存在我所不知晓的特殊情况)。
IE6/7 中有一个 margin:auto 的错误,其中元素(例如 p 元素)的默认垂直边距不会重置为零。
IE6 中还存在著名的浮动双边距错误(通过 display:inline 解决),但在 IE7 中不存在。
我原本希望能看到
cool.png
和lion.png
。它们听起来像是很酷的图像。哦,天啊。
这解释了多少麻烦……
喜欢 CSS。讨厌 CSS。喜欢 CSS。讨厌 CSS
哇,很高兴您提到了这一点!我不知道!我敢肯定,这是我许多问题的根源。我喜欢这个网站!
我有点像简写爱好者,但最近一直在尝试将简写从我的代码中剔除,主要是因为上面提到的某些原因。一篇很棒的小文章,对于任何新手(以及一些老手)来说都值得一读,作为一个小小的启示。
只有当您将简写属性放在其他长格式属性之后时,它才是一个错误
完全同意,没有考虑重置,我一直将简写属性放在长格式属性之前
问题几乎从来不是您将简写和特定属性放在不同的选择器中,并且它们以您不期望的方式应用。
在网站上进行“钓鱼”,看看选择器填充(
html body div > .allredborders
)和!important
用于克服意外的快捷方式行为的频率,这将是一项有趣的(尽管很困难的)练习。我吹毛求疵的两分钱
盒子模型的内容与其他内容不同。虽然其他内容将缺少的值重置为其初始(或默认)状态,但 border、margin 和 padding 属性不会这样做。它们只是从现有值继承假设的值。因此,我不会真的将它们归类为同一件事,因为在这种情况下,重置缺少的值始终是故意的。
此外,字体简写是唯一让人感到困惑的地方,因为字体属性会被传递到子元素中。因此,例如,如果您在“body”元素上设置了 font-size,然后在段落上设置了字体简写,您会突然看到字体大小消失,因为您期望它会被传递下来。这就是我认为字体简写应该只用于 html 元素或 body 的原因。
对于像列表简写(或您提到的许多其他内容)这样的东西,您不希望它们的值像字体属性那样被传递下去(并且它们也没有),因此在这些情况下,值重置很少(如果有的话)会成为问题。
哎呀……需要更正一下:我说在 body 上“设置 font-size”,但这不会生效,因为 font-size 是字体简写中必需的。任何其他属性(例如 font-variant)都可以更准确地说明我的观点。
从一个特定场景来看,一个稍微不同的视角:我在一个大型网站上工作(约 4 亿用户),我们非常注重性能和页面权重。该网站有很多背景色,我们用“background”而不是“background-color”声明属性,因为它短了 6 个字符。我们几乎没有背景图片,因此不必担心意外重置,如果需要,我们可以更具体地设置。
我使用的最佳实践(而且我完全同意)是使用简写,然后用完整写法覆盖它 (:D)
这样我就确定不会意外重置之前的代码
感谢您的博客!有时很容易忘记 CSS 的第一个字母 “C”,即 “Cascading”(层叠),以及 CSS 中看不见的第三个字母 “S”,即 “Specificity”(特指性)。
继续努力!
在这个例子中,
border-radius
不会重置border-radius
不在边框简写语法中。这就是它不会被重置的原因。@Homan
border-image
属性也不在border
简写中,但它们仍然会被重置。事实上,规范 明确推荐 使用边框简写来清除任何其他边框相关属性
那么为什么
border-radius
不包含在内呢?也许是因为,尽管它的名字,它不仅影响边框,还影响填充区域和任何背景。或者也许没有逻辑上的论据,只是它就是这样发生的。无论哪种方式,这都是一个值得记住的额外复杂情况。Google Chrome 帮助我使用 “开发者工具” 了解了关于 CSS 重置的信息,如您 这里所见