Documentation CSS

はじめに

この記事では、CSSのmask-border-sourceプロパティを使用して、要素のボーダー領域にマスク効果を適用するための画像ソースを指定する方法を解説します。基本的な画像の指定方法から、SVGやグラデーションを使った応用例まで、ステップバイステップで学んでいきましょう。

概要

mask-border-sourceは、CSSのプロパティで、mask-borderによるマスク効果に使用する画像を指定します。このプロパティで指定した画像は、mask-border-sliceによって9つの領域に分割され、要素のボーダー領域に適用されます。

マスク効果とは: 画像の透明度や輝度に基づいて、要素の一部を表示したり非表示にしたりする視覚効果です。透明な部分は見えなくなり、不透明な部分が表示されます。

mask-border-sourcemask-borderプロパティ群の中核となるプロパティで、ここで指定した画像がマスクの基となります。

mask-border-sourceとは

mask-border-sourceプロパティは、マスクボーダーで使用する画像リソースを指定します。以下のような値を指定できます。

値の種類説明
noneマスクボーダーを使用しない(デフォルト)mask-border-source: none;
url()画像ファイルへのパスを指定mask-border-source: url('border.png');
<gradient>CSSグラデーションを指定mask-border-source: linear-gradient(...);

画像形式の選択

マスクボーダーに使用する画像形式によって、効果や用途が異なります。

形式特徴推奨用途
PNG透明度(アルファチャンネル)をサポート複雑なパターン、写真的な効果
SVGベクター形式、どのサイズでもシャープスケーラブルなパターン、アイコン的な装飾
グラデーション外部ファイル不要、動的に生成シンプルな効果、フェード効果

基本的な使い方

構文

/* デフォルト値:マスクボーダーなし */
mask-border-source: none;

/* 画像ファイルを指定 */
mask-border-source: url('mask-image.png');

/* SVGファイルを指定 */
mask-border-source: url('mask-pattern.svg');

/* グラデーションを指定 */
mask-border-source: linear-gradient(45deg, black, transparent);

/* インラインSVGを参照 */
mask-border-source: url('#svg-pattern-id');

シンプルな例

以下は、mask-border-sourceを使用した基本的な例です。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>mask-border-source 基本例</title>
  <style>
    .mask-box {
      width: 300px;
      height: 200px;
      padding: 20px;
      /* グラデーション背景 */
      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

      /* === mask-border-source の設定 === */
      /* マスクに使用する画像を指定 */
      mask-border-source: url('decorative-border.png');
      /* 画像を30pxでスライス */
      mask-border-slice: 30;
      /* ボーダー幅を設定 */
      mask-border-width: 20px;
      /* スライスを引き伸ばして適用 */
      mask-border-repeat: stretch;

      /* Safari向けプレフィックス */
      -webkit-mask-border-source: url('decorative-border.png');
      -webkit-mask-border-slice: 30;
      -webkit-mask-border-width: 20px;
      -webkit-mask-border-repeat: stretch;
    }
  </style>
</head>
<body>
  <div class="mask-box">
    <p>mask-border-sourceで装飾されたコンテンツ</p>
  </div>
</body>
</html>

画像ファイルの指定

PNG画像を使用する

PNG画像は透明度(アルファチャンネル)をサポートしているため、マスクボーダーに最適です。

/* 透明度を持つPNG画像を使用 */
.png-mask {
  /* 装飾的なフレーム画像を指定 */
  mask-border-source: url('frame-border.png');
  mask-border-slice: 30;
  mask-border-width: 20px;
  mask-border-repeat: round;

  /* Safari向けプレフィックス */
  -webkit-mask-border-source: url('frame-border.png');
  -webkit-mask-border-slice: 30;
  -webkit-mask-border-width: 20px;
  -webkit-mask-border-repeat: round;
}

PNG画像作成のポイント:

  • 表示したい部分を不透明(黒)に
  • 非表示にしたい部分を透明に
  • 9スライス分割を考慮したデザイン

WebP画像を使用する

WebP形式はPNGより軽量で、透明度もサポートしています。

/* WebP画像を使用(ファイルサイズが小さい) */
.webp-mask {
  mask-border-source: url('border-pattern.webp');
  mask-border-slice: 25;
  mask-border-width: 15px;

  -webkit-mask-border-source: url('border-pattern.webp');
  -webkit-mask-border-slice: 25;
  -webkit-mask-border-width: 15px;
}

相対パスと絶対パスの使用

/* 相対パス:CSSファイルからの相対位置 */
.relative-path {
  mask-border-source: url('../images/border.png');
}

/* 絶対パス:ルートからのパス */
.absolute-path {
  mask-border-source: url('/assets/images/border.png');
}

/* URL:外部リソース */
.external-url {
  mask-border-source: url('https://example.com/border.png');
}

SVG画像の指定

SVGはベクター形式なので、どのサイズでもシャープに表示されます。

外部SVGファイルを使用

/* 外部SVGファイルを参照 */
.svg-external {
  mask-border-source: url('decorative-frame.svg');
  mask-border-slice: 33.33%;
  mask-border-width: 20px;
  mask-border-repeat: round;

  -webkit-mask-border-source: url('decorative-frame.svg');
  -webkit-mask-border-slice: 33.33%;
  -webkit-mask-border-width: 20px;
  -webkit-mask-border-repeat: round;
}

インラインSVGを参照

HTMLに埋め込んだSVGを参照することもできます。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>インラインSVGマスクボーダー</title>
  <style>
    .inline-svg-mask {
      width: 300px;
      padding: 25px;
      background: linear-gradient(to right, #ff6b6b, #feca57);

      /* インラインSVGのIDを参照 */
      mask-border-source: url('#wave-border');
      mask-border-slice: 20;
      mask-border-width: 15px;
      mask-border-repeat: round;

      -webkit-mask-border-source: url('#wave-border');
      -webkit-mask-border-slice: 20;
      -webkit-mask-border-width: 15px;
      -webkit-mask-border-repeat: round;
    }
  </style>
</head>
<body>
  <!-- 画面には表示されないSVG定義 -->
  <svg width="0" height="0" style="position: absolute;">
    <defs>
      <!-- 波線パターンの定義 -->
      <pattern id="wave-border"
               width="60" height="60"
               patternUnits="userSpaceOnUse">
        <!-- 波線の描画 -->
        <path d="M0 30 Q15 0, 30 30 T60 30"
              stroke="black"
              stroke-width="4"
              fill="none"/>
        <!-- 上下の線 -->
        <line x1="0" y1="0" x2="60" y2="0"
              stroke="black" stroke-width="2"/>
        <line x1="0" y1="60" x2="60" y2="60"
              stroke="black" stroke-width="2"/>
      </pattern>
    </defs>
  </svg>

  <div class="inline-svg-mask">
    <p>SVGパターンを使った波線ボーダー</p>
  </div>
</body>
</html>

SVGマスク画像の作成例

マスクボーダー用のSVGファイルを作成する際のテンプレートです。

<!-- decorative-frame.svg -->
<svg xmlns="http://www.w3.org/2000/svg"
     width="90" height="90"
     viewBox="0 0 90 90">
  <!--
    黒い部分:表示される
    透明な部分:非表示になる
  -->

  <!-- 四隅の角丸装飾 -->
  <rect x="0" y="0" width="30" height="30" rx="10" fill="black"/>
  <rect x="60" y="0" width="30" height="30" rx="10" fill="black"/>
  <rect x="0" y="60" width="30" height="30" rx="10" fill="black"/>
  <rect x="60" y="60" width="30" height="30" rx="10" fill="black"/>

  <!-- 上下の辺 -->
  <rect x="30" y="0" width="30" height="10" fill="black"/>
  <rect x="30" y="80" width="30" height="10" fill="black"/>

  <!-- 左右の辺 -->
  <rect x="0" y="30" width="10" height="30" fill="black"/>
  <rect x="80" y="30" width="10" height="30" fill="black"/>
</svg>

グラデーションの指定

外部ファイルを使わず、CSSのグラデーションでマスクソースを作成できます。

linear-gradientを使用

/* 対角線方向のグラデーションマスク */
.linear-gradient-mask {
  width: 300px;
  height: 200px;
  background: white;

  /* グラデーションをマスクソースに */
  mask-border-source:
    linear-gradient(135deg,
      rgba(0, 0, 0, 1) 0%,      /* 左上: 完全に表示 */
      rgba(0, 0, 0, 0.5) 50%,   /* 中央: 半透明 */
      rgba(0, 0, 0, 1) 100%     /* 右下: 完全に表示 */
    );
  mask-border-slice: 1;
  mask-border-width: 10px;
  mask-border-repeat: stretch;

  -webkit-mask-border-source:
    linear-gradient(135deg,
      rgba(0, 0, 0, 1) 0%,
      rgba(0, 0, 0, 0.5) 50%,
      rgba(0, 0, 0, 1) 100%
    );
  -webkit-mask-border-slice: 1;
  -webkit-mask-border-width: 10px;
  -webkit-mask-border-repeat: stretch;
}

点線風のグラデーション

/* 点線風の効果をグラデーションで作成 */
.dotted-gradient {
  mask-border-source:
    linear-gradient(90deg,
      black 0%,
      black 20%,
      transparent 20%,
      transparent 40%,
      black 40%,
      black 60%,
      transparent 60%,
      transparent 80%,
      black 80%,
      black 100%
    );
  mask-border-slice: 1;
  mask-border-width: 5px;
  mask-border-repeat: repeat;

  -webkit-mask-border-source:
    linear-gradient(90deg,
      black 0%,
      black 20%,
      transparent 20%,
      transparent 40%,
      black 40%,
      black 60%,
      transparent 60%,
      transparent 80%,
      black 80%,
      black 100%
    );
  -webkit-mask-border-slice: 1;
  -webkit-mask-border-width: 5px;
  -webkit-mask-border-repeat: repeat;
}

radial-gradientを使用

/* 円形グラデーションでビネット風効果 */
.radial-gradient-mask {
  mask-border-source:
    radial-gradient(
      ellipse at center,
      transparent 0%,       /* 中央: 透明 */
      transparent 50%,
      black 70%,            /* 外側: 表示 */
      black 100%
    );
  mask-border-slice: 1 fill;
  mask-border-width: 30px;
  mask-border-repeat: stretch;

  -webkit-mask-border-source:
    radial-gradient(
      ellipse at center,
      transparent 0%,
      transparent 50%,
      black 70%,
      black 100%
    );
  -webkit-mask-border-slice: 1 fill;
  -webkit-mask-border-width: 30px;
  -webkit-mask-border-repeat: stretch;
}

repeating-linear-gradientを使用

/* ストライプパターンのマスク */
.stripe-mask {
  mask-border-source:
    repeating-linear-gradient(
      45deg,
      black 0px,
      black 10px,
      transparent 10px,
      transparent 20px
    );
  mask-border-slice: 1;
  mask-border-width: 15px;
  mask-border-repeat: round;

  -webkit-mask-border-source:
    repeating-linear-gradient(
      45deg,
      black 0px,
      black 10px,
      transparent 10px,
      transparent 20px
    );
  -webkit-mask-border-slice: 1;
  -webkit-mask-border-width: 15px;
  -webkit-mask-border-repeat: round;
}

実践的な使用例

装飾的なカードデザイン

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>装飾カード</title>
  <style>
    .decorative-card {
      width: 350px;
      padding: 30px;
      background: #fff;
      box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);

      /* === エレガントなフレームマスク === */
      mask-border-source: url('elegant-frame.png');
      mask-border-slice: 40;
      mask-border-width: 25px;
      mask-border-repeat: round;

      -webkit-mask-border-source: url('elegant-frame.png');
      -webkit-mask-border-slice: 40;
      -webkit-mask-border-width: 25px;
      -webkit-mask-border-repeat: round;
    }

    .decorative-card h3 {
      margin: 0 0 15px;
      color: #333;
    }

    .decorative-card p {
      margin: 0;
      color: #666;
      line-height: 1.6;
    }
  </style>
</head>
<body>
  <div class="decorative-card">
    <h3>エレガントなカード</h3>
    <p>mask-border-sourceで指定した画像により、独自の装飾フレームを実現しています。</p>
  </div>
</body>
</html>

写真フレーム効果

.photo-frame {
  width: 400px;
  height: 300px;
  /* 写真を背景に設定 */
  background: url('photo.jpg') center/cover;

  /* === アンティーク調フレーム === */
  /* 装飾的なフレーム画像を指定 */
  mask-border-source: url('antique-frame.png');
  /* fillで中央領域(写真部分)も表示 */
  mask-border-slice: 60 fill;
  /* フレームの幅を大きめに設定 */
  mask-border-width: 50px;
  /* フレームを少し外側にはみ出させる */
  mask-border-outset: 10px;
  mask-border-repeat: stretch;

  -webkit-mask-border-source: url('antique-frame.png');
  -webkit-mask-border-slice: 60 fill;
  -webkit-mask-border-width: 50px;
  -webkit-mask-border-outset: 10px;
  -webkit-mask-border-repeat: stretch;
}

SVGを使った動的パターン

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>SVG動的パターン</title>
  <style>
    .dynamic-border {
      width: 320px;
      padding: 25px;
      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

      /* SVGパターンをマスクソースとして使用 */
      mask-border-source: url('#geometric-pattern');
      mask-border-slice: 25%;
      mask-border-width: 20px;
      mask-border-repeat: round;

      -webkit-mask-border-source: url('#geometric-pattern');
      -webkit-mask-border-slice: 25%;
      -webkit-mask-border-width: 20px;
      -webkit-mask-border-repeat: round;
    }
  </style>
</head>
<body>
  <!-- 幾何学パターンのSVG定義 -->
  <svg width="0" height="0" style="position: absolute;">
    <defs>
      <pattern id="geometric-pattern"
               width="40" height="40"
               patternUnits="userSpaceOnUse">
        <!-- ダイヤモンド形状 -->
        <polygon points="20,0 40,20 20,40 0,20"
                 fill="black"/>
      </pattern>
    </defs>
  </svg>

  <div class="dynamic-border">
    <p>幾何学パターンのマスクボーダー</p>
  </div>
</body>
</html>

フェードエッジ効果

/* ボーダー部分がフェードアウトする効果 */
.fade-edge {
  width: 300px;
  height: 200px;
  background: url('content-image.jpg') center/cover;

  /* グラデーションで外側をフェードアウト */
  mask-border-source:
    linear-gradient(
      to right,
      transparent 0%,
      black 30%,
      black 70%,
      transparent 100%
    );
  mask-border-slice: 1;
  mask-border-width: 40px;
  mask-border-repeat: stretch;

  -webkit-mask-border-source:
    linear-gradient(
      to right,
      transparent 0%,
      black 30%,
      black 70%,
      transparent 100%
    );
  -webkit-mask-border-slice: 1;
  -webkit-mask-border-width: 40px;
  -webkit-mask-border-repeat: stretch;
}

mask-border-sourceと他のプロパティの組み合わせ

mask-border-sourceは単独では効果がなく、他のmask-borderプロパティと組み合わせて使用します。

必須の組み合わせ

プロパティ役割必須/任意
mask-border-source画像ソースを指定必須
mask-border-slice画像の分割方法を指定必須
mask-border-widthボーダーの幅を指定推奨
mask-border-repeat繰り返し方法を指定任意
mask-border-outsetはみ出し量を指定任意
mask-border-modeマスクモードを指定任意

完全な設定例

.complete-mask-border {
  width: 400px;
  padding: 30px;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

  /* === mask-border の完全設定 === */

  /* 1. ソース画像を指定(必須) */
  mask-border-source: url('ornamental-frame.png');

  /* 2. スライス位置を指定(必須) */
  mask-border-slice: 30 fill;

  /* 3. ボーダー幅を指定(推奨) */
  mask-border-width: 20px;

  /* 4. はみ出し量を指定(任意) */
  mask-border-outset: 5px;

  /* 5. 繰り返し方法を指定(任意) */
  mask-border-repeat: round;

  /* 6. マスクモードを指定(任意) */
  mask-border-mode: alpha;

  /* Safari対応 */
  -webkit-mask-border-source: url('ornamental-frame.png');
  -webkit-mask-border-slice: 30 fill;
  -webkit-mask-border-width: 20px;
  -webkit-mask-border-outset: 5px;
  -webkit-mask-border-repeat: round;
}

ショートハンド記法での指定

/* ショートハンドで一括指定 */
.shorthand-example {
  /* source slice / width / outset repeat mode */
  mask-border: url('frame.png') 30 / 20px / 5px round alpha;

  -webkit-mask-border: url('frame.png') 30 / 20px / 5px round alpha;
}

noneの使用

mask-border-source: noneは、マスクボーダーを無効にする際に使用します。

/* 通常時はマスクボーダーを適用 */
.card {
  mask-border-source: url('border.png');
  mask-border-slice: 20;
  mask-border-width: 15px;

  -webkit-mask-border-source: url('border.png');
  -webkit-mask-border-slice: 20;
  -webkit-mask-border-width: 15px;
}

/* 特定の条件でマスクボーダーを無効化 */
.card.no-decoration {
  mask-border-source: none;
  -webkit-mask-border-source: none;
}

/* メディアクエリでレスポンシブに制御 */
@media (max-width: 768px) {
  .card {
    /* モバイルではマスクボーダーを無効化 */
    mask-border-source: none;
    -webkit-mask-border-source: none;
    /* 代わりに通常のボーダーを使用 */
    border: 2px solid #667eea;
    border-radius: 8px;
  }
}

ブラウザ対応とフォールバック

mask-border-sourceは比較的新しいプロパティで、ブラウザサポートに注意が必要です。

現在のブラウザ対応状況

ブラウザ対応状況備考
Safari-webkit- プレフィックス付きで対応最も安定したサポート
Chrome部分的対応フラグが必要な場合あり
Firefox対応作業中将来的にサポート予定
EdgeChromiumベースは部分的対応Chromeと同様

フォールバック付きの実装

.with-fallback {
  width: 300px;
  padding: 20px;

  /* === フォールバック: 通常のボーダー === */
  border: 3px solid #667eea;
  border-radius: 12px;
  background: white;

  /* === mask-borderをサポートするブラウザ向け === */
  @supports (-webkit-mask-border-source: url('')) {
    border: none;
    border-radius: 0;

    -webkit-mask-border-source: url('decorative-border.png');
    -webkit-mask-border-slice: 30;
    -webkit-mask-border-width: 15px;
    -webkit-mask-border-repeat: round;
  }

  @supports (mask-border-source: url('')) {
    border: none;
    border-radius: 0;

    mask-border-source: url('decorative-border.png');
    mask-border-slice: 30;
    mask-border-width: 15px;
    mask-border-repeat: round;
  }
}

プログレッシブエンハンスメント

/* Step 1: 基本スタイル(すべてのブラウザ) */
.enhanced-border {
  width: 300px;
  padding: 20px;
  background: white;
  border: 2px dashed #999;
}

/* Step 2: Safari対応 */
@supports (-webkit-mask-border-source: url('')) {
  .enhanced-border {
    border: none;
    -webkit-mask-border-source: url('fancy-border.png');
    -webkit-mask-border-slice: 25;
    -webkit-mask-border-width: 12px;
    -webkit-mask-border-repeat: round;
  }
}

/* Step 3: 標準仕様対応 */
@supports (mask-border-source: url('')) {
  .enhanced-border {
    border: none;
    mask-border-source: url('fancy-border.png');
    mask-border-slice: 25;
    mask-border-width: 12px;
    mask-border-repeat: round;
  }
}

使用上の注意点

画像の最適化

マスク画像のサイズと形式は、パフォーマンスに影響します。

/* 推奨: SVGまたは最適化された画像を使用 */
.optimized {
  /* SVG形式: ベクターなので軽量かつ高品質 */
  mask-border-source: url('optimized-border.svg');
  -webkit-mask-border-source: url('optimized-border.svg');
}

.optimized-webp {
  /* WebP形式: PNGより軽量 */
  mask-border-source: url('optimized-border.webp');
  -webkit-mask-border-source: url('optimized-border.webp');
}

/* 避けるべき: 大きすぎる画像 */
.not-recommended {
  /* NG: 大きなPNG画像はページを重くする */
  mask-border-source: url('large-border-4000x4000.png');
}

最適化のポイント:

  • SVG形式を優先して使用する
  • PNG/WebPを使う場合は適切なサイズにリサイズする
  • 画像圧縮ツールで最適化する

マスク画像のデザイン

9スライス分割を考慮した画像デザインが重要です。

+-------+-------------------+-------+
|       |                   |       |
| 角丸   |     辺の装飾      | 角丸   |  ← 各コーナーは独立して使用される
|       |                   |       |
+-------+-------------------+-------+
|       |                   |       |
| 辺の   |     中央領域      | 辺の   |  ← 辺は繰り返しまたは引き伸ばされる
| 装飾   |  (fillで使用可)   | 装飾   |
+-------+-------------------+-------+
|       |                   |       |
| 角丸   |     辺の装飾      | 角丸   |  ← 9つの領域が連続するデザインに
|       |                   |       |
+-------+-------------------+-------+

アクセシビリティへの配慮

.accessible-design {
  /* マスクボーダーが機能しなくても内容は読める */
  mask-border-source: url('decorative.png');
  mask-border-slice: 20;
  mask-border-width: 10px;
  -webkit-mask-border-source: url('decorative.png');
  -webkit-mask-border-slice: 20;
  -webkit-mask-border-width: 10px;

  /* 十分なパディングで内容を保護 */
  padding: 30px;
}

まとめ

mask-border-sourceプロパティを使用することで、要素のボーダー領域に適用するマスク画像を柔軟に指定できます。

この記事で学んだこと

  1. mask-border-sourceの基本: 画像ファイル、SVG、グラデーションの指定方法
  2. 画像形式の選択: PNG、SVG、グラデーションそれぞれの特徴と使い分け
  3. SVGの活用: 外部ファイルとインラインSVGの参照方法
  4. グラデーションの応用: 外部ファイル不要の動的なマスクパターン
  5. ブラウザ対応: フォールバックとプログレッシブエンハンスメント

ポイント

  • 柔軟な画像指定: PNG、SVG、グラデーションなど多様なソースに対応
  • SVGの推奨: スケーラブルで軽量なSVGが最適
  • グラデーション活用: 外部ファイル不要でシンプルな効果を実現
  • 他のプロパティとの連携: mask-border-sliceなどと組み合わせて完全な効果を得る
  • ブラウザ対応: 現時点では限定的なため、フォールバックの用意が重要

mask-border-sourceを適切に活用することで、従来のCSSでは難しかった装飾的なボーダーデザインを実現できます。

参考文献

円