Come posso cambiare l'ordine delle colonne di Bootstrap 3 sul layout mobile?


293

Sto realizzando un layout reattivo con una barra di navigazione fissa superiore. Sotto ho due colonne, una per una barra laterale (3) e una per contenuto (9). Che sul desktop è simile a questo

navbar
[3] [9]

Quando io resizeal cellulare il navbarè compresso e nascosto, quindi la barra laterale è sovrapposta al contenuto, in questo modo:

navbar
[3]
[9]

Vorrei il contenuto principale in alto, quindi devo cambiare l'ordine sul cellulare in questo:

navbar
[9]
[3]

Ho trovato questo articolo che copre gli stessi punti, ma la risposta accettata è stata modificata per dire che la soluzione non si applica alla versione corrente di Bootstrap.

Come posso riordinare queste colonne sul cellulare? O in alternativa, come posso ottenere il gruppo elenco sidbar nella mia barra di navigazione in espansione?

Ecco il mio codice:

<div class="navbar navbar-inverse navbar-static-top">
  <div class="container">
    <a href="#" class="navbar-brand">Brand Title</a>
    <button class="navbar-toggle" data-toggle="collapse" data-target=".navHeaderCollapse">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>
    <div class="collapse navbar-collapse navHeaderCollapse">

    <ul class="nav navbar-nav navbar-right"><!--original navbar-->
      <li class="active"><a href="#">Home</a></li>
      <li><a href="#">FAQ</a></li>
    </ul>

    </div>
  </div>
</div><!--End Navbar Div-->
    <div class="container">
  <div class="row">

    <div class="col-lg-3">
  <div class="list-group">
    <a href="#" class="list-group-item">
    <h4 class="list-group-item-heading">Lorem ipsum</h4>
    <p class="list-group-item-text">Lorem Ipsum is simply dummy text.</p></a>
  </div>
</div><!--end sidebar-->


<div class="col-lg-9">
  <div class="panel panel-default">
    <div class="panel-body">
      <div class="page-header">
     Main Content
    </div>
  </div>
</div><!--end main content area-->

Risposte:


475

Non è possibile modificare l'ordine delle colonne in schermi più piccoli, ma è possibile farlo in schermi di grandi dimensioni.

Quindi cambia l'ordine delle tue colonne.

<!--Main Content-->
<div class="col-lg-9 col-lg-push-3">
</div>

<!--Sidebar-->
<div class="col-lg-3 col-lg-pull-9">
</div>

Per impostazione predefinita, questo visualizza prima il contenuto principale.

Quindi nel contenuto principale mobile viene visualizzato per primo.

Usando col-lg-pushe col-lg-pullpossiamo riordinare le colonne in schermi di grandi dimensioni e visualizzare la barra laterale a sinistra e il contenuto principale a destra.

Violino di lavoro qui .


8
È esattamente quello che volevo e la tua risposta aveva perfettamente senso, grazie!
user3000310

2
@emre, perché lo specifichi solo in grande? nell'esempio ufficiale sembra funzionare anche a metà. getbootstrap.com/css/#grid
Luchux

3
Mi chiedevo a cosa servano le lezioni push and pull - ora lo so. Grazie.
Cdonner,

28
Poco dopo il rilascio ufficiale di 3.0 push / pull può essere utilizzato per modificare l'ordine delle colonne in qualsiasi dimensione dello schermo (xs, sm, md, lg) bootply.com/ft1tOI71cZ
Zim

Grazie per questo. Questo batte positioning cols absolutelye così!
Radmation,

89

Aggiornato 2018

Per la domanda originale basata su Bootstrap 3 , la soluzione era usare il push-pull .

In Bootstrap 4 è ora possibile cambiare l'ordine, anche quando le colonne sono impilate verticalmente a tutta larghezza , grazie alla flexbox Bootstrap 4. OFC, il metodo push pull continuerà a funzionare, ma ora ci sono altri modi per cambiare l'ordine delle colonne in Bootstrap 4, rendendo possibile riordinare le colonne a larghezza intera.

Metodo 1 - Utilizzare flex-column-reverseper le xsschermate:

<div class="row flex-column-reverse flex-md-row">
    <div class="col-md-3">
        sidebar
    </div>
    <div class="col-md-9">
        main
    </div>
</div>

Metodo 2 - Utilizzare order-firstper le xsschermate:

<div class="row">
    <div class="col-md-3">
        sidebar
    </div>
    <div class="col-md-9 order-first order-md-last">
        main
    </div>
</div>

Bootstrap 4 (alpha 6): http://www.codeply.com/go/bBMOsvtJhD
Bootstrap 4.1: https://www.codeply.com/go/e0v77yGtcr


Risposta 3.x originale

Per la domanda originale basata su Bootstrap 3 , la soluzione era usare il push-pull per le larghezze più grandi, e quindi le colonne mostreranno il loro ordine naturale su larghezze più piccole (xs). (AB inverso a BA).

<div class="container">
    <div class="row">
        <div class="col-md-9 col-md-push-3">
            main
        </div>
        <div class="col-md-3 col-md-pull-9">
            sidebar
        </div>
    </div>
</div>

Bootstrap 3: http://www.codeply.com/go/wgzJXs3gel

@emre ha dichiarato: " Non è possibile modificare l'ordine delle colonne in schermi più piccoli ma è possibile farlo in schermi di grandi dimensioni ". Tuttavia, questo dovrebbe essere chiarito per indicare: "Non è possibile modificare l'ordine delle colonne" impilate "a larghezza intera in" Bootstrap 3.


29

Le risposte qui funzionano solo per 2 celle, ma non appena quelle colonne ne contengono di più, può portare a un po 'più di complessità. Penso di aver trovato una soluzione generalizzata per qualsiasi numero di celle in più colonne.

#Goals Ottieni una sequenza verticale di tag sul dispositivo mobile per sistemarsi nell'ordine richiesto dal design su tablet / desktop. In questo esempio concreto, un tag deve entrare nel flusso prima di quanto farebbe normalmente, e un altro dopo di quanto normalmente farebbe.

##Mobile

[1 headline]
[2 image]
[3 qty]
[4 caption]
[5 desc]

## Tablet +

[2 image  ][1 headline]
[         ][3 qty     ]
[         ][5 desc    ]
[4 caption][          ]
[         ][          ]

Quindi il titolo deve essere mischiato direttamente su tablet +, e tecnicamente, così fa desc: si trova sopra il tag didascalia che lo precede sul cellulare. In un attimo vedrai che anche 4 didascalie sono in difficoltà.

Supponiamo che ogni cella possa variare in altezza e debba essere allineata dall'alto verso il basso con la cella successiva (escludendo i trucchi deboli come una tabella).

Come per tutti i problemi di Bootstrap Grid, il passaggio 1 è rendersi conto che l'HTML deve essere in ordine mobile, 1 2 3 4 5, nella pagina. Quindi, determina come far riordinare un tablet / desktop in questo modo, idealmente senza Javascript.

La soluzione per ottenere 1 headlinee 3 qtysedersi a destra, non a sinistra è semplicemente impostarli entrambi pull-right. Questo vale per i CSS float: right, nel senso che trovano il primo spazio aperto che si adatteranno a destra. Puoi pensare al processore CSS del browser che funziona nel seguente ordine: 1 si adatta all'angolo in alto a destra. 2 è il prossimo ed è regolare ( float: left), quindi va nell'angolo in alto a sinistra. Quindi 3, che è float: rightcosì salta sotto 1.

Ma questa soluzione non era abbastanza per 4 captions; perché le 2 celle di destra sono così corte 2 imagesulla sinistra tende ad essere più lunghe di entrambe. Bootstrap Grid è un hack float glorificato, il che significa che 4 caption è float: left. Con 2 imagesoccupare così tanto spazio a sinistra,4 caption i tentativi per adattarsi nel prossimo spazio a disposizione - spesso il colonna di destra, non a sinistra dove volevamo.

La soluzione qui (e più in generale per qualsiasi problema come questo) era quella di aggiungere un tag hack, nascosto su dispositivo mobile, che esiste su tablet + per eliminare la didascalia, che viene quindi coperto da un margine negativo - in questo modo:

[2 image  ][1 headline]
[         ][3 qty     ]
[         ][4 hack    ]
[5 captions][6 desc ^^^]
[         ][          ]

http://jsfiddle.net/b9chris/52VtD/16633/

HTML:

<div id=headline class="col-xs-12 col-sm-6 pull-right">Product Headline</div>
<div id=image class="col-xs-12 col-sm-6">Product Image</div>
<div id=qty class="col-xs-12 col-sm-6 pull-right">Qty, Add to cart</div>
<div id=hack class="hidden-xs col-sm-6">Hack</div>
<div id=caption class="col-xs-12 col-sm-6">Product image caption</div>
<div id=desc class="col-xs-12 col-sm-6 pull-right">Product description</div>

CSS:

#hack { height: 50px; }

@media (min-width: @screen-sm) {
    #desc { margin-top: -50px; }
}

Quindi, la soluzione generalizzata qui è quella di aggiungere tag hack che possono scomparire sui dispositivi mobili. Su tablet + l'hack, i tag consentono ai tag visualizzati di apparire prima o poi nel flusso, quindi vengono tirati su o giù per coprire quei tag hack.

Nota: ho usato altezze fisse per il semplice esempio nel jsfiddle collegato, ma il contenuto del sito effettivo su cui stavo lavorando varia in altezza in tutti e 5 i tag. Viene visualizzato correttamente con una varianza relativamente grande nelle altezze dei tag, in particolare immagine e descrizione.

Nota 2: a seconda del layout, potresti avere un ordine di colonna abbastanza coerente su tablet + (o risoluzioni più grandi), che puoi evitare l'uso di tag hack, usando margin-bottominvece, in questo modo:

Nota 3: utilizza Bootstrap 3. Bootstrap 4 utilizza un set di griglia diverso e non funzionerà con questi esempi.

http://jsfiddle.net/b9chris/52VtD/16632/


1
Grazie mille per questa meravigliosa spiegazione. Sto lavorando a qualcosa di simile al lavoro da 3 giorni e ho continuato a smettere, non sapendo dove andare. Grazie!
kdweber89,

Meglio ... Grazie m
mghhgm

7

Ottobre 2017

Vorrei aggiungere un'altra soluzione Bootstrap 4. Uno che ha funzionato per me.

La proprietà CSS "Ordine", combinata con una query multimediale, può essere utilizzata per riordinare le colonne quando vengono impilate in schermi più piccoli.

Qualcosa come questo:

@media only screen and (max-width: 768px) {
    #first {
        order: 2;
    }
    #second {
        order: 4;
    }
    #third {
        order: 1;
    }
    #fourth {
        order: 3;
    }
}

Collegamento CodePen: https://codepen.io/preston206/pen/EwrXqm

Regola le dimensioni dello schermo e vedrai le colonne impilate in un ordine diverso.

Lo legherò alla domanda del poster originale. Con CSS, la barra di navigazione, la barra laterale e il contenuto possono essere scelti come target e quindi ordinare le proprietà applicate all'interno di una query multimediale.


5

In Bootstrap 4 , se vuoi fare qualcosa del genere:

    Mobile  |   Desktop
-----------------------------
    A       |       A
    C       |   B       C
    B       |       D
    D       |

È necessario invertire l'ordine di B quindi C, quindi applicareorder-{breakpoint}-first a B . E applica due impostazioni diverse, una che le farà condividere le stesse colonne e l'altra che le farà prendere l'intera larghezza delle 12 colonne:

  • Schermi più piccoli: da 12 a B. e da 12 a C

  • Schermi più grandi: 12 cols tra la somma di essi ( B + C = 12)

Come questo

<div class='row no-gutters'>
    <div class='col-12'>
        A
    </div>
    <div class='col-12'>
        <div class='row no-gutters'>
            <div class='col-12 col-md-6'>
                C
            </div>
            <div class='col-12 col-md-6 order-md-first'>
                B
            </div>
        </div>
    </div>
    <div class='col-12'>
        D
    </div>
</div>

Demo: https://codepen.io/anon/pen/wXLGKa


1

Questo è abbastanza facile con jQuery usando insertAfter () o insertBefore ().

<div class="left">content</div> <div class="right">sidebar</div>

<script>
$('.right').insertBefore('left');
</script>

Così semplice

se si desidera impostare una condizione per i dispositivi mobili, è possibile farlo in questo modo

<script>
  var $iW = $(window).innerWidth();
  if ($iW < 992){
     $('.right').insertBefore('.left');
  }else{
     $('.right').insertAfter('.left');
  }
</script>

esempio https://jsfiddle.net/w9n27k23/


11
È davvero una brutta sensazione quando vedi qualcuno che usa JS per correggere il problema con l'architettura HTML / CSS. Non stai correggendo il problema, lo stai solo nascondendo.
Zarko Jovic

@ZarkoJovic e allora? A volte le soluzioni JS potrebbero essere molto più praticabili. Bootstrap non è fatto di puro CSS, utilizza anche JS.
Nanoripper,

1

A partire dalla versione mobile, puoi ottenere ciò che vuoi, il più delle volte.

Esempi qui:

http://jsbin.com/wulexiq/edit?html,css,output

<div class="container">
      <h1>PUSH - PULL Bootstrap demo</h1>
    <h2>Version 1:</h2>

    <div class="row">

      <div class="col-xs-12 col-sm-5 col-sm-push-3 green">
        IN MIDDLE ON SMALL/MEDIUM/LARGE SCREEN
        <hr> TOP ROW XS-SMALL SCREEN
      </div>

      <div class="col-xs-12 col-sm-4 col-sm-push-3 gold">
        TO THE RIGHT ON SMALL/MEDIUM/LARGE SCREEN
        <hr> MIDDLE ROW ON XS-SMALL
      </div>

      <div class="col-xs-12 col-sm-3 col-sm-pull-9 red">
        TO THE LEFT ON SMALL/MEDIUM/LARGE SCREEN
        <hr> BOTTOM ROW ON XS-SMALL
      </div>

    </div>

    <h2>Version 2:</h2>

    <div class="row">

      <div class="col-xs-12 col-sm-4 col-sm-push-8 yellow">
        TO THE RIGHT ON SMALL/MEDIUM/LARGE SCREEN
        <hr> TOP ROW ON XS-SMALL
      </div>

      <div class="col-xs-12 col-sm-4 col-sm-pull-4 blue">
        TO THE LEFT ON SMALL/MEDIUM/LARGE SCREEN
        <hr> MIDDLE ROW XS-SMALL SCREEN
      </div>

      <div class="col-xs-12 col-sm-4 col-sm-pull-4 pink">
        IN MIDDLE ON SMALL/MEDIUM/LARGE SCREEN
        <hr> BOTTOM ROW ON XS-SMALL
      </div>

    </div>

    <h2>Version 3:</h2>

    <div class="row">

      <div class="col-xs-12 col-sm-5 cyan">
        TO THE LEFT ON SMALL/MEDIUM/LARGE SCREEN TOP ROW ON XS-SMALL
      </div>

      <div class="col-xs-12 col-sm-3 col-sm-push-4 orange">
        TO THE RIGHT ON SMALL/MEDIUM/LARGE SCREEN
        <hr> MIDDLE ROW ON XS-SMALL
      </div>

      <div class="col-xs-12 col-sm-4 col-sm-pull-3 brown">
        IN THE MIDDLE ON SMALL/MEDIUM/LARGE SCREEN
        <hr> BOTTOM ROW XS-SMALL SCREEN
      </div>

    </div>

    <h2>Version 4:</h2>
    <div class="row">

      <div class="col-xs-12 col-sm-4 col-sm-push-8 darkblue">
        TO THE RIGHT ON SMALL/MEDIUM/LARGE SCREEN
        <hr> TOP ROW XS-SMALL SCREEN
      </div>

      <div class="col-xs-12 col-sm-4 beige">
        MIDDLE ON SMALL/MEDIUM/LARGE SCREEN
        <hr> MIDDLE ROW ON XS-SMALL
      </div>

      <div class="col-xs-12 col-sm-4 col-sm-pull-8 silver">
        TO THE LEFT ON SMALL/MEDIUM/LARGE SCREEN
        <hr> BOTTOM ROW ON XS-SMALL
      </div>

    </div>

  </div>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.