我正在尝试修复一个div,使其始终保持在屏幕顶部,使用:
position: fixed;
top: 0px;
right: 0px;
然而,div位于居中的容器内。当我使用position:fixed时,它会相对于浏览器窗口修复div,例如它位于浏览器的右侧。相反,它应该相对于容器固定。
我知道position:absolute可以用来固定相对于div的元素,但是当您向下滚动页面时,元素会消失,并且不会像position:fixed那样固定在顶部。
有没有破解或解决方法来实现这一点?
简短回答:没有。(现在可以使用CSS转换。请参阅下面的编辑)
长篇大论:使用“固定”定位的问题在于,它会使元素脱离流程。因此,它不能相对于父对象重新定位,因为它好像没有父对象。但是,如果容器具有固定的已知宽度,则可以使用以下内容:
#fixedContainer {
position: fixed;
width: 600px;
height: 200px;
left: 50%;
top: 0%;
margin-left: -300px; /*half the width*/
}
http://jsfiddle.net/HFjU6/1/
编辑(2015年3月):
这是过时的信息。借助CSS3变换的魔力,现在可以将动态大小(水平和垂直)的内容居中。同样的原则也适用,但您可以使用translateX(-50%)来代替使用边距来偏移容器。这不适用于上面的边距技巧,因为除非宽度是固定的,否则不知道要偏移多少,并且不能使用相对值(例如50%),因为它将相对于父元素,而不是它所应用的元素。transform的行为不同。它的值与它们所应用的元素有关。因此,50%的转换表示元素的宽度的一半,而50%的边距表示父元素的宽度。这是一个IE9+解决方案
使用与上述示例类似的代码,我使用完全动态的宽度和高度重新创建了相同的场景:
.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很陌生,所以我相信你可以做得更好,但这里有一个起点:
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)
}
您需要设置宽度,然后它会获取窗口宽度并每隔几秒更改边距。我知道它很重,但它有效。
我创建了这个jQuery插件来解决我遇到的类似问题,我有一个居中的容器(表格数据),我希望在滚动列表时将标题固定在页面顶部,但我希望它锚定在表格数据上,这样它就可以放在我放置容器的任何位置(居中、左、右),并允许它在水平滚动时随页面左右移动。
下面是这个jQuery插件的链接,它可以解决这个问题:
https://github.com/bigspotteddog/ScrollToFixed
该插件的描述如下:
该插件用于将元素固定到页面顶部,如果元素垂直滚动到视图之外;然而,它确实允许元素随着水平滚动继续向左或向右移动。
给定选项marginTop,一旦垂直滚动到达目标位置,元素将停止垂直向上移动;但是,当页面向左或向右滚动时,元素仍将水平移动。一旦页面向下滚动到目标位置,元素将恢复到页面上的原始位置。
该插件已在Firefox 3/4、Google Chrome 10/11、Safari 5和Internet Explorer 8/9中进行了测试。
特定案例的用法:
<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();
});
事实上,这是可能的,而公认的答案只涉及集中,这很简单。此外,您真的不需要使用JavaScript。
这将允许您处理任何情况:
如果您想在position:relative容器中定位:absolute,请按照您的意愿设置所有内容,然后在div中创建一个新的固定位置div,其位置为:absolate,但不要设置其顶部和左侧的财产。然后,它将被固定在相对于容器的任何位置。
例如:
/*主要场地主体*/.包装器{宽度:940px;边距:0自动;位置:相对;/*确保绝对定位的子元素相对于此*/}/*要固定位置的元素的绝对定位包装*/.固定包装{宽度:220px;位置:绝对;顶部:0;左:-240px;/*将其移到网站正文的左侧,留下20px的空白*/}/*要固定其位置的元素*/.固定{宽度:220px;位置:固定;/*不要设置顶部/左侧*/}<div class=“wrapper”><div class=“fixed wrapper”><div class=“fixed”>这里的内容将是固定位置,但在网站主体左侧240像素。</div></div></div>
可悲的是,我希望这个线程可以解决我的问题,Android的WebKit将框阴影模糊像素渲染为固定位置元素的边距,但这似乎是一个bug。
答案是肯定的,只要在将div位置设置为固定后不设置left:0或right:0。
http://jsfiddle.net/T2PL5/85/
签出侧边栏div.它是固定的,但与父级相关,而不是窗口视图点。
正文{背景:#ccc;}.包装器{边距:0自动;高度:1400px;宽度:650px;背景:绿色;}.侧边栏{背景色:#ddd;浮动:左侧;宽度:300px;高度:100px;位置:固定;}.主要{浮动:右侧;背景色:黄色;宽度:300px;高度:1400px;}<div class=“wrapper”>包装器<div class=“sidebar”>侧边栏</div><div class=“main”>main</div></div>
是的,根据规格,有办法。
虽然我同意格雷姆·布莱克伍德的答案应该是公认的,因为它实际上解决了这个问题,但应该注意的是,固定元素可以相对于其容器定位。
我无意中注意到在申请时
-webkit-transform: translateZ(0);
相对于身体,它创建了一个固定的子对象(而不是视口)。所以我左边的固定元素和顶部的财产现在是相对于容器的。
所以我做了一些研究,发现这个问题已经被埃里克·迈耶(Eric Meyer)所涵盖,即使这感觉像是一个“把戏”,但事实证明这是规范的一部分:
对于布局由CSS框模型控制的元素,任何值如果转换结果为“无”,则会同时创建堆叠上下文和包含块。该对象充当包含用于固定定位子体的块。
http://www.w3.org/TR/css3-transforms/
因此,如果对父元素应用任何变换,它将成为包含块。
但是
问题是,实现似乎有问题/有创意,因为元素也停止了固定的行为(即使这一点似乎不是规范的一部分)。
同样的行为在Safari、Chrome和Firefox中都可以找到,但在IE11中没有(其中固定元素仍然保持固定)。
另一件有趣的(未记录的)事情是,当一个固定元素包含在一个转换的元素中时,虽然它的顶部和左侧财产现在将与容器相关,但考虑到方框大小属性,它的滚动上下文将扩展到元素的边界,就像方框大小设置为border-box一样。对于一些有创意的人来说,这可能会成为一件玩物:)
TEST
使用纯CSS,你无法做到这一点;至少我没有。然而,您可以非常简单地使用jQuery来实现。我会解释我的问题,稍加改动你就可以使用了。
因此,首先,我希望我的元素有一个固定的顶部(从窗口顶部),以及一个从父元素继承的左侧组件(因为父元素居中)。要设置左侧组件,只需将元素放到父元素中,并设置父元素的位置:relative。
然后,您需要知道当滚动条位于顶部(y为零滚动)时,元素距离顶部的距离是多少;还有两种选择。首先,它是静态的(一些数字),或者必须从父元素中读取它。
在我的例子中,它距离顶部静态图像150像素。所以,当你看到150时,它是当我们没有滚动时,元素从顶部开始的数量。
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元素和纯CSS(现代浏览器)
请参见这个jsFiddle示例。调整大小并查看固定元素如何随浮动元素一起移动。使用最内侧的滚动条查看滚动在站点上的工作方式(固定元素保持固定)。
正如这里许多人所说的,一个键没有在固定元素上设置任何位置设置(没有上、右、下或左值)。
相反,我们将所有固定元素(注意最后一个框中有四个元素)放在要放置的框中,如下所示:
<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 */
}
注意,因为固定元素忽略了所有其他布局元素,所以fiddle中的最终容器可以有多个固定元素,并且仍然具有与左上角相关的所有元素。但是,只有当它们都放在容器中的第一个位置时,这才是正确的,因为这一比较结果表明,如果分散在容器内容中,定位就会变得不可靠。
包装器在定位上是静态的、相对的还是绝对的,这无关紧要。
这很简单(根据下面的HTML)
技巧是不要在元素(div)上使用“position:fixed;”的top或left。如果未指定这些元素,则“fixed content”元素将显示为相对于封闭元素(具有“position:RELATIVE;”的div)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>
上面的内容允许我在垂直滚动的div中的许多文本的顶部找到一个关闭的“X”按钮。“X”位于适当位置(不会随滚动文本移动,但当用户调整浏览器窗口的宽度时,它会随包围div容器向左或向右移动!因此,它垂直“固定”,但相对于包围元素水平定位!
在我开始工作之前,当我向下滚动文本内容时,“X”向上滚动并消失。
很抱歉没有提供我的javascript hideDiv()函数,但这将不必要地延长这篇文章的篇幅。我选择了尽量缩短。
我创建了一个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%'});
});
https://jsfiddle.net/bx6ktwnn/1/
神奇的是将屏幕宽度减去容器宽度,然后除以2:
//1400px is according to container max-width (left can be also right)
.fixed {
position: fixed;
right: calc((100vw - 1400px)/2);
}
注意:css calc()函数几乎不受支持,但不是100%受支持。对于大多数用例,它肯定得到了足够的支持。单击此处了解更多详细信息
代码段(有一个300px的容器,正好适合这个网站的小部件):
.容器{最大宽度:300px;左边距:自动;右边距:自动;}.固定{位置:固定;右:计算((100vw-300px)/2);}@媒体屏幕和(最大宽度:300px){右:0px;}<div style=“height:3000px”><div class=“container”><button class=“fixed”>固定含量</按钮>Lorem ipsum dolor坐在amet consectetur adipiscing elit。Laborum,eum?我要求最低限度,最低限度,最高限度,最低程度,最低限度-最低限度-最高限度!是否有责任追究责任?在过去的几年里,人们都在用鼻子和鼻子说话,用鼻子说话!在法庭的最高级别减去实验室的修改和体积后,法庭上的数字是相等的。加快我们的劳动时间,让我们一起努力,共同努力,共同奋斗,共同进步,共同进步!无论是什么样的物质解决方案,几乎没有人会在别名为auten pariator animi error的地方进行实验,也没有人会对实验结果进行验证!在dolorem ipsam eos porro magni出汗可能是主要的,它的脸。我们的过失是错误的,因为它排斥了可能的质量,asperiores earum ipsum interstias dicta sint fugit at que veniam dolorum illo?官方必须对所有人进行调查,调查结果表明,最大限度地减少自然灾害。所有人都坐着。</div></div>