在 CSS 中频繁使用“位置”标签而不是使用“边距”和“填充”标签是不是有任何限制?

Posted

技术标签:

【中文标题】在 CSS 中频繁使用“位置”标签而不是使用“边距”和“填充”标签是不是有任何限制?【英文标题】:Are there any limitations of frequently using "position" tag in CSS instead of using "margin" and "padding" tags?在 CSS 中频繁使用“位置”标签而不是使用“边距”和“填充”标签是否有任何限制? 【发布时间】:2017-10-30 03:22:17 【问题描述】:

我使用 html 和 CSS 已经有一段时间了。 每次我在 CSS 中工作时,我都会感觉自己没有“做对”。

例如,在网页上定位不同的 div 和元素时,我经常使用“位置:绝对”和“位置:相对”。 这有时会非常乏味地找到“正确”的位置,并导致非常难看的数字,例如:

position: relative; 
width: 1300px; 
height: -720px;

除了上述之外,如果我改变对它们的外观或位置的想法,以后编辑上述 div 和元素也会变得非常困难。 我在 YouTube 上看过很多教程,人们使用“margin”和“padding”标签来定位他们网站上的元素。

我对此感到非常困惑,因为这些标签应该用于在元素周围创建空间,而不是实际改变它们的位置。 奇怪的是,稍后使用“margin”和“padding”标签编辑网站要容易得多,如果您改变了对这些元素的外观/位置的看法,因为它们不会四处移动并相互重叠.

对于冗长的查询,我深表歉意,但最近这一直困扰着我,我将不胜感激有关 CSS 中元素定位的任何建议。

谢谢

【问题讨论】:

使用 CSS 应用布局有很多不同的方法,不同的技术对不同的事物有用。 Flexbox 和 Grid 通常比边距、填充或定位更有用。您确实没有足够具体的问题来给出一个好的答案。 尝试花一些时间学习引导程序。 【参考方案1】:

positionmarginpadding最大的区别在于,当你将position设置为absoluterelativefixed时,该元素是从“正常流”中取出的" 并放置在其自己的图层中。这就是允许您使用z-index 属性并将元素堆叠在一起的原因。当相关元素将被动态调整大小或动画时,这具有显着优势,因为这样做不会导致文档中的所有其他元素必须“重新流动”,也不会导致整个文档“重新绘制” ”。事实上,在使用动态大小或动画时,强烈建议您以这种方式将元素从流中取出,否则性能会受到影响。

除此之外,understanding how absolute, relative and fixed positioning work 是必不可少的。

绝对定位 相对于其最近的祖先定位元素,该祖先本身已手动定位,如果没有定位祖先,则定位到 body 元素。元素从流中取出,元素在该流中占用的所有空间都将被删除。

相对定位将元素定位为其在正常流程中的原始位置的偏移量,但保留元素在文档中占用的原始空间,即使该元素现在位于其自己的层中.

Fixed Positioning 类似于绝对位置,只是位置不相对于任何东西。它固定在您指定的确切位置。

虽然所有这些都会将元素拉入自己的层,但层的堆叠方式(通过 "stacking contexts")取决于您使用的定位类型以及正在定位的元素。

这些是使用position 的原因。如果您不需要新图层,则使用 CSS floatflexbox 是可以提供设计布局的替代方法的工具。

marginpadding 真的不应该用于布局本身。它们用于布局中的小调整。

总而言之,浏览器布局页面内容的默认方式是 CSS Box Model,但使用 CSS position 是让某些内容使用该框模型的一种方式与主要内容不同的层次。 CSS 浮动提供了另一种独立的布局算法,而 Flexbox 提供了另一种。在不久的将来,CSS Grid specification 将被标准化,并且将提供另一种布局范式。

marginpadding 不是布局模型。它们只是在您碰巧使用的任何布局模型中使用的工具。

【讨论】:

以上是关于在 CSS 中频繁使用“位置”标签而不是使用“边距”和“填充”标签是不是有任何限制?的主要内容,如果未能解决你的问题,请参考以下文章

margin 负边距 的知识点

CSS布局奇淫巧计之-强大的负边距

何时在 CSS 中使用边距与内边距 [关闭]

如何根据自己的宽度而不是父 div 将 CSS 边距/填充设置为子 div?

css之去除html标签默认的外边距margin和内边距padding,通用工具类 base.css

CSS:仅在边距内的背景颜色