2016-05-05 4 views
0

DOMの初期順序を維持しながら、画面サイズに基づいて要素の位置と表示順序を異ならせるブラウザ間のやり方を探しています。要素は最初は別のコンテナに入れられており、メディアクエリのfloat/clearのような標準的な方法では十分ではないでしょう。画面サイズに基づいて異なるコンテナの要素を並べ替える

また、純粋なCSSソリューションであればいいですね。

このフィドルは、望ましくないロードおよびサイズ変更イベントでDOMを操作するためにjavascriptを使用しています。

https://jsfiddle.net/168y076w/

HTML:

<body> 
    <div id="header">HEADER</div> 
    <div id="left_column"> 
    <div id="left_box_1">LEFT BOX 1</div> 
    <div id="left_box_2">LEFT BOX 2</div> 
    </div> 
    <div id="main_content_holder_for_big_devices"></div> 
    <div id="right_column"> 
    <div id="right_box_1">RIGHT BOX 1</div> 
    <div id="main_content_holder_for_small_devices"> 
     <div id="mid_column">MID COLUMN</div> 
    </div> 
    <div id="right_box_2">RIGHT BOX 2</div> 
    </div> 
</body> 

CSS:

#header { 
    width: 100%; 
    height: 80px; 
    background: red; 
} 
#mid_column { 
    background: aqua; 
    height: 60px; 
} 
#left_box_1, #left_box_2 { 
    background: blue; 
    height: 40px; 
} 
#right_box_1 { 
    background: yellow; 
    height: 40px; 
} 
#right_box_2 { 
    background: purple; 
    height: 40px; 
} 
@media screen and (min-width: 600px) { 
    body { 
    width: 600px; 
    } 
    #left_column, #mid_column, #right_column { 
    float: left; 
    } 
    #left_box_1, #left_box_2, #right_box_1, #right_box_2 { 
    width: 150px; 
    } 
    #mid_column { 
    width:300px; 
    background: aqua; 
    } 
} 

Javascriptを:

const SMALL_DEVICE_WIDTH = 600; 

var $holder_for_small = $("#main_content_holder_for_small_devices"); 
var $holder_for_big = $("#main_content_holder_for_big_devices"); 

window.addEventListener("resize", move_content_in_dom); 
window.addEventListener("load", move_content_in_dom); 

function move_content_in_dom() { 
    var w = window.innerWidth; 
    if(w < SMALL_DEVICE_WIDTH) { 
    if($holder_for_big.html() !== "") { 
     $holder_for_small.html($holder_for_big.html()); 
     $holder_for_big.html(""); 
    } 
    } else { 
    if($holder_for_small.html() !== "") { 
     $holder_for_big.html($holder_for_small.html()); 
     $holder_for_small.html(""); 
    } 
    } 
} 

この画像は私が達成したいレイアウトを示しています。携帯電話のような小さなデバイスでは、上のヘッダーの後に、私は左の列からボックスを持っています。右の列から1つのボックスを、その後にメインのコンテンツを、その後に右の列の別のボックス

Desired layout mockup

私は車輪の再発明する必要はありませんので、私に適切なツールを与えるだろう答えを期待しています。

答えて

2

現在、あなたがしようとしているのは、純粋なCSS for Firefoxでのみ可能です。ちょっと複雑ですが、あなたが探しているのは抽象的に、子要素(列とは独立した項目)から独立して孫要素を配置することです。これはFirefoxで可能です。display: contentsを実装しています。これにより、子要素が親に「見えない」ようになり、孫要素の順序をCSSで制御できます。 ツールバー広告から分離することはできません、あなたが非Firefoxのブラウザに気づくでしょう...(ここでは、あなたの便宜のためにcodepenをだ)

body { 
 
    width: 100vw; 
 
    height: 100vh; 
 
    overflow: hidden; 
 
    font-weight: bold; 
 
    color: #fff; 
 
    text-shadow: 1px 1px 3px #000; 
 
    font-family: sans-serif; 
 
} 
 

 
.flex-container { 
 
    display: flex; 
 
    width: 100%; 
 
    background-color: gray; 
 
    margin-bottom: 5vh; 
 
    flex-wrap: wrap; 
 
    align-items: stretch; 
 
} 
 
.flex-container .cell { 
 
    padding: 4vmin; 
 
} 
 
.flex-container .flex-header { 
 
    background-color: red; 
 
    width: 100%; 
 
} 
 
.flex-container .flex-sideNav { 
 
    background-color: blue; 
 
    flex: 1; 
 
} 
 
.flex-container .flex-mainContainer { 
 
    background-color: green; 
 
    flex: 2; 
 
} 
 
.flex-container .flex-mainContainer div { 
 
    background-color: aqua; 
 
} 
 
.flex-container .flex-rightColumn { 
 
    flex: 1; 
 
} 
 
.flex-container .flex-toolbar { 
 
    background-color: yellow; 
 
} 
 
.flex-container .flex-adContainer { 
 
    background-color: purple; 
 
} 
 

 
@media (max-width: 600px) { 
 
    .flex-container { 
 
    flex-direction: column; 
 
    } 
 
    .flex-container > div { 
 
    width: 100%; 
 
    flex: 1 0; 
 
    } 
 
    .flex-container .flex-header { 
 
    order: 1; 
 
    } 
 
    .flex-container .flex-sideNav { 
 
    order: 2; 
 
    } 
 
    .flex-container .flex-toolbar { 
 
    order: 3; 
 
    width: 100%; 
 
    } 
 
    .flex-container .flex-mainContainer { 
 
    order: 4; 
 
    } 
 
    .flex-container .flex-adContainer { 
 
    order: 5; 
 
    width: 100%; 
 
    } 
 
    .flex-container .flex-rightColumn { 
 
    display: contents; 
 
    } 
 
}
<div class='flex-container'> 
 
\t <div class='flex-header cell'> 
 
\t \t Header. 
 
\t </div> 
 
\t <div class='flex-sideNav'> 
 
\t \t <div class='cell'>Sidenav One.</div> 
 
\t \t <div class='cell'>Sidenav, Redux.</div> 
 
\t </div> 
 
\t <div class='flex-mainContainer'> 
 
\t \t <div class='cell'>Main item, one.</div> 
 
\t \t <div class='cell'>Main item, two.</div> 
 
\t \t <div class='cell'>Main item, three.</div> 
 
\t </div> 
 
\t <div class='flex-rightColumn'> 
 
\t \t <div class='flex-toolbar cell'> 
 
\t \t \t Toolbar. 
 
\t \t </div> 
 
\t \t <div class='flex-adContainer cell'> 
 
\t \t \t Ads. 
 
\t \t </div> 
 
\t </div> 
 
</div>

を:ここで私が何を意味するかです純粋なCSSでが、Firefoxは正しく、このルールを実装:

.flex-container .flex-rightColumn { 
    display: contents; 
    } 

をそして、あなたはあなたが欲しいものを手に入れます。だから短い答え:フレックスボックスを使用して、それはFirefoxのためだけに良い見えるだろう; JavaScriptを使用すれば、今日は誰もが使えるようになるでしょう。がんばろう!

+0

実際、私は絶対位置付けと浮動を使ってやったと思います。 Windows上でChrome、Firefox、Opera、Vivaldi、IE 11で正常にテストされました。 Linux上のChromiumとFirefox; AndroidのChromeとAndroidブラウザメディアクエリがサポートされていないためIE8で失敗しました。IEの<9の大画面のスタイルを強制する条件付きコメントにスタイルを追加しました。 http://codepen.io/anon/pen/vGbYeK?editors=0100 – Lukas

+0

クール、良い仕事!あなたの質問は「画面サイズに基づいて異なるコンテナ内の要素を並べ替える」ということに注意してください。ソリューションでは、それらを同じコンテナ(「right_column」)に配置するだけで、追加を開始するときコンテンツ。しかし、幸運! –

+1

真。質問はもともと「サイド・コラムの行間のメイン・コンテンツ(小型デバイスのみ)」と呼ばれていました。彼らは私にペイパル・アドレスを送信するかどうかを尋ねるように私を楽しませてくれました。曖昧さを減らす。 – Lukas

関連する問題