I have a blog layout I’m working on (bootstrap) and I’ve hit a snag.
I need the first two divs to be col-md-3 (NORMAL), then the following 2 divs col-md-6 (WIDE), then it needs to make the next 4 divs as col-md-3 (NORMAL), then the next 2 divs col-md-6(WIDE) and so on, so forth.
I’ve tried [this method in codepen][1], which works (code below) but is obviously not the most efficient way to do it – I’m fairly new to jQuery, so would appreciate any help you can offer!
HTML:
<div class="container">
<div class="row" id="blog">
<div>Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
</div>
</div>
jQuery used:
$("#blog div").each(function(i) {
var newClass = 'col-md-3 red';
if (i == 2) newClass = 'col-md-6 blue';
if (i == 3) newClass = 'col-md-6 blue';
if (i == 8) newClass = 'col-md-6 blue';
if (i == 9) newClass = 'col-md-6 blue';
if (i == 14) newClass = 'col-md-6 blue';
if (i == 15) newClass = 'col-md-6 blue';
if (i == 20) newClass = 'col-md-6 blue';
if (i == 21) newClass = 'col-md-6 blue';
if (i == 26) newClass = 'col-md-6 blue';
if (i == 27) newClass = 'col-md-6 blue';
if (i == 32) newClass = 'col-md-6 blue';
if (i == 33) newClass = 'col-md-6 blue';
$(this).addClass(newClass);
});
Advertisement
Answer
You can do it using .not() and .filter()
$('#blog div').addClass('col-md-3 red') // add red class to all the divs
.not(':lt(2)') // exclude the first two Normal elements
.filter(function(i){ // filter to get the Wide elements
return (i % 6 == 0) || ( (i % 6) - 1 == 0) // filter every 6 element and the element next of it
}).addClass('col-md-6 blue'); // add the class to the Wide elements.red{
background : red;
}
.blue{
background : blue;
}<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
<div class="row" id="blog">
<div>Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Normal</div>
<div class="">Wide</div>
<div class="">Wide</div>
<div class="">Normal</div>
<div class="">Normal</div>
</div>
</div>