2016-05-05 15 views
0

Ich bin auf der Suche nach einer browserübergreifenden Möglichkeit, unterschiedliche Positionen und Anzeigereihenfolge für Elemente basierend auf der Bildschirmgröße festzulegen und gleichzeitig die ursprüngliche DOM-Reihenfolge beizubehalten. Die Elemente sind zunächst in separaten Containern und Standard-Wege wie float/clear in Medien-Abfragen würde wahrscheinlich nicht ausreichen.Elemente in verschiedenen Containern basierend auf der Bildschirmgröße neu anordnen

Auch wäre es schön, wenn es reine CSS-Lösung wäre.

Diese Geige verwendet Javascript, um das DOM beim Laden und Ändern der Größe zu manipulieren, was unerwünscht ist.

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(""); 
    } 
    } 
} 

Dieses Bild zeigt das Layout ich erreichen möchte. Auf kleinen Geräten wie Handys, nach Kopfzeile oben, möchte ich die Boxen aus der linken Spalte haben, nach ihnen Ich möchte eine Box aus der rechten Spalte, danach den Hauptinhalt, und danach eine andere Box aus der rechten Spalte.

Desired layout mockup

ich eine Antwort bin der Hoffnung, dass mir die richtigen Werkzeuge geben würde, so dass ich das Rad nicht neu erfinden.

Antwort

2

Derzeit ist das, was Sie versuchen, nur in reinem CSS für Firefox möglich. Es ist ein wenig kompliziert, aber was Sie abstrakt machen wollen, ist, Enkelelemente unabhängig von Kindelementen (Elemente unabhängig von Spalten) anzuordnen. Dies ist in Firefox möglich, da implementiert wurde, wodurch untergeordnete Elemente für ihre Eltern "unsichtbar" werden, wodurch Sie CSS-Kontrolle über die Reihenfolge der Enkelelemente erhalten. Hier ist, was ich meine:

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>

(Hier ist ein codepen für Ihre Bequemlichkeit) ... Sie auf Nicht-Firefox-Browser auffallen wird, Toolbar nicht von Anzeigen getrennt werden in reinem CSS, aber Firefox implementiert korrekt diese Regel:

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

Und Sie bekommen, was Sie wollen. Also kurze Antwort: Benutze flexbox und es sieht heute nur für Firefox gut aus; benutze JavaScript und es wird heute für alle funktionieren. Viel Glück!

+0

Eigentlich glaube ich, ich habe es gerade mit absoluter Positionierung und Floating getan. Getestet erfolgreich in Chrome, Firefox, Opera, Vivaldi und IE 11 unter Windows; Chromium und Firefox unter Linux; Chrome und Android Browser auf Android. Auf IE8 fehlgeschlagen, da die Unterstützung von Medienabfragen fehlte. Daher habe ich einem bedingten Kommentar Stile hinzugefügt, die Stile für große Bildschirme in IE <9 erzwingen (niemand, der sie verwendet, benötigt sowieso eine Antwort). http://codepen.io/anon/pen/vGbYeK?editors=0100 – Lukas

+0

Cool, gute Arbeit!Beachten Sie, dass Ihre Frage war "Elemente in verschiedenen Containern basierend auf der Bildschirmgröße neu anordnen", und in Ihrer Lösung, Sie nur in den gleichen Container ("Right_column"), so dass es möglicherweise nicht genau das, was Sie wollen, wenn Sie beginnen hinzufügen Inhalt. Aber, viel Glück! –

+1

Wahr. Die Frage lautete ursprünglich "Hauptinhalt zwischen Zeilen aus der Seitenspalte (nur für kleine Geräte)", und sie war so spezifisch, dass sich Leute über mich lustig machten und fragten, ob sie mir eine Paypal-Adresse schicken sollten Verringerung der Eindeutigkeit. – Lukas

Verwandte Themen