本文へ移動
vast-cowのブログ
前のページへ戻る

はてなブログのテーマ「Smooth」をダークモード対応にするCSS

この記事を編集

はてなブログのデザインテーマ「Smooth」を使っています。

シンプルで読みやすく、余計な装飾も少ないので気に入っているのですが、一つだけ欲しかったのがダークモード対応です。

そこで、OSやブラウザの設定がダークモードになっている場合、自動的にブログも暗い配色へ切り替わるCSSを追加してみました。

JavaScriptは使いません。

CSSの prefers-color-scheme を利用するだけなので、比較的簡単に導入できます。

こんな感じのダークモードにしたい

今回の方針は、単純に「背景を黒、文字を白」にするのではなく、Smooth本来の雰囲気をできるだけ残したまま暗くすることです。

特に意識したのは次の点です。

OSがライトモードなら従来のSmoothのまま、ダークモードなら自動的に暗いデザインになります。

追加するCSS

はてなブログの

デザイン → カスタマイズ → デザインCSS

を開き、以下のCSSを追加します。

/* ==============================
   Smooth - Auto Dark Mode
   ============================== */

:root {
  color-scheme: light dark;
}

@media (prefers-color-scheme: dark) {

  /*
   * Base
   */
  html,
  body {
    background: #121616;
    color: #d9dddd;
  }

  #globalheader-container {
    background: #121616;
  }

  a {
    color: #d9dddd;
  }

  a:hover {
    color: #b7c3c3;
  }


  /*
   * Blog title
   */
  #title,
  #title a,
  #blog-description {
    color: #e5e8e8;
  }


  /*
   * Entry
   */
  .entry {
    background: #1a1f1f;
    border-color: #303838;
  }

  .entry-title,
  .entry-title a {
    color: #e5e8e8;
  }

  .entry-content {
    color: #d9dddd;
  }


  /*
   * Links
   *
   * Smooth の緑を維持しつつ
   * dark background で見やすくする
   */
  .entry-content a,
  .comment-box .comment a,
  .hatena-module-profile .id a,
  .archive-module-calendar .calendar-day a {
    color: #64d991;
  }

  .entry-content a:hover,
  .comment-box .comment a:hover,
  .hatena-module-profile .id a:hover,
  .archive-module-calendar .calendar-day a:hover {
    color: #8ae5ab;
  }


  /*
   * Date / secondary text
   */
  .date a,
  .date-last-updated,
  .entry-footer-section,
  .entry-footer-section a,
  .hatena-urllist .urllist-date-link a,
  #footer,
  #footer a {
    color: #94a3a3;
  }


  /*
   * Category labels
   */
  .categories a,
  .hatena-urllist .urllist-category-link {
    background: #293232;
    color: #d9dddd;
  }

  .hatena-urllist .urllist-category-link:hover {
    background: #354141;
  }


  /*
   * Headings
   */
  .entry-content h1,
  .entry-content h3,
  .entry-content h5 {
    border-color: #394343;
  }


  /*
   * Table of contents
   */
  .entry-content .table-of-contents {
    background: #222929;
  }


  /*
   * Blockquote
   */
  .entry-content blockquote {
    background: #1e2424;
    border-color: #394343;
  }

  .entry-content blockquote::before {
    color: #829393;
  }


  /*
   * Table
   */
  .entry-content table th,
  .entry-content table td {
    border-color: #394343;
  }

  .entry-content table th {
    background: #222929;
  }


  /*
   * Inline code
   */
  .entry-content code {
    background: #293232;
    color: #e3e8e8;
  }


  /*
   * Code block
   *
   * Smooth は元から dark なので
   * 大きく変更しない
   */
  .entry-content pre {
    background: #202727;
    color: #d6dddd;
  }


  /*
   * Keyword links
   */
  .entry-content a.keyword {
    text-decoration-color: #657575;
  }

  .entry-content a.keyword:hover {
    color: #b7c3c3;
    text-decoration-color: #94a3a3;
  }


  /*
   * Pager
   */
  .pager a {
    background: #222929;
    color: #d9dddd;
  }

  .pager a:hover {
    background: #2b3434;
  }


  /*
   * Header menu
   */
  .entry-header-menu a {
    background: #222929;
    border-color: #445050;
    color: #d9dddd;
  }

  .entry-header-menu a:hover {
    background: #2b3434;
  }


  /*
   * Comments
   */
  .comment-box {
    border-color: #394343;
  }

  .comment-box .leave-comment-title {
    background: #222929;
    border-color: #445050;
    color: #d9dddd;
  }

  .comment-box .leave-comment-title:hover {
    background: #2b3434;
  }

  .comment-box .comment .entry-comment {
    border-color: #394343;
    color: #94a3a3;
  }


  /*
   * Sidebar
   */
  #box2 {
    background: transparent;
  }

  .hatena-module {
    color: #d9dddd;
  }

  .hatena-module-title,
  .hatena-module-title a,
  .hatena-module-body a {
    color: #d9dddd;
  }

  .hatena-urllist li,
  #box2 .hatena-urllist > li:last-child {
    border-color: #445050;
  }


  /*
   * Search
   */
  .search-form,
  .search-result-form {
    background: #1a1f1f;
    border-color: #394343;
  }

  .search-module-input,
  .search-result-form .search-result-input {
    background: #1a1f1f;
    color: #e5e8e8;
  }

  .search-module-input::placeholder,
  .search-result-form .search-result-input::placeholder {
    color: #819090;
  }


  /*
   * Archive
   */
  .page-archive .archive-entry {
    background: #1a1f1f;
    border-color: #303838;
  }

  .page-archive .archive-heading {
    color: #e5e8e8;
  }


  /*
   * Footer
   */
  #footer {
    background: #181d1d;
  }

  .blog-controlls {
    background-color: rgb(24, 29, 29);
  }

  .blog-controlls-title a,
  .blog-controlls-title a:hover,
  .blog-controlls-title a:visited {
    color: rgb(229, 232, 232);
  }

  .blog-controlls-subscribe-btn {
    background-color: rgb(41, 50, 50);
    color: rgb(229, 232, 232);
  }

  .blog-controlls-subscribe-btn:hover {
    background-color: rgb(53, 65, 65);
  }

  .blog-controlls-subscribe-btn:visited {
    color: rgb(229, 232, 232);
  }

  @media (min-width: 768px) {
    .blog-controlls {
      background-color: transparent;
    }
  }

  #globalheader-container {
    background: rgb(18, 22, 22);
    filter: none;
  }

  #globalheader {
    filter: invert(1) hue-rotate(180deg);
  }

}

ポイントは prefers-color-scheme

今回のCSSで重要なのが、ここです。

@media (prefers-color-scheme: dark) {
  /* ダークモード用CSS */
}

prefers-color-scheme: dark は、ユーザーがOSやブラウザでダーク系の配色を選択している場合に適用されるメディアクエリです。

つまり、ブログ側に「ダークモード切り替えボタン」を実装しなくても、

という形で自動的に切り替わります。

また、

:root {
  color-scheme: light dark;
}

も指定しています。

ブラウザに、このページがライト・ダーク両方のカラースキームに対応していることを伝えるための指定です。

真っ黒にはしていない

ダークモードというと、

background: #000;
color: #fff;

のようにしたくなりますが、今回はそうしていません。

ベースの背景は、

#121616

記事部分は、

#1a1f1f

本文は、

#d9dddd

としています。

完全な黒と白を組み合わせるより少しコントラストを抑えつつ、Smoothに合うように若干グリーン寄りのグレーで統一しています。

Smoothの緑色は残す

Smoothらしさとして残したかったのが、リンクの緑です。

本文中のリンクなどは、

.entry-content a {
  color: #64d991;
}

としています。

ホバー時は少し明るくして、

.entry-content a:hover {
  color: #8ae5ab;
}

としました。

ダークモードでもリンクだと認識しやすく、Smoothの印象もそれほど変わりません。

記事本文以外も対応

最初は背景と本文だけ変更すればいいかと思ったのですが、実際にダークモードにしてみると細かい部分が気になります。

今回のCSSでは、記事本文に加えて、

あたりも調整しています。

特に背景だけ暗くすると、ボーダーや補助テキストがライトモード用の色のまま残ってしまいがちです。

そのため、#394343 や #445050 といった暗めのボーダーカラーも合わせて指定しています。

はてなのグローバルヘッダーも暗くする

少し特殊なのが最後の部分です。

#globalheader-container {
  background: rgb(18, 22, 22);
  filter: none;
}

#globalheader {
  filter: invert(1) hue-rotate(180deg);
}

ブログ本体だけ暗くすると、上部のはてな側のヘッダーが浮いて見えるため、ここもダークモードに馴染むよう調整しています。

invert() と hue-rotate() を使っているので少々力技ですが、CSSだけで対応する方法としては手軽です。

JavaScript不要なのがいい

この方法の良いところは、CSSを追加するだけという点です。

ダークモード用のJavaScriptを書いたり、CookieやLocalStorageに設定を保存したりする必要はありません。

ユーザーが普段使っているOSの設定に従って、自動的に切り替わります。

もちろん「ブログだけライトモードにしたい」「手動切り替えボタンが欲しい」という用途には向きません。

しかし、

OSがダークモードならブログもダークモードにする

というシンプルな仕様でよければ、prefers-color-scheme だけで十分だと思います。

まとめ

Smoothは元々かなりシンプルなテーマなので、ダークモードとの相性も悪くありません。

今回のCSSではデザインそのものを作り直すのではなく、Smoothのレイアウトや緑色のアクセントを残したまま、配色だけ自然にダークモード化することを目指しました。

Smoothを使っていて、

「デザインは気に入っているけど、ダークモードにも対応したい」

という人は、デザインCSSへの追加だけで済むので試してみてください。

なお、はてなブログ側やSmooth側のHTML・CSSが将来変更された場合、一部の指定が効かなくなる可能性があります。その場合は該当するセレクタを調整してください。


この記事を編集
この記事を共有:

コメント


前の記事
Linux に uv をシステムワイドでインストールする
次の記事
ChatGPTの「新しいチャット」を新規タブで開けるTampermonkeyスクリプト