mirap
mirap

Reputation: 1266

Ruby on rails - Bootstrap - 3 columns made responsive

I have home page with following code:

 <% @events.each_slice(3).to_a.each do |chunk| %>
 <div class="row row-centered">
   <% chunk.each do |event| %>
     <div class="col-xs-12 col-sm-6 col-md-6 col-lg-4 col-centered">

         centered content with max-width 300px

     </div>
   <% end %>
</div>
<% end %>

On big screen it works well. But when I change the size of browser, columns goes from 3 per row to 2 per row and the one left column goes to next row. So I have:

Is there any universal solution for responsive columns generated using @objects.each_slice(3)?

Upvotes: 1

Views: 2043

Answers (3)

mirap
mirap

Reputation: 1266

So, my solution is pretty simple. On homepage I'll be showing exactly 12 posts. Given that, i changed my code to this:

<div class="row row-centered">
<% @events.each_slice(3).to_a.each do |chunk| %>

   <% chunk.each do |event| %>
     <div class="col-xs-12 col-sm-6 col-md-6 col-lg-4 col-centered">
         <div class="thumbnail">

          </div>
     </div>
   <% end %>

<% end %>
</div>

Given that I'm not generating row with 3 columns, but one row with 12 columns - and I let Bootstrap to deal with.

Upvotes: 1

Elvn
Elvn

Reputation: 3057

HTML example showing how Bootstrap responsive grids react to re-sizing

I wrote this HTML snippet to help whenever I want to figure out which combination of Bootstrap classes to use. It might help you too.

<div class="row">
      <div class="page-header">
        <h1>Bootstrap grid examples</h1>
        <p class="lead">Basic grid layouts to get you familiar with building within the Bootstrap grid system.</p>
      </div>

      <h3>Three equal columns</h3>
      <p>Get three equal-width columns <strong>starting at desktops and scaling to large desktops</strong>. On mobile devices, tablets and below, the columns will automatically stack.</p>
      <div class="row">
        <div class="col-md-4" style="background-color:red">.col-md-4</div>
        <div class="col-md-4" style="background-color:pink">.col-md-4</div>
        <div class="col-md-4" style="background-color:yellow">.col-md-4</div>
      </div>

      <h3>Three unequal columns</h3>
      <p>Get three columns <strong>starting at desktops and scaling to large desktops</strong> of various widths. Remember, grid columns should add up to twelve for a single horizontal block. More than that, and columns start stacking no matter the viewport.</p>
      <div class="row">
        <div class="col-md-3" style="background-color:red">.col-md-3</div>
        <div class="col-md-6" style="background-color:pink">.col-md-6</div>
        <div class="col-md-3" style="background-color:yellow">.col-md-3</div>
      </div>

      <h3>Two columns</h3>
      <p>Get two columns <strong>starting at desktops and scaling to large desktops</strong>.</p>
      <div class="row">
        <div class="col-md-8" style="background-color:pink">.col-md-8</div>
        <div class="col-md-4" style="background-color:yellow">.col-md-4</div>
      </div>


       <h3>Two columns with two nested columns</h3>
<p>Per the documentation, nesting is easy, just put a row of columns within an existing column.</p> <p>This gives you two columns <strong>starting at desktops and scaling to large desktops</strong>, with another two (equal widths) within the larger column.</p>
      <p>At mobile device sizes, tablets and down, these columns and their nested columns will stack.</p>
      <div class="row">
        <div class="col-md-8" style="background-color:yellow">
          .col-md-8
          <div class="row">
            <div class="col-md-6" style="background-color:lightgreen">.col-md-6</div>
            <div class="col-md-6" style="background-color:pink">.col-md-6</div>
          </div>
        </div>
        <div class="col-md-4" style="background-color:lightgray">.col-md-4</div>
      </div>


      <h3>Full width, single column</h3>
      <p class="text-warning">No grid classes are necessary for full-width elements.</p>



      <h3>Mixed: mobile and desktop</h3>
      <p>The Bootstrap 3 grid system has four tiers of classes: xs (phones), sm (tablets), md (desktops), and lg (larger desktops). You can use nearly any combination of these classes to create more dynamic and flexible layouts.</p>
      <p>Each tier of classes scales up, meaning if you plan on setting the same widths for xs and sm, you only need to specify xs.</p>
      <div class="row">
        <div class="col-xs-12 col-md-8" style="background-color:red">.col-xs-12 .col-md-8</div>
        <div class="col-xs-6 col-md-4" style="background-color:lightgray">.col-xs-6 .col-md-4</div>
      </div>
      <div class="row">
        <div class="col-xs-6 col-md-4" style="background-color:lightgray">.col-xs-6 .col-md-4</div>
        <div class="col-xs-6 col-md-4" style="background-color:yellow">.col-xs-6 .col-md-4</div>
        <div class="col-xs-6 col-md-4" style="background-color:lightgreen">.col-xs-6 .col-md-4</div>
      </div>
      <div class="row">
        <div class="col-xs-6" style="background-color:lightgray">.col-xs-6 </div>
        <div class="col-xs-6" style="background-color:lightgreen">.col-xs-6</div>
      </div>

      <hr>

      <h3>Mixed: mobile, tablet, and desktop</h3>
      <div class="row">
        <div class="col-xs-12 col-sm-6 col-lg-8" style="background-color:lightgray">.col-xs-12 .col-sm-6 .col-lg-8</div>
        <div class="col-xs-6 col-lg-4" style="background-color:yellow">.col-xs-6 .col-lg-4</div>
      </div>
      <div class="row">
        <div class="col-xs-6 col-sm-4" style="background-color:lightgreen">.col-xs-6 .col-sm-4</div>
        <div class="col-xs-6 col-sm-4" style="background-color:pink">.col-xs-6 .col-sm-4</div>
        <div class="col-xs-6 col-sm-4" style="background-color:lightgray">.col-xs-6 .col-sm-4</div>
      </div>

      <hr>

      <h3>Column clearing</h3>
      <div class="row">
        <div class="col-xs-6 col-sm-3" style="background-color:lightgray">
          .col-xs-6 .col-sm-3
          <br>
          Resize your viewport or check it out on your phone for an example.
        </div>
        <div class="col-xs-6 col-sm-3" style="background-color:yellow">.col-xs-6 .col-sm-3</div>

        <!-- Add the extra clearfix for only the required viewport -->
        <div class="clearfix visible-xs"></div>

        <div class="col-xs-6 col-sm-3" style="background-color:lightgreen">.col-xs-6 .col-sm-3</div>
        <div class="col-xs-6 col-sm-3" style="background-color:pink">.col-xs-6 .col-sm-3</div>
      </div>

      <hr>

      <h3>Offset, push, and pull resets</h3>
      <p>Reset offsets, pushes, and pulls at specific breakpoints.</p>
      <div class="row">
        <div class="col-sm-5 col-md-6" style="background-color:lightgray">.col-sm-5 .col-md-6</div>
        <div class="col-sm-5 col-sm-offset-2 col-md-6 col-md-offset-0" style="background-color:yellow">.col-sm-5 .col-sm-offset-2 .col-md-6 .col-md-offset-0</div>
      </div>
      <div class="row">
        <div class="col-sm-6 col-md-5 col-lg-6" style="background-color:lightgreen">.col-sm-6 .col-md-5 .col-lg-6</div>
        <div class="col-sm-6 col-md-5 col-md-offset-2 col-lg-6 col-lg-offset-0" style="background-color:pink"<>.col-sm-6 .col-md-5 .col-md-offset-2 .col-lg-6 .col-lg-offset-0" </div>
        </div>

</div>

Upvotes: 0

Florin Pop
Florin Pop

Reputation: 5135

That's because you have the following classes:

col-xs-12 col-sm-6 col-md-6 col-lg-4

That means: 3 per row on a big screen, 2 per row on the middle screens, 1 per row on the mobile.

If you change to:

col-xs-12 col-sm-4 col-md-4 col-lg-4

This will make 3 per row on all the screens except from mobile where will be 1 per row.

Upvotes: 1

Related Questions