【问题标题】:Absolutely positioned button in scrolling container moves with scrolling滚动容器中的绝对定位按钮随滚动而移动
【发布时间】:2017-10-21 16:17:29
【问题描述】:

我有一个包含大量内容的容器,因此我设置了overflow: auto; 以使其滚动。

我还需要在这个容器的右下角固定位置的按钮(类似于 Material Design 中的 FAB 按钮)。

按钮很好地放置在容器的右下角。不幸的是,当我滚动内容时,按钮随之移动。我对绝对定位的理解是它将元素相对于其父元素定位(使用position: relative;)。那么为什么这个按钮会移动呢?将它修复给父母的正确方法是什么?

预期的行为是无论滚动位置如何,按钮都会停留在右下角。例如,请参阅this page 并搜索短语“滚动期间工具栏的动画离屏”。

请注意,我希望通过绝对定位而不是固定定位来完成这项工作。无论容器在浏览器窗口中嵌套多深,按钮都应位于其容器的右下角。

* { 
    box-sizing: border-box; 
}
.container {
    position: relative;
    overflow: auto;
    height: 256px;
    width: 256px;
    margin-right: 16px;
    border: solid 1px red;
    padding: 4px;
}
.fab {
    position: absolute;
    right: 20px;
    bottom: 20px;
    color: white;
    background-color: blue;
}
<div class="container">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur mollitia maxime facere quae cumque perferendis cum atque quia repellendus rerum eaque quod quibusdam incidunt blanditiis possimus temporibus reiciendis deserunt sequi eveniet necessitatibus maiores quas assumenda voluptate qui odio laboriosam totam repudiandae? Doloremque dignissimos voluptatibus eveniet rem quasi minus ex cumque esse culpa cupiditate cum architecto! Facilis deleniti unde suscipit minima obcaecati vero ea soluta odio cupiditate placeat vitae nesciunt quis alias dolorum nemo sint facere. Deleniti itaque incidunt eligendi qui nemo corporis ducimus beatae consequatur est iusto dolorum consequuntur vero debitis saepe voluptatem impedit sint ea numquam quia voluptate quidem.
    <Button class="fab">
        Ok
    </Button>
</div>

请看我的 JSFiddle here

【问题讨论】:

  • 你的小提琴里没有按钮
  • JSfiddle 中没有浮动按钮。另外请阅读以下内容,因为不需要使用 JSfiddle,可以在 SO 中创建 css/js/html sn-ps。 stackoverflow.blog/2014/09/16/…
  • @Dale_dale12,没有意识到可以直接在SO中创建css/js/htm sn-ps。下次会这样做。
  • @TylerH,这个问题提供了一个固定定位的解决方案,它相对于浏览器窗口起作用。我需要它相对于可以嵌套在许多其他容器中的容器。我还添加了预期行为的示例。如果有人能解释为什么我的原始代码不起作用,那也会有所帮助——这违背了我对绝对定位的理解!
  • 这值得重新打开。关于父容器中绝对定位的链接问题应该被这个重复,与@Naresh 的要求几乎没有关系。我自己很想知道为什么绝对位置的工作方式与可滚动父级中的工作方式一样。

标签: css css-position


【解决方案1】:

有很多方法可以实现这一点,但我更喜欢用相同高度和宽度的.container-parentposition: relative 包裹.container。这为您提供了一个非滚动元素来定位 .fab 按钮。

<div class="container-parent">
  <div class="container">
    Lorem ipsum dolor sit amet...
  </div>
  <Button class="fab">
    Ok
  </Button>

</div>

使用 CSS:

.container-parent {
  position: relative;
  height: 256px;
  width: 256px;
}

.fab {
  position: absolute;
  bottom: 20px;
  right: 20px;
}

这是小提琴:http://jsfiddle.net/t702Lknz/4/

或者,您可以使用原始标记,.fab 具有固定位置。 CSS 就像:

.fab {
    position: fixed;
    top: 225px;
    left: 190px;
}

这是小提琴:http://jsfiddle.net/t702Lknz/3/

【讨论】:

  • @VXp 预期的结果是什么?另外,你和纳雷什有关系吗??如果是,请编辑问题以突出显示确切的要求。
  • 您的两个解决方案都按预期工作 - 仍在尝试消化第一个解决方案。第二个不太理想,因为它是相对于顶部的,而且我的容器的大小不是固定的。
  • @Naresh 我们试图解决的问题是卷轴。通过添加一个父容器,并将其设置为参考框架,我们不必担心容器中的滚动。
  • 查看您的第一个答案,容器父级高度的硬编码并不理想。它在实际代码中给我带来了父母高度随窗口高度变化的问题。我需要更多的灵活性。我同意我们需要以某种方式为绝对定位设置一个参考框架。
  • 我找到了一个无需复制容器高度的解决方案。它使用弹性盒。我将其发布为答案。
【解决方案2】:

您可以通过为文本添加一个包装 div 来做到这一点。包装器 div 将其宽度和高度设置为 100% 并将溢出设置为自动,因此它将具有滚动框,并且您的 FAB 可以像这样定位在外部 div 内:

* {
  box-sizing: border-box;
}

.fab {
  position: absolute;
  right: 20px;
  bottom: 20px;
}

.container {
  position: relative;
  border: solid 1px red;
  height: 256px;
  width: 256px;
  float: left;
  margin-right: 16px;
}

.text-wrapper {
  overflow: auto;
  height: 100%;
  width: 100%
}
<div class="container">
  <div class="text-wrapper">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur mollitia maxime facere quae cumque perferendis cum atque quia repellendus rerum eaque quod quibusdam incidunt blanditiis possimus temporibus reiciendis deserunt sequi eveniet necessitatibus
    maiores quas assumenda voluptate qui odio laboriosam totam repudiandae? Doloremque dignissimos voluptatibus eveniet rem quasi minus ex cumque esse culpa cupiditate cum architecto! Facilis deleniti unde suscipit minima obcaecati vero ea soluta odio
    cupiditate placeat vitae nesciunt quis alias dolorum nemo sint facere. Deleniti itaque incidunt eligendi qui nemo corporis ducimus beatae consequatur est iusto dolorum consequuntur vero debitis saepe voluptatem impedit sint ea numquam quia voluptate
    quidem.
  </div>

  <Button class="fab">
        Ok
    </Button>
</div>

【讨论】:

  • 那你需要更详细的解释一下结果是什么,你希望FAB定位在哪里?
  • sn-p 的行为不符合预期。滚动内容时,按钮不应滚动。
  • 所以你希望它只在可滚动部分的底部可见,但不滚动?您希望它如何显示?
  • 请查看我的更新 - 我已经包含了预期行为的示例。
【解决方案3】:

我终于想出了如何做到这一点。由于只有文本应该滚动,它应该在它自己的滚动容器内。这使按钮锁定在其父级上,而不受滚动的影响。这是最终代码。

* { box-sizing: border-box; }

.container {
    /* keep the add button in a fixed location relative to this container */
    position: relative;
    display: flex;
    flexDirection: column;
    height: 200px;
    width: 200px;
    margin-right: 16px;
    border: solid 1px red;
    padding: 4px;
}

.text-container {
    /* ensure that only the text scrolls, not the button */
    flex: 1;
    overflow: auto;
}

.fab {
    position: absolute;
    right: 20px;
    bottom: 20px;
    color: white;
    background-color: blue;
}
<div class="container">
    <div class="text-container">
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur mollitia maxime facere quae cumque perferendis cum atque quia repellendus rerum eaque quod quibusdam incidunt blanditiis possimus temporibus reiciendis deserunt sequi eveniet necessitatibus maiores quas assumenda voluptate qui odio laboriosam totam repudiandae? Doloremque dignissimos voluptatibus eveniet rem quasi minus ex cumque esse culpa cupiditate cum architecto! Facilis deleniti unde suscipit minima obcaecati vero ea soluta odio cupiditate placeat vitae nesciunt quis alias dolorum nemo sint facere. Deleniti itaque incidunt eligendi qui nemo corporis ducimus beatae consequatur est iusto dolorum consequuntur vero debitis saepe voluptatem impedit sint ea numquam quia voluptate quidem.    
    </div>
    <Button class="fab">
        Ok
    </Button>
</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2013-02-01
    • 2012-10-19
    相关资源
    最近更新 更多