在 HTML 中,从其他地方引用的文本块标记如下
<blockquote>Hey, I'm a block of text from elsewhere.</blockquote>
在您的 CSS 中,您可能对它们有特殊的样式。 也许一点点 background
和 padding
blockquote { padding: 10px; background: #eee; }
如果引用包含多个段落,则可能在引用块中嵌套段落(两者都是块级元素,因此可以)。 引号也可能位于较大的文本区域内,因此我们假设它周围有段落
<p>Preceding paragraph</p>
<blockquote>
<p>Hey, I'm a block of text from elsewhere.</p>
<p>And I'm another one.</p>
</blockquote>
<p>Succeeding paragraph</p>
当然,我们需要在这些块之后留出一些间距,这样段落才有呼吸空间,看起来像段落
blockquote, p { margin-bottom: 20px; }
现在我们遇到了一个经典问题。 引用块内部最后一个段落的 margin
将向下推引用块的大小,使引用周围的空间不均匀。
可以通过从引用块内的最后一个段落中删除底部填充来解决此问题。
blockquote p:last-child { margin-bottom: 0; }
请注意,:last-child 在几乎所有内容中都受支持,除了 IE 8 及更低版本。 如果这是一个大问题,尝试此方法。
或者,为了获得更好的浏览器支持,而无需使用 JavaScript,您可以通过使用以下方法获得 IE7/IE8 支持
blockquote, p { margin-top: 20px; }
blockquote p:first-child { margin-top: 0; }
… 因为这两个浏览器支持 :first-child
但不支持 :last-child
。
合并边距
请注意,以上情况只有在您对引用块使用 padding
或 border
时才会生效。 如果您只使用边距,则永远不会出现此问题。 包含 20px 底部边距的段落,位于具有 20px 底部边距的引用块中,仍然只会将其南部邻居向外推 20px。 这不是错误,而是正常的边距合并。 如果你想了解更多 Andy Budd 有七年前的一篇文章,其中包含您想了解的有关边距合并的所有内容。
现在,* { margin:0; padding:0; } 会不会取消该引用块/p 组合的边距和填充?
他已经在 CSS 中写了这些 :)
https://css-tricks.org.cn/examples/BlockquoteDouble/css/style.css
当您没有为引用块指定 css 属性时,将使用通用选择器 (*); 但当您指定它时,它将覆盖 * 属性并使用定义的属性,即 margin-bottom:20px
这让我抓狂。 为什么要 IE 开发人员认为“好的,现在我们将实现 first-child,但让我们不要理会 last-child”? 我看不出有什么好的理由,除了冷漠。 Grrr。
不过感谢你的文章,值得思考。 我可能会试一下 IE7.js。 目前我不会理会 last-child,我只在需要的地方使用 .last 类。 我宁愿用 CSS 做,但我从未发现它值得花时间去让 IE 正常工作。
你知道第一个孩子会得到所有的关注:P
我同意。
一定是有哪个混蛋做出了这个决定。
我也认为 CSS 重置会避免这个问题,不是吗?
不,不会,因为额外空间来自段落标签位于引用块中,而且您(假设担任设计师的角色)定义了引用块和段落具有 x 的边距,因此两个元素的边距/填充加在一起(形成 2x),因此要更正这一点,需要从其中一个元素中删除边距/填充,以便它符合设计。
感谢您的解答,但 IE7.js 仅适用于 IE7 而不适用于 IE6 吗?
这是一个有点误导性的名称,因为实际上 IE7.js 可以与 IE6、7 和 8 一起使用。 但是请注意。 当我第一次开始处理 CSS 并且感觉到了 CSS 布局在任何 MS 浏览器中都会断裂的令人沮丧的熟悉感觉时,我读到了有关 IE7.js 脚本的内容,并认为我所有的生日都到了。 它似乎承诺修复 IE 中 CSS 的任何问题。 我认为从现在起我所有的网站都将变得轻而易举。 从那时起,我发现实际上我最好使用条件注释和特定解决方法,因为奇怪的是,我大多数布局在应用 IE7.js 后反而比以前更糟糕了。 现在,这可能是由于我自己的知识有缺陷,但在我不太专业的眼光看来,它似乎引入了以前没有的新问题,而且似乎找到其他解决方案会让我少受折磨,少掉头发。 虽然我很乐意了解其他情况。
很棒。
非常有用的信息。
我在我的 CSS 排版框架 Azbuka http://code.google.com/p/azbuka/ 中遇到了类似的问题。 我使用了这个解决方案:blockquote > p { padding:0;}
我一直发现前面的空间比后面的空间更有用且更可靠。 底部边距并不友好。
听起来问题出在“p”标签上,我很久以前就不再使用它了。 总体来说毫无用处。
p 标签没有问题,也不建议不使用它们。
真的吗? 您的设计中没有段落? 嗯…… 我想你在开玩笑
我觉得我有点不明白,但这似乎是一个重置问题。
以下是如何解决这个问题
http://jsbin.com/ulove4
这甚至不是一个重置问题,对吧? 只有当您想通过设置 p 标签样式来定义引用块内所有空白时,“问题”才会出现。 Cory 的示例在引用块和 p 标签之间共享空间。 在实践中,您的示例或 :first-child 都可以使用。
这不是一个重置问题,也不是类似问题。 只是如果内部元素有边距,那么外部容器的填充不会合并…… 就这么简单。 一个解决方案是在内部 p 标签上使用 margin-top。 这样您就可以在第一个 p 标签上使用 :first-child。
太棒了。 非常感谢。
感谢 Mike 和 Norman。 弄清楚了“问题”。
不错的引用块示例,能够设置 p 标签的样式总是件好事,而且我喜欢这些解决方案,谢谢。 LT
IE 7 和 8 实现了 :first-child 但没有实现 :last-child?! 哇。 你每天都会学到新东西!
好吧,:last-child 实际上是 CSS3,因此当然 < IE8 没有实现它。
总是落后一步
使用相邻选择器来选择与其他元素相邻的元素是相当合乎逻辑的
效果很好,也很容易
它不会与 IE6 兼容,是吗?
…就像此页面上的任何其他情况一样,ie7.js(名称中的内容)以及可能给出的解决方案。但你绝对是对的,说到点子上了!
因此,在此页面上的所有解决方案中,没有一个是针对 IE6 设计的(毫无疑问,它们可能会起作用),但至少这个解决方案在语义上是正确的,并且不是一个 hack…
如果你担心 IE 中的 CSS 选择器,请尝试使用这个作品。它还提供了 CSS3 选择器,并与许多 js 库一起使用:http://selectivizr.com/(以前称为 ie-css3.js)。
我建议完全避免使用块引用,或者确保它没有样式,这样只有 p 才有控制权,这样更干净,你不太可能在以后发现意外的缺点。
你好!
关于简单设置
blockquote { padding-bottom: 0; background: #eee; }
?
你需要至少一个像素,否则最后一个 p 标签的边距将折叠,导致 p 和 blockquote 之间没有填充
我倾向于坚持博客文章中提供的 :last-child 解决方案。
顺便说一下,只是一件小事 - 为了使标记验证,blockquote 中的内容需要放在块级元素内。因此,你的第一个代码示例将无法验证。
它确实可以作为 HTML5 验证,这也是此页面 doctype 的内容。我的第一反应是一样的,我不得不说。但我检查了测试页面,结果发现…
也许 Chris 可以在这篇文章中提一下?
哦,这对我来说是个新闻!感谢你指出这一点。
如何系统地将段落放在块引用中,无论有多少个段落?这样你就可以只设置块引用的顶部填充和块引用 p 的底部边距
blockquote { padding-top:10px }
blockquote p { margin-bottom:10px }
根据图片
不是块引用的默认 padding-bottom CSS 属性导致了“太多空间”吗?
在你的示例中:blockquote, p { margin-bottom: 20px; } 逗号是否不需要,实际上应该是一个空格,这样声明只影响块引用中的段落?
令人惊讶的是,我已经自己解决了这个问题!包括 :first-child/:last-child 错误…哇,IE,真的吗?
我想说我正在成为一名网页开发者!
我想在块引用 CSS 中显示 CSS