【问题标题】:width inherit doesn't fill parent when using calc()使用 calc() 时,宽度继承不填充父级
【发布时间】:2018-08-07 15:06:37
【问题描述】:

我正在尝试使 div 扩展到父级的宽度。父级上有一个calc()。为什么孩子不扩大到父母的宽度?如果我删除 calc 并设置一个实际值,它工作正常。有什么技巧可以让它发挥作用吗?

我假设孩子也在跑calc(100% - 200px)

* {
  box-sizing: border-box;
}

.wrapper {
  width: 75%;
  margin: auto;
  position: relative;
}

.nav {
  width: calc(30% - 16px);
  height: 2000px;
  position: relative;
  background: red;
}

.nav>ul {
  width: inherit;
  background: blue;
  position: fixed;
  list-style: none;
  padding: 0;
  margin: 0;
}
<div class="wrapper">
  <div class="nav">
    <ul>
      <li>One</li>
      <li>Two</li>
      <li>Three</li>
    </ul>
  </div>
</div>

【问题讨论】:

  • 只是不设置宽度..你在这里继承了计算,所以它工作正常..检查元素并使用值 200px 然后你会明白
  • 我更新了我的代码。我忘了提到我也在使用fixed
  • 现在是因为 body 的边距 :) 将其设为 0,你就会得到你想要的 ;)
  • 嗯...它在这里工作,但不在我的页面上...
  • 好吧,只要考虑到蓝色的考虑他的宽度相对于屏幕宽度..而红色的考虑到容器宽度......所以你肯定还有别的东西

标签: html css css-calc


【解决方案1】:

基于上面的cmets,我将进一步阐述。很明显,ul 从其父级继承了calc(30% - 16px),两者的计算方式不同,这是逻辑:

nav 有一个静态位置,所以他的宽度是相对于它的容器的,这里是.wrapper,这个宽度是它的容器的 75%,它是 body,所以导航的最终宽度是 (width-body*0.75)*0.3 - 16px

ul 有一个固定的位置,所以它的宽度是相对于寡妇/屏幕宽度的,并且由于 body 默认有 8px 边距,所以 body 的宽度与浏览器宽度略有不同,我们可以说 browser-width=width-body + 16px 和因此ul 的宽度是(width-body + 16px)*0.3 - 16px

所以我们可以清楚的看到ul的宽度大于nav的宽度。


为了解决这个问题,我们需要解方程:

(width-body + 16px)*0.3 - 16px = (width-body*0.75)*0.3 - 16px

但这不是适当的解决方案,因为我们将以 唯一的负值 (-64px) 结束,这是不可能的!

另一个思路是调整固定元素的宽度。

让我们首先删除主体边距以使其更容易,我们将得到新的等式:

(width-body)*0.3 - 16px = (width-body*0.75)*0.3 - 16px

现在我们只是缺少0.75 因素,所以我们可以简单地添加它。

body {
  margin: 0;
}

* {
  box-sizing: border-box;
}

.wrapper {
  width: 75%;
  margin: auto;
  position: relative;
}

.nav {
  width: calc(30% - 16px);
  height: 2000px;
  position: relative;
  background: red;
}

.nav>ul {
  width: calc((30% * 0.75) - 16px);
  background: blue;
  position: fixed;
  list-style: none;
  padding: 0;
  margin: 0;
}
<div class="wrapper">
  <div class="nav">
    <ul>
      <li>One</li>
      <li>Two</li>
      <li>Three</li>
    </ul>
  </div>
</div>

顺便说一句,我怀疑您希望拥有与sticky 位置相同的行为,因此您可以尝试一下。只需关注browser support

body {
  margin: 0;
}

* {
  box-sizing: border-box;
}

.wrapper {
  width: 75%;
  margin: auto;
  position: relative;
}

.nav {
  width: calc(30% - 16px);
  height: 2000px;
  position: relative;
  background: red;
}

.nav>ul {
  background: blue;
  position: sticky;
  top:0;
  list-style: none;
  padding: 0;
  margin: 0;
}
<div class="wrapper">
  <div class="nav">
    <ul>
      <li>One</li>
      <li>Two</li>
      <li>Three</li>
    </ul>
  </div>
</div>

【讨论】:

  • 这行得通!有没有办法让它在不同大小的.nav 和包装器上工作?我正在使用 scss,所以我有这个 width: calc((16.6666% * 0.65) - #{$cell-margin * 2});
  • @GetOffMyLawn 是的,当然;)在这种情况下,考虑所有变量的两个方程,然后简单地添加缺失的变量......正如您在这种情况下看到的那样,我们保持 30% 相同,并且乘以 0.75,相当于包装器的 75%。简单的数学:)
  • @GetOffMyLawn 顺便说一句,你知道粘性位置吗?就像你想实现它一样
  • 好的,谢谢,我会搞砸一些,谢谢你的开始!
  • @GetOffMyLawn 检查我的上次更新,在最后添加;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2018-06-24
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 2018-11-05
相关资源
最近更新 更多