ホーム自己紹介ブログ
NO.233
DATE2026. 01. 20

CSSで頑張らなくても、SVGで楽にできるときもある

個人サイトをリニューアルをしています。
ノート風のデザインを目指して、スタイルを調整していました。
ノートの見た目は、現実にあるノートを再現しようとCSSを書いていました。

現在、以下の画像のようなノートになっています。

ノート風デザインの見出し
ノート風デザインの見出し

上記の画像の赤枠の箇所について、CSSで書くのに苦労しました。
というのも、現実にあるノートのスタイルを再現したく、以下の見た目を作りたかったのです。

  1. タイトルの下にある線から、縦の線を下方向に生やしたい
  2. 縦の線は、一定の間隔で繰り返して表示したい
  3. 縦の線は、大きい線と小さい線を分けたい
  4. 縦の線の下側を、丸くしたい

CSSで書く

そこで、CSS で 以下のようなスタイルを書いて対応していました。

<div class="notebook-heading">
  <h1 class="notebook-title">
    Title Text
  </h1>
  <!-- 長い棒(4px / 128px ピッチ) -->
  <div class="notebook-line notebook-line--large"></div>
  <!-- 短い棒(2px / 16px ピッチ) -->
  <div class="notebook-line notebook-line--small"></div>
</div>
:root {
  --border-color: #ccc;
}
 
/* 親コンテナ */
.notebook-heading {
  position: relative;
  width: 100%;
}
 
/* 見出し */
.notebook-title {
  border-bottom: 1px solid var(--border-color);
}
 
/* 共通の罫線スタイル */
.notebook-line {
  position: absolute;
  left: 0;
  width: 100%;
}
 
/* 長い棒(4px 高・128px ピッチ) */
.notebook-line--large {
  bottom: -4px;
  height: 4px;
  background-image: repeating-linear-gradient(
    to right,
    var(--border-color) 0 2px,
    transparent 2px 128px
  );
}
 
/* 短い棒(2px 高・16px ピッチ) */
.notebook-line--small {
  bottom: -2px;
  height: 2px;
  background-image: repeating-linear-gradient(
    to right,
    var(--border-color) 0 2px,
    transparent 2px 16px
  );
}

考えとしては、.notebook-line を基準として 高さを2px,4pxで、横幅100% まで広げた領域に対して、背景色を repeating-linear-gradient で塗っていく方法です。
この方法だと、実現したい1,2,3はクリアするのですが、4がクリアできないのです。

4. 縦の線の下側を、丸くしたい

4について、CSSで解決できる方法があるのかもしれませんが、他の方法がないのかと思案しました。

SVGで書く

『縦棒の下部分を丸くするというのは、図形を書こうとしている?』と思い、SVGでいけそうだなと考えました。

そこで、以下のような方法で解決できました。
実際のコードではなく、イメージのコードです。

<div class="notebook-heading">
  <h1 class="notebook-title">Title Text</h1>
 
  <!-- 長い棒(6px 高 / 128px ピッチ / 下だけ丸い) -->
  <svg class="notebook-svg notebook-svg--large" aria-hidden="true">
    <defs>
      <pattern
        id="dash-bottom-rounded-6"
        patternUnits="userSpaceOnUse"
        width="128"
        height="6"
      >
        <!-- 幅 2px の縦棒。下側だけ円弧で丸める -->
        <path
          d="
            M 0 0
            H 2
            V 5
            A 1 1 0 0 1 1 6
            A 1 1 0 0 1 0 5
            Z
          "
          class="notebook-dash"
        />
      </pattern>
    </defs>
 
    <rect width="100%" height="100%" fill="url(#dash-bottom-rounded-6)" />
  </svg>
 
  <!-- 短い棒(3px 高 / 16px ピッチ / 下だけ丸い) -->
  <svg class="notebook-svg notebook-svg--small" aria-hidden="true">
    <defs>
      <pattern
        id="dash-bottom-rounded-3"
        patternUnits="userSpaceOnUse"
        width="16"
        height="3"
      >
        <!-- 幅 2px の縦棒。下側だけ円弧で丸める -->
        <path
          d="
            M 0 0
            H 2
            V 2
            A 1 1 0 0 1 1 3
            A 1 1 0 0 1 0 2
            Z
          "
          class="notebook-dash"
        />
      </pattern>
    </defs>
 
    <rect width="100%" height="100%" fill="url(#dash-bottom-rounded-3)" />
  </svg>
</div>
:root {
  --border-color: #ccc;
}
 
/* 親コンテナ */
.notebook-heading {
  position: relative;
  width: 100%;
}
 
/* 見出し */
.notebook-title {
  border-bottom: 1px solid var(--border-color);
}
 
/* SVG 下線(共通) */
.notebook-svg {
  position: absolute;
  left: 0;
  width: 100%;
  display: block;
}
 
/* 長い棒(6px) */
.notebook-svg--large {
  bottom: -6px;
  height: 6px;
}
 
/* 短い棒(3px) */
.notebook-svg--small {
  bottom: -3px;
  height: 3px;
}
 
/* パターン内の棒の色(CSS 変数で制御) */
.notebook-dash {
  fill: var(--border-color);
}

SVGとして縦棒を表現していて、.notebook-line に連続して表示しているみたいです。
正直SVGについて理解が浅いため、また今回を機に SVG について興味が湧いてきました。
リニューアル後は、SVGについて学んでみたいなと思います。

終わりに

図形に関しては、SVGで書いちゃう方が楽でした。
CSS 達人のトリックを披露するでも良いのですが、保守性の面では SVG の方が好みです。
CSS、SVG それぞれ得意とするもので書いていきたいですね。

フロントエンド

-

シェアする

フォローする

次のページ

スターバックスのスターを集め始めた

前のページ

美容室に行くのが億劫

関連する記事

タグ「フロントエンド」の記事

iframeの難しさ

最近、iframeを使っています。 クライアントサイドで埋め込む想定で、iframeを使おうとしています。 色々と苦労したことがあったので、書いて残しておこうと思います。 レスポンスヘッダー 前提として、ウェブアプリケーションをプロダクショ

2026年02月18日

フロントエンド
ブラウザ
SVGを書くと数学の知識が必要だった

紙を積んだイラストをSVGで書こうとしていました。 (当たり前ですが)図形を表現するためには数学の知識が必要で、学生の頃の記憶を思い出したので疲れました。 所感について、諸々書こうと思います。 成果物 実際に完成したのは、以下の画像ができま

2026年02月17日

フロントエンド
CSSを、Vitestでテストしてみる

以下の記事で書いた CSSをテストする方法について、試してみました。 https://zenn.dev/silverbirder/articles/df6752b230f04c ソースコードは、以下に置いています。 https://gith

2026年02月10日

フロントエンド
テスト
← ブログ一覧へ