web関連

【jQuery】見出しタグから見出しタグまでの間の要素を取得してdivで囲む

自分の備忘録を見返していて見出しタグ以下の文章を字下げしたほうが読みやすいのでは?と思って調べた時の備忘録

見出しと見出しの間の要素を取得してdivで囲む方法

まずは、メインとなるコード

$(':header').nextUntil(':header').wrapAll('<div></div>');

これで、見出しタグ間の要素をまとめてdivで囲むことができる

.wrap()だと個々に要素をdivで包んじゃうので.wrapAll()を使用(一敗)

$(‘:header’).nextUntil(‘:header’)の部分について

見出しを指定するときに
$('h2').nextUntil('h2')
って感じで書いてもいいんだけど、$(':header')を使うと指定した範囲内の見出しタグ(h1~h6)を取得できるみたい

nextUntil()は指定した要素があるまで兄弟要素を取得することができる

ちょっと騙されたんだけど、nextUntil()って指定した要素がもしなかったらundefinedとかnullを返さないで親要素の終わりまで取得し続けるから条件式で使うときはis()と併用しないと駄目だった

この後使ってるけど、

if(($(':header').nextUntil(':header').next(':header').is(':header'))){…};

nextUntil()は指定した要素までの要素しか取得しないので次にあるであろう見出しタグをis()で判別している

見出しタグ間の要素をdivで囲って字下げするデモ

今回やりたかったこと
とりまデモ、わかりやすくライン入れてる
jQuery(function($){
  $(".entry :header").each(function(){

    var h_tag = this.nodeName.toLowerCase();//タグ名の「h2,h3」の部分取得
    if($(this).nextUntil(h_tag).next(h_tag).is(h_tag)){
      // 同じ見出しタグがある時の処理
      $(this).nextUntil(h_tag).wrapAll('<div class="group"></div>');
    }else{
      // 同じ見出しタグがない時の処理
      if(($(this).nextUntil(h_tag).next(h_tag).is(':header'))){
        // 次以降に見出しタグが存在するときの処理
        $(this).nextUntil(':header').wrapAll('<div class="group"></div>');
      }else{
        // 次以降に見出しタグがない時
        $(this).nextUntil('.last').wrapAll('<div class="group"></div>');
      }
    }
  });
});

デモで<div class="last">を使ってるけど別になくてもいい
でも、
$(this).nextUntil('.last').wrapAll('<div class="group"></div>');
この処理を消すとうまく字下げされない

一応、見出しはh2から順にh3→h4→…って感じで使うことを想定して作った
h3→h2→h5みたいな使い方してもh2を基点に字下げされるよ

ブログ読んでてどれが見出し(h2)でどれが小見出し(h3)なのかわかりづらいなぁって思って字下げ的なことをすれば多少はわかりやすくなるのかなぁって思って調べた

実際にブログにも反映してみた、流石に字下げで使うと読みづらかったから右側にライン入れてみた(2020/08/08の時点で)
そのうち今どの見出しにいるかどうかわかるように見出しテキストを吹き出しみたいに表示させようかなぁ…それかqiitaみたいに目次くっつけるかなぁ(メモ)

Leave a Comment

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。