固定的位置,但相对于容器
我试图修复一个div
所以它总是坚持到屏幕的顶部,使用:
position: fixed; top: 0px; right: 0px;
但是, div
是在一个居中的容器中。 当我使用position:fixed
修复div
相对于浏览器窗口,如它在浏览器的右侧。 相反,它应该相对于容器固定。
我知道这个position:absolute
可以用来修复相对于div
的元素,但是当你向下滚动页面时,元素消失,不会像position:fixed
一样粘到顶部。
是否有黑客或解决方法来实现这一目标?
简短的回答: 不。 (现在可以使用CSS转换,请参阅下面的编辑)
长答案:使用“固定”定位的问题是它将stream失的元素。 因此它不能相对于其父母重新定位,因为它好像没有一个。 但是,如果容器具有固定的已知宽度,则可以使用如下所示的内容:
#fixedContainer { position: fixed; width: 600px; height: 200px; left: 50%; top: 0%; margin-left: -300px; /*half the width*/ }
编辑(03/2015):
这是过时的信息。 现在可以在CSS3变换的魔力的帮助下将dynamic大小的内容(水平和垂直)居中。 同样的原则适用,但不使用保证金来抵消你的容器,你可以使用translateX(-50%)
。 这不适用于上面的保证金窍门,因为你不知道补偿多less,除非宽度是固定的,你不能使用相对值(如50%
),因为它将相对于父项而不是它应用于的元素。 transform
行为不同。 它的值是相对于它们被应用的元素。 因此, transform
50%
意味着元素宽度的一半,而边距的50%
是父宽度的一半。 这是一个IE9 +解决scheme
使用与上面的例子类似的代码,我使用完全dynamic的宽度和高度重新创build了相同的场景:
.fixedContainer { background-color:#ddd; position: fixed; padding: 2em; left: 50%; top: 0%; transform: translateX(-50%); }
如果你想让它集中,你也可以这样做:
.fixedContainer { background-color:#ddd; position: fixed; padding: 2em; left: 50%; top: 50%; transform: translate(-50%, -50%); }
演示:
jsFiddle:只水平居中
jsFiddle:水平和垂直居中
原来的信贷去用户aaronk6在这个答案指出了我
其实这是可能的,而接受的答案只涉及集中,这是很直接的。 你也真的不需要使用JavaScript。
这将让你处理任何情况:
设置所有东西,如果你想要的位置:绝对内部的一个位置:相对容器,然后创build一个新的固定位置div在div中的position: absolute
,但不要设置其顶部和左侧的属性。 然后将它固定在任何你想要的地方,相对于容器。
例如:
/* Main site body */ .wrapper { width: 940px; margin: 0 auto; position: relative; /* Ensure absolute positioned child elements are relative to this*/ } /* Absolute positioned wrapper for the element you want to fix position */ .fixed-wrapper { width: 220px; position: absolute; top: 0; left: -240px; /* Move this out to the left of the site body, leaving a 20px gutter */ } /* The element you want to fix the position of */ .fixed { width: 220px; position: fixed; /* Do not set top / left! */ }
<div class="wrapper"> <div class="fixed-wrapper"> <div class="fixed"> Content in here will be fixed position, but 240px to the left of the site body. </div> </div> </div>
是的,根据规格,有一个方法。
虽然我同意格雷姆布莱克伍德应该是被接受的答案,因为它实际上解决了这个问题,应该指出的是,一个固定的元素可以相对于其容器定位。
我意外地注意到,申请时
-webkit-transform: translateZ(0);
对身体来说,它相对于它而言是一个固定的孩子(而不是视口)。 所以我的固定元素left
和top
属性现在相对于容器。
所以我做了一些研究,发现这个问题已经被Eric Meyer所覆盖了,即使它感觉像是一个“诡计”,事实certificate这是规范的一部分:
对于其布局由CSS框模型控制的元素,转换之外的任何值都不会导致创build堆栈上下文和包含块。 该对象充当固定位置后代的包含块。
http://www.w3.org/TR/css3-transforms/
所以,如果您对父元素应用任何转换,它将成为包含块。
但…
问题是实现看起来有问题/创造性,因为元素也停止performance为固定的(即使这个位似乎不是规范的一部分)。
在Safari,Chrome和Firefox中都可以find相同的行为,但是在IE11中(固定元素仍然保持固定)。
另一个有趣的(未logging的)事情是,当一个固定的元素被包含在一个被转换的元素内,而它的top
和left
属性现在将与容器相关,考虑到box-sizing
属性,它的滚动上下文将延伸到元素,好像箱子尺寸设置为border-box
。 对于那里的一些创意,这可能会成为一个玩具:)
testing
答案是肯定的,只要你没有设置left: 0
或right: 0
之后,你把div的位置设置为fixed。
检出侧栏div。 它是固定的,但涉及到父,而不是窗口的观点。
body { background: #ccc; } .wrapper { margin: 0 auto; height: 1400px; width: 650px; background: green; } .sidebar { background-color: #ddd; float: left; width: 300px; height: 100px; position: fixed; } .main { float: right; background-color: yellow; width: 300px; height: 1400px; } <div class="wrapper">wrapper <div class="sidebar">sidebar</div> <div class="main">main</div> </div>
我已经创build了这个jQuery插件来解决我有一个类似的问题,我有一个居中的容器(表格数据),我希望页眉固定到页面的顶部滚动时,但我希望它锚定到表格数据,所以无论我把容器放在哪里(居中,左边,右边),还可以让它左右移动时水平滚动的页面。
这里是链接到这个jQuery插件,可以解决这个问题:
https://github.com/bigspotteddog/ScrollToFixed
这个插件的描述如下:
这个插件用于将元素固定到页面的顶部,如果元素将垂直滚动到视图外的话; 但是,它确实允许元素继续向左或向右移动水平滚动。
给定一个选项marginTop,一旦垂直滚动到达目标位置,元素将停止垂直向上移动; 但是,当页面向左或向右滚动时,元素仍然会水平移动。 一旦页面向下滚动到目标位置,元素将被恢复到页面上的原始位置。
此插件已在Firefox 3/4,Google Chrome 10/11,Safari 5和Internet Explorer 8/9中进行了testing。
用于您的特定情况:
<script src="scripts/jquery-1.4.2.min.js" type="text/javascript"></script> <script src="scripts/jquery-scrolltofixed-min.js" type="text/javascript"></script> $(document).ready(function() { $('#mydiv').scrollToFixed(); });
只要拿出顶部和左侧的样式出固定的位置div。 这是一个例子
<div id='body' style='height:200%; position: absolute; width: 100%; '> <div id='parent' style='display: block; margin: 0px auto; width: 200px;'> <div id='content' style='position: fixed;'>content</div> </div> </div>
#content div将坐在父div的位置,但将在那里修复。
我必须通过广告来做到这一点,我的客户希望在广告内容之外。 我只是做了以下,它像一个魅力工作!
<div id="content" style="position:relative; width:750px; margin:0 auto;"> <div id="leftOutsideAd" style="position:absolute; top:0; left:-150px;"> <a href="#" style="position:fixed;"><img src="###" /></a> </div> </div>
你有position: sticky
是一种定位元素的新方法,在概念上类似于position: fixed
。 不同之处在于, position: sticky
的元素的行为与position: relative
在父元素中相同,直到在视口中满足给定的偏移阈值。
在Chrome 56(目前testing截至2016年12月,2017年1月稳定)位置:粘滞现在回来了。
https://developers.google.com/web/updates/2016/12/position-sticky
更多的细节在坚持你的着陆! 位置:WebKit中的粘性土地 。
两个HTML元素和纯CSS(现代浏览器)
看到这个jsFiddle的例子。 resize,查看固定元素如何随着浮动元素一起移动。使用最内侧滚动条来查看滚动在一个站点上的工作方式(固定元素保持固定)。
正如许多人所说,一个关键是不在fixed
元素上设置任何位置设置(没有top
, right
, bottom
或left
值)。
相反,我们把所有固定的元素(注意最后一个盒子有四个)先放在它们要被定位的盒子里,如下所示:
<div class="reference"> <div class="fixed">Test</div> Some other content in. </div>
然后,我们使用margin-top
和margin-left
来“移动”它们的容器,就像这个CSS所做的那样:
.fixed { position: fixed; margin-top: 200px; /* Push/pull it up/down */ margin-left: 200px; /* Push/pull it right/left */ }
请注意,由于fixed
元素忽略了所有其他布局元素,因此我们的小提琴中的最后一个容器可以具有多个fixed
元素,并且仍然具有与左上angular相关的所有元素。 但是,只有将它们全部放在容器中,这才是真实的, 因为这种比较小提琴表明,如果分散在容器内容中,则定位变得不可靠 。
无论包装是静态的 , 相对的还是绝对的定位,都没关系。
你可以试试我的jQuery插件FixTo 。
用法:
$('#mydiv').fixTo('#centeredContainer');
实现相对固定位置的另一个奇怪的解决scheme是将您的容器转换为iframe,这样您的固定元素可以固定到容器的视口而不是整个页面。
纯粹的CSS你不能做到这一点; 至less我没有。 但是,你可以用jQuery来做到这一点。 我会解释我的问题,稍作改动就可以使用它。
所以一开始,我想我的元素有一个固定的顶部(从窗口的顶部),并从父元素inheritance左侧组件(因为父元素居中)。 要设置左侧组件,只需将您的元素放置到父元素中,并为父元素设置position:relative
。
然后你需要知道当一个滚动条位于顶部(y零滚动)时,元素的顶部有多less; 有两个选项。 首先是静态的(一些数字),或者你必须从父元素中读取它。
在我的情况下,它是从顶部静态的150像素。 所以当你看到150的时候,我们没有滚动的时候是多less元素。
CSS
#parent-element{position:relative;} #promo{position:absolute;}
jQuery的
$(document).ready(function() { //This check window scroll bar location on start wtop=parseInt($(window).scrollTop()); $("#promo").css('top',150+wtop+'px'); }); $(window).scroll(function () { //This is when the window is scrolling wtop=parseInt($(window).scrollTop()); $("#promo").css('top',150+wtop+'px'); });
这很简单(按照下面的HTML)
诀窍是不要使用“position:fixed;”的元素(div)顶部或左边。 如果没有指定,那么“固定内容”元素将出现RELATIVE封闭元素(div与“position:relative;”)INSTEAD OF相对于浏览器窗口!
<div id="divTermsOfUse" style="width:870px; z-index: 20; overflow:auto;"> <div id="divCloser" style="position:relative; left: 852px;"> <div style="position:fixed; z-index:22;"> <a href="javascript:hideDiv('divTermsOfUse');"> <span style="font-size:18pt; font-weight:bold;">X</span> </a> </div> </div> <div> <!-- container for... --> lots of Text To Be Scrolled vertically... bhah! blah! blah! </div> </div>
以上允许我find一个closures“X”button在垂直滚动的div中的很多文本的顶部。 “X”就位(不随滚动文本移动,当用户调整浏览器窗口的宽度时,它会随着封闭的div容器向左或向右移动),因此它是垂直“固定”的,但相对于封闭元素水平!
在我做这个工作之前,当我滚动文本内容时,“X”滚动并且看不见。
抱歉不提供我的javascript的hideDiv()函数,但它会不必要地使这个post更长。 我select尽可能缩短。
我创build了一个jsfiddle来演示如何使用变换工作。
HTML
<div class="left"> Content </div> <div class="right"> <div class="fixedContainer"> X </div> Side bar </div>
CSS
body { margin: 0; } .left { width: 77%; background: teal; height: 2000px; } .right { width: 23%; background: yellow; height: 100vh; position: fixed; right: 0; top: 0; } .fixedContainer { background-color:#ddd; position: fixed; padding: 2em; //right: 0; top: 0%; transform: translateX(-100px); }
jQuery的
$('.fixedContainer').on('click', function() { $('.right').animate({'width': '0px'}); $('.left').animate({'width': '100%'}); });
我一会儿做了类似的事情 我对JavaScript非常陌生,所以我相信你可以做得更好,但这是一个起点:
function fixxedtext() { if (navigator.appName.indexOf("Microsoft") != -1) { if (document.body.offsetWidth > 960) { var width = document.body.offsetWidth - 960; width = width / 2; document.getElementById("side").style.marginRight = width + "px"; } if (document.body.offsetWidth < 960) { var width = 960 - document.body.offsetWidth; document.getElementById("side").style.marginRight = "-" + width + "px"; } } else { if (window.innerWidth > 960) { var width = window.innerWidth - 960; width = width / 2; document.getElementById("side").style.marginRight = width + "px"; } if (window.innerWidth < 960) { var width = 960 - window.innerWidth; document.getElementById("side").style.marginRight = "-" + width + "px"; } } window.setTimeout("fixxedtext()", 2500) }
您将需要设置宽度,然后获取窗口宽度并每隔几秒更改边距。 我知道这是沉重的,但它的作品。
如果你使用JavaScript,这是可能的。 在这种情况下,jQuery插件Sticky-Kit :
我有同样的问题,我们的一个团队成员给了我一个解决scheme。 要允许div修复位置和相对于其他div,我们的解决scheme是使用父容器包装修复div和滚动div。
<div class="container"> <div class="scroll"></div> <div class="fix"></div> </div>
CSS
.container { position: relative; flex:1; display:flex; } .fix { prosition:absolute; }
我的项目是带有Bootstrap的.NET ASP Core 2 MVC Angular 4模板4.在第一行的主应用程序组件html(即app.component.html)中添加“sticky-top”,如下所示:
<div class='row sticky-top'> <div class='col-sm-12'> <nav-menu-top></nav-menu-top> </div> </div> <div class="row"> <div class='col-sm-3'> <nav-menu></nav-menu> </div> <div class='col-sm-9 body-content'> <router-outlet></router-outlet> </div> </div>
检查这个:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body style="width: 1000px !important;margin-left: auto;margin-right: auto"> <div style="width: 100px; height: 100px; background-color: #ccc; position:fixed;"> </div> <div id="1" style="width: 100%; height: 600px; background-color: #800000"> </div> <div id="2" style="width: 100%; height: 600px; background-color: #100000"> </div> <div id="3" style="width: 100%; height: 600px; background-color: #400000"> </div> </body> </html>