wrap multiple elements
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<div class="block">1</div>
<div>1.1</div>
<div>1.2</div>
<div>1.3</div>
<div>1.4</div>
<div class="block">2</div>
<div>2.1</div>
<div>2.2</div>
<div class="block">3</div>
<div>3.1</div>
<div>3.2</div>
<div>3.3</div>
CSS
div {
border: 1px solid silver;
padding: 10px;
margin: 5px;
}
.block {
border: 3px solid black;
}
.parent {
border: 2px solid red;
}
JavaScript
const itemsSelector = '.block';
const wrapperTag = 'div';
const wrapperClass = 'parent';
const $items = $(itemsSelector);
$items.each(i => $items
.eq(i)
.nextUntil($items.get(i + 1))
.wrapAll(`<${wrapperTag} class="${wrapperClass}">`)
);
/*
document.querySelectorAll(itemsSelector).forEach((n, i, a) => {
const elems = [];
for (let el = n; (el = el.nextElementSibling) != a[-~i]; elems.push(el)) ;
n.after(document.createElement(wrapperTag));
n.nextSibling.classList.add(wrapperClass);
n.nextSibling.append(...elems);
});
*/