他の要件のためにHTMLを変更できないテンプレートがある場合、HTML内でdiv
を別のdiv
より上に表示(並べ替え)するにはどうすればよいですか。両方のdiv
には、高さと幅が異なるデータが含まれています。
<div id="wrapper">
<div id="firstDiv">
Content to be below in this situation
</div>
<div id="secondDiv">
Content to be above in this situation
</div>
</div>
Other elements
うまくいけば、それは望ましい結果がであることは明らかです:
Content to be above in this situation
Content to be below in this situation
Other elements
寸法が固定されている場合は、必要な場所に簡単に配置できますが、内容が可変である場合についてはいくつかのアイデアが必要です。このシナリオでは、幅を両方とも100%にしてください。
私は特にCSSのみの解決策を探しています(そしてそれがうまくいかなければおそらく他の解決策でも満たす必要があるでしょう)。
これに続く他の要素があります。私が示した限られたシナリオを考えれば、良い提案が述べられています - それが最善の答えかもしれませんが、私はまたこれに続く要素が影響を受けないことを確かめています。
これ 解決策 はCSSのみを使用しており、変数の内容を扱う
#wrapper { display: table; }
#firstDiv { display: table-footer-group; }
#secondDiv { display: table-header-group; }
CSSのみの解決策( IE10 + に対応) - Flexboxのorder
プロパティを使う
デモ: http://jsfiddle.net/hqya7q6o/596/
#flex { display: flex; flex-direction: column; }
#a { order: 2; }
#b { order: 1; }
#c { order: 3; }
<div id="flex">
<div id="a">A</div>
<div id="b">B</div>
<div id="c">C</div>
</div>
詳細情報: https://developer.mozilla.org/en-US/docs/Web/CSS/order
他の人が言っているように、これはあなたがCSSでやりたいことではありません。絶対位置と奇妙なマージンでそれを欺くことができますが、それは堅牢なソリューションではありません。あなたの場合の最善の選択肢は、JavaScriptを有効にすることです。 jQueryでは、これは非常に簡単な作業です。
$('#secondDiv').insertBefore('#firstDiv');
またはより一般的に:
$('.swapMe').each(function(i, el) {
$(el).insertBefore($(el).prev());
});
これはFlexboxを使って行うことができます。
表示:flexとの両方を適用するコンテナを作成します。flex-flow:column-reverse.
/* -- Where the Magic Happens -- */
.container {
/* Setup Flexbox */
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
/* Reverse Column Order */
-webkit-flex-flow: column-reverse;
flex-flow: column-reverse;
}
/* -- Styling Only -- */
.container > div {
background: red;
color: white;
padding: 10px;
}
.container > div:last-of-type {
background: blue;
}
<div class="container">
<div class="first">
first
</div>
<div class="second">
second
</div>
</div>
出典:
Flexbox以前のユーザーエージェントをサポートしながらCSSだけであなたが望むことを達成する方法は全くありません( ほとんどの場合古いIE ) - :
もし上記が真実なら、あなたは絶対に要素を配置することによってあなたが望むことをすることができます -
#wrapper { position: relative; }
#firstDiv { position: absolute; height: 100px; top: 110px; }
#secondDiv { position: absolute; height: 100px; top: 0; }
繰り返しになりますが、少なくとも#firstDivに必要な高さがわからない場合は、CSSだけでは望みどおりのことができません。このコンテンツのいずれかが動的な場合は、JavaScriptを使用する必要があります。
これが解決策です。
<style>
#firstDiv {
position:absolute; top:100%;
}
#wrapper {
position:relative;
}
しかし、私はあなたがラッパーdivに続くいくつかのコンテンツを持っていると思います...
CSS3 flexboxのレイアウトモジュールを使えば、divを注文できます。
#wrapper {
display: flex;
flex-direction: column;
}
#firstDiv {
order: 2;
}
<div id="wrapper">
<div id="firstDiv">
Content1
</div>
<div id="secondDiv">
Content2
</div>
</div>
あなたが知っている、または上限になる要素のサイズを強制できる場合は、次のようにします。
position : absolute;
あなたのCSSで、divにその位置を教えてください。
それ以外の場合は、JavaScriptが唯一の方法です。
fd = document.getElementById( 'firstDiv' );
sd = document.getElementById( 'secondDiv' );
fd.parentNode.removeChild( fd );
sd.parentNode.insertAfter( fd, sd );
または似たようなもの。
編集:私はちょうどこれが役に立つかもしれないことがわかった: W3文書CSS3移動
トップマージンがマイナスの場合はこの効果が得られますが、ページごとにカスタマイズする必要があります。たとえば、このマークアップ...
<div class="product">
<h2>Greatest Product Ever</h2>
<p class="desc">This paragraph appears in the source code directly after the heading and will appear in the search results.</p>
<p class="sidenote">Note: This information appears in HTML after the product description appearing below.</p>
</div>
...そしてこのCSS ...
.product { width: 400px; }
.desc { margin-top: 5em; }
.sidenote { margin-top: -7em; }
... 2番目の段落を最初の段落の上に引くことができます。
もちろん、イントロパラグラフが適切な量にジャンプするように手動であなたのCSSを異なる記述の長さに微調整する必要があるでしょう、しかしあなたが他の部分に対する制御とマークアップとCSSに対する完全な制御を制限するなら。
ええ、ちょっと絶対的なポジショニングとちょっと危険なマージン設定で、私は近づくことができます、しかしそれは完全ではないかきれいではありません:
#wrapper { position: relative; margin-top: 4em; }
#firstDiv { position: absolute; top: 0; width: 100%; }
#secondDiv { position: absolute; bottom: 0; width: 100%; }
"margin-top:4em"は特に不快な部分です。このマージンはfirstDivのコンテンツの量に応じて調整する必要があります。あなたの正確な要求次第で、これは可能かもしれません、しかし私はとにかく誰かがしっかりした解決策のためにこれを築くことができるかもしれないことを望みます。
JavaScriptに関するEricのコメントはおそらく追求されるべきです。
これはCSSでのみ可能です。
この同様の質問に対する私の答えを確認してください。
https://stackoverflow.com/a/25462829/10772
私は自分の答えを二重に投稿したくはありませんが、それよりも短いのは、親がflexbox要素になる必要があるということです。例えば:
(ここでは、Webキットベンダーのプレフィックスのみを使用してください。)
#main {
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-orient: vertical;
-webkit-flex-direction: column;
flex-direction: column;
-webkit-box-align: start;
-webkit-align-items: flex-start;
align-items: flex-start;
}
それから、それらの順序を次のように指定してdivを入れ替えます。
#main > div#one{
-webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2;
-ms-flex-order: 2;
-webkit-order: 2;
order: 2;
overflow:visible;
}
#main > div#two{
-webkit-box-ordinal-group: 1;
-moz-box-ordinal-group: 1;
-ms-flex-order: 1;
-webkit-order: 1;
order: 1;
}
あなたはこれが必要です! cssでは、最初のdivを左または右にフロートさせます。 2番目のdivをfirstと同じように左または右にフロートさせます。 2番目のdivについては、上記の2 divと同じ左または右のクリア。例えば:
#firstDiv {
float: left;
}
#secondDiv {
float: left;
clear: left;
}
私の友達を楽しんでください。
より大きなブラウザをサポートするソリューション、それからflexbox(IE≥9で動作します):
#wrapper {
-webkit-transform: scaleY(-1);
-ms-transform: scaleY(-1);
transform: scaleY(-1);
}
#wrapper > * {
-webkit-transform: scaleY(-1);
-ms-transform: scaleY(-1);
transform: scaleY(-1);
}
<div id="wrapper">
<div id="firstDiv">
Content to be below in this situation
</div>
<div id="secondDiv">
Content to be above in this situation
</div>
</div>
Other elements
display: table;
ソリューションとは対照的に、このソリューションは.wrapper
が任意の数の子を持つ場合に機能します。
私はモバイル版のためだけにdivの順序を変更する方法を探していたので、私はそれをうまくスタイルすることができます。 nickf replyのおかげで、私が欲しいもののためにうまくいったこのコードを作ることができました。
// changing the order of the sidebar so it goes after the content for mobile versions
jQuery(window).resize(function(){
if ( jQuery(window).width() < 480 )
{
jQuery('#main-content').insertBefore('#sidebar');
}
if ( jQuery(window).width() > 480 )
{
jQuery('#sidebar').insertBefore('#main-content');
}
jQuery(window).height(); // New height
jQuery(window).width(); // New width
});
display: flex
とflex-direction : column
を指定して、親divにflexを使用するだけです。次に、orderを使用して、どちらの子divが最初に来るのかを判断します。