I have content consisting of headings (h1, h2, h3, h4, h5, h6).
What I need:
Using jQuery, I need to wrap all elements following each heading until the next same heading or higher heading. By "higher", I mean to say:
- H5 is "higher" than h6.
- H4 is "higher" than h5 and h6.
- H3 is "higher" than h4, h5, and h6.
...and so on, so forth.
E.g. Wrap all elements after h3 until the next h3 or higher headings (h1 or h2).
Here's an example of the desired end result:
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: Arial;
color: white;
background-color: black;
margin: 0;
padding: 5px;
}
.h1-section,
.h2-section,
.h3-section,
.h4-section,
.h5-section,
.h6-section {
border: 1px solid black;
border-top: none;
padding: 20px;
}
<h1>1</h1>
<section class="h1-section">
<h2>2</h2>
<section class="h2-section">
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
</section>
</section>
<h1>1</h1>
<section class="h1-section">
<h2>2</h2>
<section class="h2-section">
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
</section>
<h2>2</h2>
<section class="h2-section">
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
<h3>3</h3>
<section class="h3-section">
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
<h4>4</h4>
<section class="h4-section">
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
<h5>5</h5>
<section class="h5-section">
<h6>6</h6>
<section class="h6-section">
</section>
<h6>6</h6>
<section class="h6-section">
</section>
</section>
</section>
</section>
</section>
</section>
What I've tried:
Using jQuery, I've tried using .nextUntil()
, but I'm incorrectly selecting and wrapping elements:
$(document).ready(function() {
$("h1").nextUntil("h1").wrapAll("<section class='h1-section'></section>");
$("h2").nextUntil("h1, h2").wrapAll("<section class='h2-section'></section>");
$("h3").nextUntil("h1, h2, h3").wrapAll("<section class='h3-section'></section>");
$("h4").nextUntil("h1, h2, h3, h4").wrapAll("<section class='h4-section'></section>");
$("h5").nextUntil("h1, h2, h3, h4, h5").wrapAll("<section class='h5-section'></section>");
$("h6").nextUntil("h1, h2, h3, h4, h5, h6").wrapAll("<section class='h6-section'></section>");
});
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: Arial;
color: white;
background-color: black;
margin: 0;
padding: 5px;
}
.h1-section,
.h2-section,
.h3-section,
.h4-section,
.h5-section,
.h6-section {
border: 1px solid black;
border-top: none;
padding: 20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>1</h1>
<h2>2</h2>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h1>1</h1>
<h2>2</h2>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h2>2</h2>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h3>3</h3>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h4>4</h4>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
<h5>5</h5>
<h6>6</h6>
<h6>6</h6>
How can I achieve the desired outcome using jQuery?