CSS位置:固定在定位元素内


71

我有一个定位的div,其内容可能太长,因此出现滚动条(overflow:auto设置)。它充当ajax应用程序中的对话框。我想在其右上角修复一个关闭按钮,以便当用户滚动div时不会滚动离开。

我尝试过,position:fixed; right:0; top:0但是它把按钮放在页面的右上角而不是div中(在Firefox中)。

是否可以仅使用CSS进行此按钮放置,而不会在每次滚动事件中都破坏js中的offsetWidth / Height?

ps:div的高度和宽度不是固定值,它取决于内容的大小和浏览器窗口的大小。用户还可以根据需要调整其大小。


1
可能值得考虑使用带有固定位置背景图像的div作为按钮。
Nick Merrill 2013年

@NickM似乎是一个好主意,但是您将如何单击该按钮?
8:51

@ithil只要div的高度和宽度设置为与背景图像的高度和宽度匹配,它就可以单击。至于处理点击,这取决于您使用的是纯HTML还是JS。如果只是HTML,则可以将div包裹在带有的a标签中href(或什至只使用a标签而不是div并将其设置为display: inline-block)。如果是JS,则可以监听div。我是否正确理解您的问题?
尼克·美林

@NickM是的,我相信你确实很感谢,但是我猜想也可以使用JS将高度和宽度“设置为匹配”?就像在OP问题中“ div的高度和宽度不是固定值”一样,这就是为什么我想知道
ithil

@ithil,我明白了。我错过了那部分。在那种情况下,我认为某些JS必须处理div的大小是正确的。
尼克·美林

Answers:


83

您可以使用position:fixed;,但无需设置lefttop。然后,您将使用将它推向右侧margin-left,以将其放置在所需的正确位置。

在此处查看演示:http : //jsbin.com/icili5


6
@Sotiris您能否提供参考,以解释为什么它应该起作用?为什么fixed在未指定top和时浏览器必须以这种方式定位元素leftstackoverflow.com/questions/8712047/…–
Flash

我偶然发现了最费解的JS。真好
collin 2013年

1
这不是所期望的行为
VSYNC

我同意这不是答案。它不处理问题中所述的动态宽度容器。
dano 2014年

8
好吧,这是我第一次看到如此多的人完全误解了此站点上的一个问题。
Ryan Bayne'3

14

当前选择的解决方案似乎误解了该问题。

诀窍是既不使用绝对定位也不使用固定定位。而是将div外部的关闭按钮的位置设置为相对,并向左浮动,使其紧邻div的右侧。接下来,设置负的左边距和正的z索引,以使其显示在div上方。

这是一个例子:

#close
    {
        position: relative;
        float: left;
        margin-top: 50vh;
        margin-left: -100px;
        z-index: 2;
    }

#dialog
    {
        height: 100vh;
        width: 100vw;
        position: relative;
        overflow: scroll;
        float: left;
    }

<body> 
    <div id="dialog">
    ****
    </div>

    <div id="close"> </div>
</body>

很棒的答案,这使我进入了将元素固定在可滚动div内的更好解决方案的道路。
RebelFist 2015年

5

Position:fixed给出有关浏览器窗口的绝对位置。所以它当然会去那里。

虽然position:absolute是指父元素,所以如果将<div>按钮放置div>在容器的<之内,它应该位于您要放置的位置。就像是

编辑:感谢@Sotiris,他有一点,可以使用position:fixed和margin-left来实现解决方案。像这样:http : //jsfiddle.net/NeK4k/


如果我使用绝对值,则用户可以滚动关闭按钮(这是我尝试修复之前的首次尝试。)
Calmarius 2011年

似乎每个人误读的内容都希望保留在屏幕上。在这种情况下,您必须使用javascript正确地将其相对于相关div定位,或使用javascript在使用position时正确滚动它:absolute
Dominic

4

我知道这是一篇老文章,但是我有同样的问题,但是没有找到一个相对于父元素固定该元素的答案divmedium.com上的滚动条是一个很棒的纯CSS解决方案,用于设置position: fixed;相对于父元素而不是视口(kinda *)的某些内容。这是通过将parent设置divposition: relative;并具有一个按钮包装器来实现的position: absolute;,该按钮当然position: fixed;如下:

<div class="wrapper">
  <div class="content">
    Your long content here
  </div>

  <div class="button-wrapper">
    <button class="button">This is your button</button>
  </div>
</div>

<style>
  .wrapper {
    position: relative;
  }

  .button-wrapper {
    position: absolute;
    right: 0;
    top: 0;
    width: 50px;
  }

  .button {
    position: fixed;
    top: 0;
    width: 50px;
  }
</style>

工作实例

*由于固定元素不随页面滚动,因此此解决方案的垂直位置仍相对于视口,而水平位置相对于父级。


2

似乎可以使用CSS转换

“'transform'属性在元素上建立新的本地坐标系”,

但是...这不是跨浏览器,似乎只有Opera可以正常工作


1
现在可以在Chrome和Firefox中使用。这是一个例子。 codepen.io/anon/pen/ZOqrYo
Patrick McElhaney

感谢@PatrickMcElhaney的示例,这是我一直在寻找的解决方案:)
c01gat3


1

我实现了一个具有固定位置(wiewport)但相对于其父级宽度的元素。

我只需要包装我的固定元素,并给父母一个宽度100%。同时,包装的固定元素和父元素位​​于一个div中,该宽度根据包含网站内容的页面而变化。通过这种方法,我可以使固定元素始终位于内容的相同距离处,具体取决于该元素的宽度。在我的情况下,这是一个“到顶部”按钮,始终显示在距底部15像素和距内容15像素的位置。

https://codepen.io/rafaqf/pen/MNqWKB

<div class="body">
  <div class="content">
    <p>Some content...</p>
    <div class="top-wrapper">
      <a class="top">Top</a>
    </div>
  </div>
</div>

.content {
  width: 600px; /*change this width to play with the top element*/
  background-color: wheat;
  height: 9999px;
  margin: auto;
  padding: 20px;
}
.top-wrapper {
  width: 100%;
  display: flex;
  justify-content: flex-end;
  z-index: 9;
  .top {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 60px;
    height: 60px;
    border-radius: 100%;
    background-color: yellowgreen;
    position: fixed;
    bottom: 20px;
    margin-left: 100px;
    cursor: pointer;
    &:hover {
      opacity: .6;
    }
  }
}

0

如果您的关闭按钮将是文本,则对我来说效果很好:

#close {
  position: fixed;
  width: 70%; /* the width of the parent */
  text-align: right;
}
#close span {
  cursor: pointer;
}

然后,您HTML可以是:

<div id="close"><span id="x">X</span></div>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.