是否可以使用 CSS calc() 获得负值?

Posted

技术标签:

【中文标题】是否可以使用 CSS calc() 获得负值?【英文标题】:Is it possible to get a negative value with CSS calc()? 【发布时间】:2014-10-02 00:35:07 【问题描述】:

假设我们有一个位于视口中心的容器...

.centeredmargin: 0 auto; width:960px;

... 在那个容器内,我有另一个需要具有视口宽度 100% 的宽度。我可以将边距设置为 ...

.widestmargin: 0 -480px

...例如。问题是该值不会是-480px,但实际上是视口宽度(960px) - .centered width / 2 ...使用calc()一切都很好而且很容易,只有我需要一个负值的结果.

.widest
  margin: 0 calc( (100vw - 960px) / 2 );

我尝试从 0 中减去手数以获得负值,但不行。

我不想使用 JS,而且我只在 Webkit 中遇到问题 - 但 calc() 没有问题 - 我的问题是,如果我通过这样做来破解它提交...

.widest
  margin: 0 -100%;

...我的页面在 Chrome/Safari 中水平滚动。

你的想法?

【问题讨论】:

【参考方案1】:

编辑:比以前的更简单的技巧:calc(0px - something) - 有一个单元 - 有效,而 calc(0 - something) 没有。见Fiddle 3

这些“技巧”奏效:

calc(1px - something - 1px);
calc(-1 * something)
calc(0px - something) /* new */

0 - something 没有(至少在您的示例中)。

Fiddle 1Fiddle 2

【讨论】:

calc(-1 * something) 太棒了! 你也可以做 calc(whatever / -1)【参考方案2】:

是的,在某种程度上这是可能的。关键部分是将元素的宽度设置为100vw,然后将其偏移视口宽度的一半加上居中元素宽度的一半,例如calc(-50vw + 200px):

Demo Fiddle

给定 html

<div id='center'>center
    <div id='full'>full width</div>
</div>

CSS

html, body 
    height:100%;
    width:100%;
    margin:0;
    padding:0;
    text-align:center;
    position:relative;

#center 
    width:400px;
    height:100%;
    background:red;
    margin:0 auto;

#full 
    width:100vw;
    height:100px;
    background:green;
    margin-left:calc(-50vw + 200px);

【讨论】:

如果布局如此简单,那将可以工作,我可能会解决这个问题,但是需要成为整个页面的“带子”的容器在任何地方都没有相同的高度(尽管高度在使用时是固定的) - 我还必须将边距/填充设置到下一个元素的顶部,以防止它被#full覆盖 ... 还有:我真的很想知道是否可以从 calc() 中获得负值 我喜欢这两种方法,但这种方法感觉不那么骇人听闻......我也觉得自己没有弄清楚这一点有点愚蠢。谢谢 @sw4 这是一个不错的解决方案。但是,我无法弄清楚如何使其适用于响应式fluid-ish 布局,其中#center 没有静态宽度,而是max-width,例如here @afkatja 如果我正确解释了您的观点,本文包含流体中心所需的解决方案。 .full-width width: 100vw; position: relative; left: 50%; right: 50%; margin-left: -50vw; margin-right: -50vw; css-tricks.com/full-width-containers-limited-width-parents【参考方案3】:

我有另一个可能的解决方案。你可以除以-2,所以你会得到一个否定的结果

.widest
  margin-left: calc( (100vw - 960px) / -2 );

【讨论】:

【参考方案4】:

您可以尝试下一个解决方案

.some-class 
   margin-left: calc(-1px - ((100vw - 100%) / 2) + 1px);

【讨论】:

以上是关于是否可以使用 CSS calc() 获得负值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 calc() 表达式中获取 CSS 变量的负值?

如何在 OpenOffice Calc 宏中获得合并的单元格行/列跨度

是否可以使用 CSS calc() 来计算宽度/高度比?

边框宽度中的CSS calc()?

IE8 的 calc() 是不是有纯 CSS 后备

CSS calc() - 带单位值的乘法和除法