CSS 在相对父 div 中固定定位的 div
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 
原文地址: http://stackoverflow.com/questions/7846161/
Warning: these are provided under cc-by-sa 4.0 license.  You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Fixed positioned div within a relative parent div
提问by Gavin Wood
I am currently building a responsive website and need a menu to be fixed, thus not scrolling when the rest of the site scrolls. the issue is that it is a fluid layout and i want the "fixed positioned" menu item to be fixed relative to the containing parent element and not to browser window. is there anyway this can be done?
我目前正在构建一个响应式网站,需要修复一个菜单,因此在网站的其余部分滚动时不会滚动。问题是它是一个流体布局,我希望“固定定位”菜单项相对于包含的父元素而不是浏览器窗口固定。有没有办法做到这一点?
回答by Leo
This question came first on Google although an old one so I'm posting the working answer I found, which can be of use to someone else.
这个问题首先出现在谷歌上,虽然是旧问题,所以我发布了我找到的工作答案,这对其他人有用。
This requires 3 divs including the fixed div.
这需要 3 个 div,包括固定 div。
HTML
HTML
<div class="wrapper">
    <div class="parent">
        <div class="child"></div>
    </div>
</div>
CSS
CSS
.wrapper { position:relative; width:1280px; }
    .parent { position:absolute; }
        .child { position:fixed; width:960px; }
回答by Fuzzical Logic
Gavin,
加文,
The issue you are having is a misunderstanding of positioning. If you want it to be "fixed" relative to the parent, then you really want your #fixedto be position:absolutewhich will update its position relative to the parent. 
您遇到的问题是对定位的误解。如果你希望它是“固定”相对于父,那么你真的想你#fixed是position:absolute其中相对于父其位置将更新。
This questionfully describes positioning types and how to use them effectively.
这个问题完整地描述了定位类型以及如何有效地使用它们。
In summary, your CSS should be
总之,你的 CSS 应该是
#wrap{ 
    position:relative;
}
#fixed{ 
    position:absolute;
    top:30px;
    left:40px;
}
回答by KernelDeimos
An easy solution that doesn't involve resorting to JavaScript and will not break CSS transforms is to simply have a non-scrolling element, the same size as your scrolling element, absolute-positioned over it.
一个不涉及使用 JavaScript 并且不会破坏 CSS 转换的简单解决方案是简单地使用一个非滚动元素,与你的滚动元素大小相同,绝对定位在它上面。
The basic HTML structure would be
基本的 HTML 结构是
CSS
CSS
<style>
    .parent-to-position-by {
        position: relative;
        top: 40px; /* just to show it's relative positioned */
    }
    .scrolling-contents {
        display: inline-block;
        width: 100%;
        height: 200px;
        line-height: 20px;
        white-space: nowrap;
        background-color: #CCC;
        overflow: scroll;
    }
    .fixed-elements {
        display: inline-block;
        position: absolute;
        top: 0;
        left: 0;
    }
    .fixed {
        position: absolute; /* effectively fixed */
        top: 20px;
        left: 20px;
        background-color: #F00;
        width: 200px;
        height: 20px;
    }
</style>
HTML
HTML
<div class="parent-to-position-by">
    <div class="fixed-elements">
        <div class="fixed">
            I am "fixed positioned"
        </div>
    </div>
    <div class="scrolling-contents">
        Lots of contents which may be scrolled.
    </div>
</div>
- parent-to-position-bywould be the relative- divto position something fixed with respect to.
- scrolling-contentswould span the size of this- divand contain its main contents
- fixed-elementsis just an absolute-positioned- divspanning the same space over top of the- scrolling-contents- div.
- by absolute-positioning the divwith thefixedclass, it achieves the same effect as if it were fixed-positioned with respect to the parentdiv. (or the scrolling contents, as they span that full space)
- parent-to-position-by将是相- div对于固定的东西的相对位置。
- scrolling-contents将跨越此大小- div并包含其主要内容
- fixed-elements只是一个绝对定位的- div跨越相同空间的- scrolling-contents- div.
- 通过div使用fixed类绝对定位,它实现了与相对于父类固定定位一样的效果div。(或滚动内容,因为它们跨越了整个空间)
回答by JCOC611
This is possible if you move the fixed <div>using margins and not positions:
如果您<div>使用保证金而不是仓位移动固定资产,这是可能的:
#wrap{ position:absolute;left:100px;top:100px; }
#fixed{ 
   position:fixed;
   width:10px;
   height:10px;
   background-color:#333;
   margin-left:200px;
   margin-top:200px;
}
And this HTML:
而这个 HTML:
<div id="wrap">
   <div id="fixed"></div>
</div>
Play around with this jsfiddle.
玩这个jsfiddle。
回答by Lohit Bisen
Try postion:sticky on parent element.
在父元素上尝试 postion:sticky。
回答by afable
A simple thing you can do is position your fixed DIV relative to the rest of your page with % values.
您可以做的一件简单的事情是使用 % 值将固定 DIV 相对于页面的其余部分定位。
Check out this jsfiddle herewhere the fixed DIV is a sidebar.
在此处查看此jsfiddle,其中固定的 DIV 是侧边栏。
div#wrapper {
    margin: auto;
    width: 80%;
}
div#main {
    width: 60%;
}
div#sidebar {
    position: fixed;
    width: 30%;
    left: 60%;
}
And a brief picture below describing the layout above:
下面是描述上述布局的简要图片:
回答by Mandar Kawtakwar
you can fix the wrapper using absolute positioning. and the give inside div a fixed position.
您可以使用绝对定位来修复包装器。并给内部 div 一个固定位置。
.wrapper{
 position:absolute;
 left:10%;// or some valve in px
 top:10%; // or some valve in px
 }
and div inside that
和里面的div
.wrapper .fixed-element{ 
position:fixed;
width:100%;
height:100%;
margin-left:auto; // to center this div inside at center give auto margin
margin-right:auto;
}
try this It might work for you
试试这个它可能对你有用
回答by avrahamcool
here is a more generic solution, that don't depends on the Menu/Header height. its fully responsive, Pure CSS solution, Works great on IE8+, Firefox, Chrome, Safari, opera. supports Content scrolling without affecting the Menu/Header.
这是一个更通用的解决方案,它不依赖于菜单/标题高度。其完全响应式的纯 CSS 解决方案,在 IE8+、Firefox、Chrome、Safari、Opera 上运行良好。支持内容滚动而不影响菜单/标题。
Test it with that Working Fiddle
用那个测试它 Working Fiddle
The Html:
Html:
<div class="Container">
    <div class="First">
        <p>The First div height is not fixed</p>
        <p>This Layout has been tested on: IE10, IE9, IE8, FireFox, Chrome, Safari, using Pure CSS 2.1 only</p>
    </div>
    <div class="Second">
        <div class="Wrapper">
            <div class="Centered">
                <p>The Second div should always span the available Container space.</p>
                <p>This content is vertically Centered.</p>
            </div>
        </div>
    </div>
</div>
The CSS:
CSS:
*
{
    margin: 0;
    padding: 0;
}
html, body, .Container
{
    height: 100%;
}
    .Container:before
    {
        content: '';
        height: 100%;
        float: left;
    }
.First
{
    /*for demonstration only*/
    background-color: #bf5b5b;
}
.Second
{
    position: relative;
    z-index: 1;
    /*for demonstration only*/
    background-color: #6ea364;
}
    .Second:after
    {
        content: '';
        clear: both;
        display: block;
    }
/*This part his relevant only for Vertically centering*/
.Wrapper
{
    position: absolute;
    width: 100%;
    height: 100%;
    overflow: auto;
}
    .Wrapper:before
    {
        content: '';
        display: inline-block;
        vertical-align: middle;
        height: 100%;
    }
.Centered
{
    display: inline-block;
    vertical-align: middle;
}
回答by Fely Spring
Sample solution. Check, if this is what you need.
样品溶液。检查一下,这是否是您所需要的。
<div class="container">
   <div class="relative">      
      <div class="absolute"></div>      
      <div class="content">
        <p>
          Content here
        </p>
      </div>
    </div>
 </div>
And for CSS
而对于 CSS
.relative { 
  position: relative;
}
.absolute {
  position: absolute;
  top: 15px;
  left: 25px;   
}
See it on codepen https://codepen.io/FelySpring/pen/jXENXY
在 codepen 上查看https://codepen.io/FelySpring/pen/jXENXY


