React で SVG を使用する方法

SVG は、XML ベースのベクター グラフィックス イメージ形式です。SVG はスケーラブル ベクター グラフィックスの略です。1990 年代後半に開発され、2016 年頃まで十分にサポートされていませんでした。

現在、Flaticon、Font Awesome、マテリアル アイコンなどのアイコン ライブラリの大部分が SVG を完全にサポートしています。Twitter、YouTube、Udacity、Netflix などのブランドは、一部の画像やアイコンに SVG を使用しています。

他の画像形式ではなく SVG を使用するのはなぜですか?

おそらく、SVG よりも JPEG、GIF、PNG などの画像形式に馴染みがあるでしょう。ただし、これらの他の形式の代わりに SVG を使用したい理由はたくさんあります。他の画像形式と比較した SVG の利点をいくつか見てみましょう。

  • スケーラビリティと解像度: win10 システムが HDMI オーディオを出力できない場合はどうすればよいですか? HDMI ケーブル接続のよくある問題と解決策これは、他の形式に対する SVG の最大の利点です。SVG は、他の画像形式のようなピクセルのグリッドではなく、形状、数値、座標を使用します。ラップトップに Wi-Fi ホットスポットを設定するにはどうすればよいですか? Wi-Fi ホットスポットの開始時に発生する可能性のあるバグこれにより、品質を損なうことなく SVG 画像をズームインおよびズームアウトすることが可能になり、SVG の無限のスケーリングが可能になります

  • ファイル サイズが小さい: SVG ファイル サイズは、他のファイル形式と比較して一般に小さく、簡単に圧縮できるため、さらに小さくなります。

  • 高いパフォーマンスと速度: SVG 画像はサイズが小さいため、ブラウザーでのレンダリングが非常に簡単かつ高速です。これは、他の画像形式のピクセルや色と比較したテキストのレンダリングに似ています。また、コードでインライン SVG を使用する場合、ファイル内の他のすべてのコードのように、ブラウザーは画像をフェッチしてレンダリングするリクエストを行う必要がありません。この場合、リクエストは行われませんでした。しかし、複雑な画像 SVG ファイルがある場合、Dell Inspiron 15 5570 ラップトップを分解して M.2 SSD を取り付けるにはどうすればよいでしょうか? デルのラップトップ分解グラフィックチュートリアルたとえば、モナリザの写真の場合、SVG ではロード時間とパフォーマンスが大幅に低下する可能性があるため、PNG または JPEG をお勧めします。

  • DOM に似ており、スタイル設定可能、編集可能: SVG 画像はコードに似ているため、DOM 要素のようにナビゲートしたりスタイル設定したりできることを意味します。一部のプロパティには異なる名前が付けられます。ただし、代わりに次のように使用することもできます。コンピューターの起動コマンドは何ですか? Windows で実行コマンド ウィンドウを開く 8 つの方法CSS を使用して SVG のスタイルを設定することもできます。また、SVG は DOM に似ているため、任意のテキスト エディタを使用して SVGfill``color を作成、編集、アニメーション化できます。

  • アニメーション可能: SVG はアニメーション化できます。これは、Web アニメーション API、WebGL、CSS アニメーションなどのツールを使用して実行できます。CSS を使用した SVG アニメーションの詳細については、この詳細な記事をご覧ください。

  • 統合が簡単: SVG はさまざまな方法で使用できます。ロゴ画像やアイコン、グラフィックス、アニメーション、効果などを表示できます。

  • アクセシビリティと SEO: SVG にはテキストが含まれているため、アクセシビリティが向上します。これは、検索、インデックス作成、スクリプト作成などが可能であることも意味します。

React で SVG を使用する方法

以下では、この React SVG ロゴを Web ページ上で使用またはレンダリングできるさまざまな方法を説明します。Create React App には SVG を処理するための構成が組み込まれていることに注意してください。Excelのセルから複数の文字を削除するにはどうすればよいですか? 不要な文字をすべて一度に削除するこの記事の webpack 設定の変更が必要な例の一部は、webpack をバンドラーとして使用するカスタム React プロジェクトにのみ適用されます。

カスタム React プロジェクトに webpack を使用していない場合は、別のプラグインが必要になる可能性があります。

静的 SVG <img> のマークアップを使用する

タグで SVG またはその他の画像形式を使用するには、使用するモジュール バンドラーでファイル ローダー システムをセットアップする必要があります。ここでは、すでに Webpack をバンドラーとして使用している場合に、いくつかの手順で Webpack を設定する方法を説明します。<画像>

Webpack 4 を使用している場合は、最初にコマンドを使用します。これにより、Webpack 4 が開発依存関係としてインストールされます。$ npm install file-loader --save-dev

次のコードを使用して、Webpack 構成ファイルのルールを更新できます。

const webpack = require('webpack'); 
module.exports
= {
  エントリ: './src/index.js', 
  module: { 
    rules: [ 
      //... 
      { 
        test: /\.(png|jp( e*)g|svg|gif)$/、
        使用: [ 
          {
            ローダー: 'file-loader'、
            オプション: {
              名前: 'images/[ハッシュ]-[名前].[ext]', 
            }, 
          }, 
        ] , 
      }, 
    ], 
  }, 
  //... 
};

ただし、webpack 5 を使用している場合、ファイル ローダー ライブラリは非推奨になります代わりにアセットモジュールを使用してください。アセット モジュールを使用すると、追加のローダーをインストールせずに、プロジェクト設定でリソース ファイルを使用できます。Webpack 構成ファイルの rules フィールドを更新して、次の内容を含めます。

module.exports = {
  エントリ: "./src/index.js", 
  module: { 
    rules: [ 
      //... 
      { 
        test: /\.(png|jp(e*)g|svg|gif)$/ 、
        タイプ: "アセット/リソース", 
      }, 
    ], 
  }, 
  //... 
};

これで、SVG をインポートし、次のように変数として使用できるようになります。

「react」から React をインポートします。
{/*images*/} 
import ReactLogo from './logo.svg'; 
const
App = () => { 
  return ( 
    <div className="App"> 
      <img src={ReactLogo} alt="React Logo" /> 
    </div> 
  ); 
デフォルトのアプリをエクスポートします

要素 <svg> の使用

上記と同じ webpack 設定を使用し、ファイルの内容をコピーしてコードに貼り付けることで、この要素を使用できます以下に使用例を示します: <svg>``.svg

import React from 'react'; 
const
App = () => { 
  return ( 
    <div className="App"> 
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"> 
        <g fill="#61DAFB">
          <path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3。 9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 3 2.6-30.3 63.2-46.9 84- 46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9 -22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66。 7 -19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16- 1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4。1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3- 30 2- 45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13 .5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8 -6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5 .4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6- 18.6-20.3-27.8 -32 9.4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5 0-18.7.2 0-18.7.2 0-18.7.2 -27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50 .6 0 -15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5- 28-10.2zM310 490c-13.6-7.8 -19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-8 4 46.9-4.5-.1-8.3-1-11.3- 2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22. 6-2.4 44- 6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 2 2.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/>2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1 -22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50 -32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0- 51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-2 7.7 10.1-5.7-19.6 -13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-5 8.4 50.6zM320.8 78.4z"/>2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1 -22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50 -32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0- 51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-2 7.7 10.1-5.7-19.6 -13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-5 8.4 50.6zM320.8 78.4z"/>2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10。 9 13.5 18.5 27.5 35.3 41.6 50- 32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-5 1.4 -16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 1 0.1-5.7-19.6- 13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-5 8.4 50.6zM320.8 78.4z"/>2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10。 9 13.5 18.5 27.5 35.3 41.6 50- 32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-5 1.4 -16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 1 0.1-5.7-19.6- 13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-5 8.4 50.6zM320.8 78.4z"/>7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-4 0-22.5-60.9 9.2 -20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z" />7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-4 0-22.5-60.9 9.2 -20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z" />
          <circle cx="420.9" cy="296.5" r="45.7"/> 
          <path d="M520.5 78.1z"/> 
        </g> 
      </svg> 
    </div> 
  ); 
デフォルトのアプリをエクスポートします

この方法を使用する場合の欠点がわかったかもしれません。画像が複雑になると SVG ファイルは大きくなり、SVG はテキストで保存されるため、コード内に大量のテキストが含まれることになります。

SVGをコンポーネントとして使用する

SVG はインポートして、React コード内の React コンポーネントとして直接使用できます。画像は別個のファイルとしてロードされるのではなく、HTML を使用してレンダリングされます。使用例の例は次のとおりです。

「react」から React をインポートします。
import {ReactComponent as ReactLogo} from './logo.svg'; 
const
App = () => { 
  return ( 
    <div className="App"> 
      <ReactLogo /> 
    </div> 
  ); 
デフォルトのアプリをエクスポートします

このアプローチは Create React App でのみ機能することに注意してください。CRA はバックグラウンドで SVGR を使用して、SVG を React コンポーネントとして変換およびインポートします。Create React App を使用していない場合は、他の方法を使用することをお勧めします。

SVGRを使用する

SVGR は、SVG を React コンポーネントに変換する優れたツールです。では、どのように設定すればよいでしょうか?

まず、コマンドを実行してパッケージをインストールします。次に、SVG for SVGR を使用するように webpack 構成ルールを更新します。 $ npm install @svgr/webpack --save-dev

const webpack = require('webpack'); 
module.exports
= {
  エントリ: './src/index.js', 
  module: { 
    rules: [ 
      //... 
      { 
        test: /\.svg$/, 
        use : ['@svgr/webpack'], 
      }, 
    ], 
  }, 
  //... 
};

これで、SVG 画像を React コンポーネントとしてインポートし、次のようにコードで使用できるようになりました。

「react」から React をインポートします。
import ReactLogo from './logo.svg'; 
const
App = () => { 
  return ( 
    <div className="App"> 
      <ReactLogo /> 
    </div> 
  ); 
デフォルトのアプリをエクスポートします

SVGをデータURLとして使用する

データ URL は、このスキームがプレフィックスとして付けられた URL であり、これにより、コンテンツ作成者は小さなファイルをドキュメントにインラインで埋め込むことができます。詳細については、MDN Web ドキュメントを参照してください。このアプローチにより、SVG 画像をインライン要素のように使用できるようになります。データ:

どうやってこれを達成しますか? まず、webpack を使用している場合は、適切なローダーが必要です。この使用例では、 を使用します。コマンドを実行してプロジェクトに追加できます。svg-url-loader$ npm install svg-url-loader --save-dev

次に、webpack 構成ファイルのルール セクションを次の内容で更新します。

const webpack = require('webpack'); 
module.exports
= {
  エントリ: './src/index.js', 
  module: { 
    rules: [ 
      //... 
      { 
        test: /\.svg$/, 
        use : [ 
          {
            ローダー: 'svg-url-loader',
            オプション: {
              制限: 10000, 
            }, 
          }, 
        ], 
      }, 
    ], 
  }, 
  //... 
};

これで、次のように SVG ファイルをインポートして React コンポーネントで使用できるようになります。

ReactLogo を './logo.svg' からインポートします。

const App = () => { 
  return ( 
    <div className="App"> 
      <img src={ReactLogo} alt="React Logo" /> 
    </div> 
  ); 
} 

<img src="data:image/svg+xml,%3csvg..." alt="React ロゴ" />

これにより通常、DOM では次のような結果になります。

<img src="data:image/svg+xml,%3csvg..." alt="React ロゴ" />

反応 svg を使用する

React コンポーネントに SVG マークアップを直接追加すると、ファイル サイズが大きくなり、保守が困難になります。この制限にもかかわらず、インライン SVG の使用には利点があります。SVG マークアップをインラインで埋め込む場合、タグを使用する場合と比較して、CSS スタイルを SVG マークアップに簡単に適用できます。画像

コンポーネントの保守性を気にせずに SVG をインラインで埋め込む利点を活用するには、このパッケージを使用できます。SVG を非同期的に取得し、インラインに埋め込みます。反応-SVG

次のように、NPM パッケージ レジストリからインストールできます。

npm インストール反応-svg

その後、コンポーネントをインポートして React アプリケーションにレンダリングできます。コンポーネントは、SVG の URL を属性の値として受け取ります。また、いくつかのオプションの小道具も必要です。これらはドキュメントで調べることができます: ReactSVG ReactSVGsrc

import { ReactSVG } から「react-svg」; 

<ReactSVG src="icon.svg" />

React で SVG をアニメーション化する方法

冒頭で述べたように、他の画像形式よりも SVG を使用する利点の 1 つは、SVG をアニメーション化できることです。CSS または Framer モーションや React spring などの React アニメーション ライブラリを使用して、SVG をアニメーション化できます。

予防:

  • 複雑な画像: 画像が複雑になればなるほど、SVG ファイルは大きくなります。この要素を実験したときにこのことがわかりました。ここでは、PNG または JPEG 画像 <svg> を使用することをお勧めします。

  • Web での下位サポート: SVG にはブラウザの下位サポートがありません。つまり、ほとんどの古いブラウザ バージョンは SVG をサポートしていません。その結果、これらのバージョンをまだ使用しているユーザーには SVG が正しく表示されない可能性があります。古いブラウザをターゲットにしている場合、SVG は推奨される画像形式ではない可能性があります

結論は

SVG は、今日の Web 上の画像の大部分を占めています。上で述べたように、SVG は他の画像形式よりもファイル サイズが小さくなります。画質を損なうことなくサイズを変更でき、アニメーション化も可能です。

HTML での使用は簡単ですが、React などのフロントエンド フレームワークで SVG の使用を開始するには、追加のツールと構成が必要です。Create React App、Ite、Astro など、React プロジェクトの人気のあるスターター キットのほとんどには、SVG を含む画像などの静的アセットを操作するためのすぐに使用できる構成が付属しています。

記事で示唆されているように、Create React App は内部で SVGR Webpack ローダーを使用します。したがって、ステートメントを含む SVG をインポートし、アプリケーションでレンダリングできます。SVG マークアップをインライン化することもできます。ただし、SVG をインラインでレンダリングすると、コンポーネントの保守が困難になる可能性があります。@svgr/webpack`import

Webpack をバンドラーとして使用するカスタム React プロジェクトの場合、React アプリの作成と同様に SVG をロードするようにローダーを構成できます。@svgr/webpack

SVG を使用する場合、特に SVG をインライン化する場合は、複雑な画像に大きな SVG ファイルが含まれる可能性があることに注意してください。最近の一般的なブラウザは SVG を完全にサポートしていますが、一部のブラウザ (特にモバイル ブラウザ) は特定の SVG 機能を完全にはサポートしていません。

おすすめ

転載: blog.csdn.net/weixin_47967031/article/details/132599896