はてなブログの ヘッダ>タイトル下 を有効に使う

はてなブログのテーマ「imz Pickup」をテーマストアに上げているのですが、このテーマについて、こんな大層なものはいらないけれど、トップページだけにピックアップ記事のようなものを表示する方法を教えてほしいというリクエストをいただきました。



はてなブログテーマ imz Pickup とは

記事はこちらです。

www.imuza.com


テーマストアはこちらです。

imz Pickup - テーマ ストア


どういうテーマかといいますと、Javascript で様々な機能を追加するテーマなんですが、そのひとつに、サイドバーのひとつのモジュールをトップページでは ヘッダ>タイトル下 に移動するものがあります。そうしますと、そのモジュールは、トップページではタイトル下に、記事ページではサイドバーのトップなど(位置は設定による)に表示することができます。

タイトル下に HTML を書いておけばいいという考え方もありますが、それですと全てのページに表示されることになり、非表示にするには display:none とするしかなく、SEO的にはあまりよろしくないのではと思います。


サイドバーのモジュールを取得する

まず移動したいモジュールを取得する方法です。

デザイン > カスタマイズ > サイドバー のモジュールはそれぞれクラス名が付与されています。hatena-module-search-box, hatena-module-recent-entries, hatena-module-entries-access-ranking, hatena-module-category などです。

クラス名を指定して移動したいモジュールを取得します。


const removeElem = document.getElementsByClassName('モジュールのクラス名')[0];


これで目的のモジュールを指定できます。ただし、getElementsByClassName はすべての要素を取得してきますので、配列の添字が必要になります。同じモジュールを複数挿入していなければ最初の要素は [0] で指定します。


HTML モジュールの場合

HTML モジュールの場合は、hatena-module-html のクラス名が付きます。この場合も、複数の HTML モジュールを挿入した場合は添字で指定することになりますが、いろいろカスタマイズしている間に位置が変わってしまうこともありますので、その場合は次の方法で指定します。


まず、HTMLモジュールの内容全体を <div id="pickup-wrap"></div> で括っておきます。その上で、

const removeElem = document.getElementById('pickup-wrap').parentNode.parentNode;

とすれば、指定した HTMLモジュール全体が取得できます。


これで移動する要素は取得できました。

なお、要素を指定する方法は、たとえば、サイドバー内の順番で取得する方法などいろいろあります。


モジュールをヘッダ > タイトル下に移動する

ヘッダ > タイトル下 は、使用しない場合には HTML要素は何も挿入されませんので、まず、テキストボックスに <div id="top-editarea-inner"></div> と入れておきます。


その上で、下のスクリプトを デザイン > カスタマイズ > フッタ に入れます。

(2019.9.15)9.10付けの記載には間違いがあります。以下は修正されています。

<script>
(function(){
    // 移動先がなければ戻る
    const destElem = document.getElementById('top-editarea-inner');
    if(destElem === null) return;
    // トップページなら
    const bdClasses = document.body.classList;
    if(bdClasses.contains('page-index')){
        // ピックアップモジュールを取得
        const removeElem = document.getElementById('pickup-wrap');
        // ピックアップモジュールがあれば移動する
        if(removeElem !== null) destElem.appendChild(removeElem.parentNode.parentNode);
        /* クラス名で取得した場合の例
          removeElem の比較対象は null ではなく undefined が正しいです
       const removeElem = document.getElementsByClassName('hatena-module-category')[0];
       if(removeElem !== undefined) destElem.appendChild(removeElem);
       */
    }
}());
</script>


これで、目的のサイドバーモジュールがタイトル下に移動できます。

後は、CSSで自由にデザインしてください。