Як змінити порядок стовпців Bootstrap 3 на мобільному макеті?


293

Я роблю чуйний макет із верхньою фіксованою навбарною панеллю. Внизу у мене два стовпчики, один для бічної панелі (3) та один для вмісту (9). Що на робочому столі виглядає так

навибар
[3] [9]

Коли я resizeпереношу мобільний телефон navbar, стискається та приховується, то бічна панель розміщується вгорі вмісту, наприклад:

навибар
[3]
[9]

Мені б хотілося, щоб основний вміст був у верхній частині, тому мені потрібно змінити замовлення на мобільний телефон таким:

навибар
[9]
[3]

Я знайшов цю статтю, яка охоплює ті самі моменти, але прийняту відповідь було відредаговано так, що рішення не стосується поточної версії Bootstrap.

Як можна впорядкувати ці стовпці на мобільному пристрої? Або, як я можу ввімкнути групу списків панелі в свій розширюваний навбар?

Ось мій код:

<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-->

Відповіді:


474

Ви не можете змінити порядок стовпців на менших екранах, але це можна зробити на великих екранах.

Тому змініть порядок своїх стовпців.

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

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

За замовчуванням це спочатку відображає основний вміст.

Тож у мобільному головному контент відображається спочатку.

За допомогою col-lg-pushта col-lg-pullми можемо упорядкувати стовпці на великих екранах та відобразити бічну панель зліва та основний вміст справа.

Тут працює робоча скрипка .


7
Саме цього я хотів, і ваша відповідь мала ідеальний сенс, дякую!
користувач3000310

2
@emre, чому ти вказуєш це просто великим розміром? в офіційному прикладі, здається, працює і для середнього. getbootstrap.com/css/#grid
Luchux

2
Мені було цікаво, для чого гарні заняття push і pull - тепер я знаю. Дякую.
cdonner

27
Незабаром після офіційного випуску 3.0 push / pull можна використовувати для зміни порядку стовпців будь-якого розміру екрана (xs, sm, md, lg) bootply.com/ft1tOI71cZ
Zim

Дякую за це Це б’ється positioning cols absolutelyі таке!
Радіація

89

Оновлено 2018 рік

Для початкового питання, заснованого на Bootstrap 3 , рішенням було використання push-pull .

У Bootstrap 4 тепер можна змінити порядок, навіть коли стовпці розміщені у вертикальній вертикалі, завдяки Flexbox Bootstrap 4. OFC, метод "push pull" все ще працюватиме, але тепер є інші способи змінити порядок стовпців у Bootstrap 4, що дозволяє повторно замовляти стовпці повної ширини.

Спосіб 1 - Використання flex-column-reverseдля xsекранів:

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

Спосіб 2 - Використання order-firstдля xsекранів:

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

Завантаження програми 4 (альфа 6): http://www.codeply.com/go/bBMOsvtJhD
Bootstrap 4.1: https://www.codeply.com/go/e0v77yGtcr


Оригінальний відповідь 3.x

Для оригінального питання, заснованого на Bootstrap 3 , рішенням було використання push-pull для більшої ширини, і тоді в стовпцях буде показано їх природний порядок на менші (xs) ширини. (AB назад до 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>

Запуск 3: http://www.codeply.com/go/wgzJXs3gel

@emre заявив: " Ви не можете змінити порядок стовпців на менших екранах, але це можна зробити на великих екранах ". Однак це слід уточнити, щоб сказати: "Ви не можете змінити порядок " складених "стовпців повної ширини .." у Bootstrap 3.


29

Відповіді тут працюють лише для двох комірок, але як тільки цих стовпців буде більше в них, це може призвести до трохи більшої складності. Я думаю, що я знайшов узагальнене рішення для будь-якої кількості комірок у кількох стовпцях.

Цілі

Отримайте вертикальну послідовність тегів на мобільних пристроях, щоб розташувати їх у будь-якому порядку, який вимагає дизайн на планшеті / робочому столі. У цьому конкретному прикладі один тег повинен входити в потік раніше, ніж зазвичай, а інший пізніше, ніж зазвичай.

Мобільний

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

Планшет +

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

Тож заголовок потрібно перетасовувати прямо на планшеті +, а технічно це робить і desc - він розташовується над тегом підписів, який передує йому на мобільному пристрої. Ви побачите через мить 4 підписи теж у біді.

Припустимо, кожна клітинка може змінюватись по висоті, і її потрібно обмітати зверху донизу наступною коміркою (виключаючи слабкі хитрощі, як таблиця).

Як і у всіх проблемах Bootstrap Grid, крок 1 полягає в усвідомленні того, що HTML повинен бути у мобільному порядку 1 2 3 4 5 на сторінці. Потім визначте, як змусити планшетний ПК / робочий стіл переупорядкувати себе таким чином - в ідеалі без Javascript.

Рішення отримати 1 headlineта 3 qtyсісти праворуч, а не ліворуч - просто встановити їх обох pull-right. Це стосується CSS float: right, тобто вони знаходять перший відкритий простір, який вони помістять праворуч. Ви можете уявити, що CSS-процесор браузера працює в такому порядку: 1 підходить до правого верхнього кута. 2 - наступний і є регулярним ( float: left), тому він іде в лівий верхній кут. Тоді 3, тобто float: rightце перескакує під 1.

Але цього рішення було недостатньо для 4 caption; тому що права 2 клітини настільки короткі, 2 imageзліва мають тенденцію бути довшими, ніж обидві разом. Bootstrap Сітка є прославленим поплавок хак, сенс 4 caption є float: left. З 2 imageзаймати стільки місця зліва, 4 captionспроби вписатися в наступному доступному просторі - часто в правій колонці, а НЕ ліву , де ми хотіли.

Тут вирішенням (і загалом для будь-якої такої проблеми) було додати тег зламу, прихований на мобільному пристрої, який існує на планшеті + для виштовхування підписів, що потім покривається негативним запасом - як це:

[2 image  ][1 headline]
[         ][3 qty     ]
[         ][4 hack    ]
[5 caption][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; }
}

Отже, тут узагальнене рішення - додати теги хаків, які можуть зникати на мобільному пристрої. На планшеті + теги злому дозволяють відображаються теги відображатися раніше чи пізніше в потоці, а потім витягуються вгору або вниз, щоб приховати ці теги злому.

Примітка. Я використовував фіксовану висоту заради простого прикладу у пов'язаному jsfiddle, але фактичний вміст сайту, над яким я працював, різниться за висотою у всіх 5 тегах. Він відображається належним чином із відносно великою дисперсією у висотах тегів, особливо у зображенні та нахилі.

Примітка 2: Залежно від вашого макета, ви можете мати достатньо послідовний порядок стовпців на планшеті + (або більшій роздільній здатності), щоб уникнути використання тегів зламу, використовуючи margin-bottomнатомість так:

Примітка 3: Для цього використовується Bootstrap 3. Bootstrap 4 використовує інший набір сітки, і не буде працювати з цими прикладами.

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


1
Дуже дякую за це чудове пояснення. Я працюю над чимось подібним на роботі вже 3 дні і продовжую відкладати, не знаючи куди йти. Дякую!
kdweber89

Найкраще ... Дякую ❤️
mghhgm

7

Жовтень 2017 року

Я хотів би додати ще одне рішення Bootstrap 4. Той, який працював на мене.

Властивість CSS "Замовити" у поєднанні з медіа-запитом можна використовувати для повторного замовлення стовпців, коли вони складаються у менші екрани.

Щось на зразок цього:

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

CodePen Посилання: https://codepen.io/preston206/pen/EwrXqm

Відрегулюйте розмір екрана, і ви побачите, що стовпці складаються в іншому порядку.

Я пов'язую це з питанням оригінального плаката. За допомогою CSS можна націлити набірну панель, бічну панель та вміст, а потім замовити властивості, застосовані в медіа-запиті.


5

У Bootstrap 4 , якщо ви хочете зробити щось подібне:

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

Ви повинні змінити порядок B , то C потім застосувати order-{breakpoint}-firstдо B . І застосуйте два різних налаштування, один, який змусить їх використовувати однакові стійки та інший, який змусить їх взяти повну ширину 12 кол:

  • Менші екрани: 12 мол до В і 12 кол до С

  • Більші екрани: 12 моток між сумою їх ( B + C = 12)

Подобається це

<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>

Демонстрація: https://codepen.io/anon/pen/wXLGKa


1

Це досить просто в jQuery, використовуючи insertAfter () або insertBefore ().

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

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

Це просто

якщо ви хочете встановити умови для мобільних пристроїв, ви можете зробити це таким чином

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

приклад https://jsfiddle.net/w9n27k23/


11
Це дуже погано, коли ви бачите, як хтось використовує JS для усунення проблеми з архітектурою HTML / CSS. Ви не виправляєте проблему, ви її просто приховуєте.
Зарко Йович

@ZarkoJovic так що? Іноді рішення JS можуть бути набагато більш життєздатними. Bootstrap не виготовлений з чистого CSS, він також використовує JS.
Наноріппер

1

Починаючи спочатку з мобільної версії, ви можете досягти того, що хочете, більшу частину часу.

Приклади тут:

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.