ある個人のdiv
を別の個人のdiv
の上にオーバーレイすることについて支援が必要です。
私のコードはこのようになります:
<div class="navi"></div>
<div id="infoi">
<img src="info_icon2.png" height="20" width="32"/>
</div>
残念ながら、最初のdiv#infoi
内にdiv.navi
またはimg
をネストすることはできません。
示されているように2つの別々のdiv
sである必要がありますが、div#infoi
をdiv.navi
の上に配置し、div.navi
の上に中央揃えにする方法を知る必要があります。
#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;コードのみが必要な場合は、The Resultまでスクロールします。
2つの別個の兄弟要素があり、目標は2番目の要素(id
がinfoi
である)を配置することであるため、前の要素(class
がnavi
である要素)内に表示されます。 HTML構造は変更できません。
目的の結果を得るには、2番目の要素を移動または配置します。これを#infoi
と呼び、最初の要素の中に表示されます。これを.navi
と呼びます。具体的には、#infoi
の右上隅に.navi
を配置する必要があります。
CSSには、要素を配置するためのいくつかのプロパティがあります。デフォルトでは、すべての要素はposition: static
です。これは、要素がHTML構造内の順序に従って配置されることを意味しますが、例外はほとんどありません。
他のposition
値は、relative
、absolute
、およびfixed
です。要素のposition
をこれらの3つの値のいずれかに設定することで、次の4つのプロパティの組み合わせを使用して要素を配置できるようになりました。
top
right
bottom
left
つまり、position: absolute
を設定することで、top: 100px
を追加して、ページの上部から100ピクセルの位置に要素を配置できます。逆に、bottom: 100px
を設定すると、要素はページの下部から100ピクセルの位置に配置されます。
ここに多くのCSS新人が迷子になります-position: absolute
には参照フレームがあります。上記の例では、参照のフレームはbody
要素です。 position: absolute
とtop: 100px
は、要素がbody
要素の上部から100ピクセルに配置されることを意味します。
参照の位置フレーム、または位置コンテキストは、親要素のposition
をposition: static
以外の値に設定することで変更できます。つまり、親要素を指定することで新しい位置コンテキストを作成できます。
position: absolute;
position: relative;
position: fixed;
たとえば、<div class="parent">
要素にposition: relative
が指定されている場合、すべての子要素は<div class="parent">
を位置コンテキストとして使用します。子要素にposition: absolute
およびtop: 100px
が指定されている場合、<div class="parent">
は位置コンテキストであるため、要素は<div class="parent">
要素の上部から100ピクセルに配置されます。
他の要因注意すべきはスタック順-または要素がz方向にスタックされる方法です。ここで知っておくべきことは、要素のスタック順は、デフォルトでは、HTML構造内の順序の逆によって定義されることです。次の例を考えてみましょう。
<body>
<div>Bottom</div>
<div>Top</div>
</body>
この例では、2つの<div>
要素がページ上の同じ場所に配置されている場合、<div>Top</div>
要素は<div>Bottom</div>
要素をカバーします。 <div>Top</div>
はHTML構造内の<div>Bottom</div>
の後に来るため、より高いスタック順序を持ちます。
div {
position: absolute;
width: 50%;
height: 50%;
}
#bottom {
top: 0;
left: 0;
background-color: blue;
}
#top {
top: 25%;
left: 25%;
background-color: red;
}
<div id="bottom">Bottom</div>
<div id="top">Top</div>
z-index
またはorder
プロパティを使用して、CSSでスタック順序を変更できます。
要素の自然なHTML構造は、top
に表示したい要素が他の要素の後に来ることを意味するため、この問題のスタック順序は無視できます。
そこで、手元の問題に戻ります-この問題を解決するために位置コンテキストを使用します。
上記のように、目標は#infoi
要素内に表示されるように.navi
要素を配置することです。これを行うには、.navi
および#infoi
要素を新しい要素<div class="wrapper">
にラップして、新しい位置コンテキストを作成できるようにします。
<div class="wrapper">
<div class="navi"></div>
<div id="infoi"></div>
</div>
次に、.wrapper
にposition: relative
を指定して、新しい位置コンテキストを作成します。
.wrapper {
position: relative;
}
この新しい位置コンテキストにより、#infoi
を.wrapper
内に配置できます。まず、#infoi
に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
の右上隅にあるように見えます。
以下の例は基本に要約されており、最小限のスタイル設定が含まれています。
/*
* position: relative gives a new position context
*/
.wrapper {
position: relative;
}
/*
* The .navi properties are for styling only
* These properties can be changed or removed
*/
.navi {
background-color: #eaeaea;
height: 40px;
}
/*
* Position the #infoi element in the top-right
* of the .wrapper element
*/
#infoi {
position: absolute;
top: 0;
right: 0;
/*
* Styling only, the below can be changed or removed
* depending on your use case
*/
height: 20px;
padding: 10px 10px;
}
<div class="wrapper">
<div class="navi"></div>
<div id="infoi">
<img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
</div>
</div>
HTMLを編集できない場合、つまりラッパー要素を追加できない場合でも、目的の効果を達成できます。
position: absolute
要素で#infoi
を使用する代わりに、position: relative
を使用します。これにより、#infoi
要素の下のデフォルトの位置から.navi
要素を再配置できます。 position: relative
を使用すると、負のtop
値を使用してデフォルトの位置から上に移動し、left
値の100%
から数ピクセルを引いて、left: calc(100% - 52px)
を使用して右側近くに配置できます。
/*
* The .navi properties are for styling only
* These properties can be changed or removed
*/
.navi {
background-color: #eaeaea;
height: 40px;
width: 100%;
}
/*
* Position the #infoi element in the top-right
* of the .wrapper element
*/
#infoi {
position: relative;
display: inline-block;
top: -40px;
left: calc(100% - 52px);
/*
* Styling only, the below can be changed or removed
* depending on your use case
*/
height: 20px;
padding: 10px 10px;
}
<div class="navi"></div>
<div id="infoi">
<img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
</div>
スタイルz-index:1;
およびposition: absolute;
のdiv
を使用することによって、他のdiv
の上にdiv
をオーバーレイすることができます。
z-index
はdivが「スタック」する順序を決定します。高いz-index
を持つdivは、低いz-index
を持つ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に基づく100%の簡単な解決法です。 「秘密」は、wrapper要素でdisplay: inline-block
を使うことです。画像内のvertical-align: bottom
は、一部のブラウザで要素の後に追加される4pxパディングを克服するためのハックです。
アドバイス :ラッパーの前の要素がインラインの場合、それらは入れ子になってしまうことがあります。この場合、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>
私はあまり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メニューを右にフロートさせるように設定することもできます。お役に立てれば。
新しい Grid CSS specははるかに洗練された解決策を提供します。 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;
}
それでおしまい。 IE用にビルドしていないのであれば、あなたのコードはおそらくうまくいくでしょう。