Answers:
#container {
width: 100px;
height: 100px;
position: relative;
}
#navi,
#infoi {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
#infoi {
z-index: 10;
}
<div id="container">
<div id="navi">a</div>
<div id="infoi">
<img src="https://appharbor.com/assets/images/stackoverflow-logo.png" height="20" width="32" />b
</div>
</div>
我建议使用来了解position: relative
和子元素position: absolute
。
公认的解决方案效果很好,但是IMO缺乏有关为什么起作用的解释。下面的示例归结为基本示例,并将重要的CSS与无关的样式CSS分开。另外,我还详细介绍了CSS定位的工作原理。
TLDR;如果只需要代码,请向下滚动到Result。
有两个单独的,兄弟姐妹,元件和目标是所述第二元件(带有定位id
的infoi
),所以会出现前一个元素(具有一个内class
的navi
)。HTML结构无法更改。
为了获得所需的结果,我们将移动或定位第二个元素(称为#infoi
第一个元素),使其出现在第一个元素(称为)中.navi
。具体来说,我们希望#infoi
位于的右上角.navi
。
CSS具有一些用于定位元素的属性。默认情况下,所有元素均为position: static
。这意味着该元素将按照其在HTML结构中的顺序定位,只有少数例外。
其他position
值是relative
,absolute
,sticky
,和fixed
。通过将元素的position
值设置为其他值之一,现在可以使用以下四个属性的组合来放置元素:
top
right
bottom
left
换句话说,通过设置position: absolute
,我们可以添加top: 100px
元素以使其距离页面顶部100个像素。相反,如果我们将bottom: 100px
元素设置为距离页面底部100像素。
这是许多CSS新手迷路的地方 -position: absolute
具有参考框架。在上面的示例中,参照系是body
元素。position: absolute
与top: 100px
装置的元件从顶部放置100个像素body
元件。
通过将position
父元素的设置为以外的任何值position: static
,可以更改参考位置框架或位置上下文。也就是说,我们可以通过提供父元素来创建新的职位上下文:
position: relative;
position: absolute;
position: sticky;
position: fixed;
例如,如果<div class="parent">
给定了元素position: relative
,则任何子元素都将<div class="parent">
用作其位置上下文。如果给定了子元素position: absolute
和top: 100px
,则该元素将被定位为距离<div class="parent">
元素顶部100个像素,这<div class="parent">
是因为现在是position上下文。
要注意的另一个因素是堆叠顺序 -或元素如何沿z方向堆叠。这里必须知道的是,元素的堆栈顺序默认情况下是通过HTML结构中它们的顺序相反来定义的。考虑以下示例:
<body>
<div>Bottom</div>
<div>Top</div>
</body>
在此示例中,如果两个<div>
元素位于页面上的相同位置,则该<div>Top</div>
元素将覆盖该<div>Bottom</div>
元素。由于在HTML结构中排在<div>Top</div>
后面<div>Bottom</div>
,因此具有更高的堆叠顺序。
可以使用z-index
或order
属性通过CSS更改堆叠顺序。
在本期中,我们可以忽略堆叠顺序,因为元素的自然HTML结构意味着我们要出现top
的元素位于另一个元素之后。
因此,回到眼前的问题-我们将使用职位上下文解决此问题。
如上所述,我们的目标是#infoi
放置元素,使其出现在.navi
元素内。为此,我们将.navi
and #infoi
元素包装在一个新元素中,<div class="wrapper">
以便我们可以创建一个新的position上下文。
<div class="wrapper">
<div class="navi"></div>
<div id="infoi"></div>
</div>
然后通过给出.wrapper
一个新的职位上下文position: relative
。
.wrapper {
position: relative;
}
有了这个新的职位背景,我们就可以#infoi
在内定位.wrapper
。首先,给#infoi
a position: absolute
,使我们可以#infoi
绝对地定位.wrapper
。
然后添加top: 0
和right: 0
将#infoi
元素放置在右上角。请记住,由于#infoi
元素被.wrapper
用作其位置上下文,因此它将位于.wrapper
元素的右上角。
#infoi {
position: absolute;
top: 0;
right: 0;
}
因为.wrapper
仅仅是用于一个容器.navi
,定位#infoi
在右上角的.wrapper
给出了被定位在的右上角的效果.navi
。
#infoi
现在,它似乎位于的右上角.navi
。
下面的示例归结为基础,并包含一些最小的样式。
这是使用CSS Grid .navi
将#infoi
元素放置在最右边的另一种解决方案。我使用了详细grid
属性,使其尽可能清晰。
在我们无法编辑任何HTML的情况下,这意味着我们无法添加包装元素,我们仍然可以达到预期的效果。
而不是position: absolute
在#infoi
元素上使用,而是使用position: relative
。这使我们能够从#infoi
元素下方的默认位置重新定位.navi
元素。随着position: relative
我们可以用一个负top
价值,它从它的默认位置和移动left
的值100%
减去几个像素,使用left: calc(100% - 52px)
,将它定位靠近右侧。
通过使用 div
with样式z-index:1;
,position: absolute;
您可以将其叠加div
在任何其他样式上div
。
z-index
确定div堆栈的顺序。具有较高div的div z-index
将出现在具有较低div的div的前面z-index
。请注意,此属性仅适用于定位的元素。
新的Grid CSS规范提供了更为优雅的解决方案。使用position: absolute
网格可能会导致重叠或缩放问题,而Grid可以使您免受脏CSS黑客的攻击。
最小的网格叠加示例:
的HTML
<div class="container">
<div class="content">This is the content</div>
<div class="overlay">Overlay - must be placed under content in the HTML</div>
</div>
的CSS
.container {
display: grid;
}
.content, .overlay {
grid-area: 1 / 1;
}
而已。如果您不是为Internet Explorer构建的,则您的代码很可能会工作。
以下是基于CSS的简单解决方案100%。“秘密”是display: inline-block
在包装元素中使用。的vertical-align: bottom
图像中是克服4像素填充,有些浏览器元素后添加一个黑客。
建议:如果包装器之前的元素是内联的,则最终可能会嵌套。在这种情况下,您可以使用display: block
通常是好旧的容器将容器“包裹” div
。
.wrapper {
display: inline-block;
position: relative;
}
.hover {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 188, 212, 0);
transition: background-color 0.5s;
}
.hover:hover {
background-color: rgba(0, 188, 212, 0.8);
// You can tweak with other background properties too (ie: background-image)...
}
img {
vertical-align: bottom;
}
<div class="wrapper">
<div class="hover"></div>
<img src="http://placehold.it/450x250" />
</div>
这是您需要的:
function showFrontLayer() {
document.getElementById('bg_mask').style.visibility='visible';
document.getElementById('frontlayer').style.visibility='visible';
}
function hideFrontLayer() {
document.getElementById('bg_mask').style.visibility='hidden';
document.getElementById('frontlayer').style.visibility='hidden';
}
#bg_mask {
position: absolute;
top: 0;
right: 0; bottom: 0;
left: 0;
margin: auto;
margin-top: 0px;
width: 981px;
height: 610px;
background : url("img_dot_white.jpg") center;
z-index: 0;
visibility: hidden;
}
#frontlayer {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: 70px 140px 175px 140px;
padding : 30px;
width: 700px;
height: 400px;
background-color: orange;
visibility: hidden;
border: 1px solid black;
z-index: 1;
}
</style>
<html>
<head>
<META HTTP-EQUIV="EXPIRES" CONTENT="-1" />
</head>
<body>
<form action="test.html">
<div id="baselayer">
<input type="text" value="testing text"/>
<input type="button" value="Show front layer" onclick="showFrontLayer();"/> Click 'Show front layer' button<br/><br/><br/>
Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text
Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text
Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing textsting text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text Testing text
<div id="bg_mask">
<div id="frontlayer"><br/><br/>
Now try to click on "Show front layer" button or the text box. It is not active.<br/><br/><br/>
Use position: absolute to get the one div on top of another div.<br/><br/><br/>
The bg_mask div is between baselayer and front layer.<br/><br/><br/>
In bg_mask, img_dot_white.jpg(1 pixel in width and height) is used as background image to avoid IE browser transparency issue;<br/><br/><br/>
<input type="button" value="Hide front layer" onclick="hideFrontLayer();"/>
</div>
</div>
</div>
</form>
</body>
</html>
我既不是编码员,也不是CSS专家,但是我仍然在Web设计中使用您的想法。我也尝试过不同的解决方案:
#wrapper {
margin: 0 auto;
width: 901px;
height: 100%;
background-color: #f7f7f7;
background-image: url(images/wrapperback.gif);
color: #000;
}
#header {
float: left;
width: 100.00%;
height: 122px;
background-color: #00314e;
background-image: url(images/header.jpg);
color: #fff;
}
#menu {
float: left;
padding-top: 20px;
margin-left: 495px;
width: 390px;
color: #f1f1f1;
}
<div id="wrapper">
<div id="header">
<div id="menu">
menu will go here
</div>
</div>
</div>
当然,它们两个周围都有包装纸。您可以控制菜单div的位置,该菜单将在页眉div中以左边距和顶部位置显示。您也可以根据需要将div菜单设置为浮动。
这是一个简单的示例,将带有加载图标的叠加效果带到另一个div上。
<style>
#overlay {
position: absolute;
width: 100%;
height: 100%;
background: black url('icons/loading.gif') center center no-repeat; /* Make sure the path and a fine named 'loading.gif' is there */
background-size: 50px;
z-index: 1;
opacity: .6;
}
.wraper{
position: relative;
width:400px; /* Just for testing, remove width and height if you have content inside this div */
height:500px; /* Remove this if you have content inside */
}
</style>
<h2>The overlay tester</h2>
<div class="wraper">
<div id="overlay"></div>
<h3>Apply the overlay over this div</h3>
</div>
overflow: hidden
,请overflow: visible
改用。