9

Angular アプリケーション (Angular 4/5/6) を構築しており、コンポーネント テンプレートで SVG スプライトを使用したいと考えています。

質問: 既に SVG アイコン スプライトが生成されていると仮定すると ( icons.svg)、Angular で SVG アイコン スプライトをコンポーネントのテンプレートに挿入/インポートするにはどうすればよいですか?

サードパーティのモジュール/ディレクティブを使用せずに SVG アイコン スプライトをコンポーネントに挿入/インポートし、Angular 自体でネイティブに実行する方法はありますか?

背景/問題:

この記事で説明したように、icons.svgファイルには として定義されたすべての SVG アイコンが含まれます<symbol>。次に、DOM に挿入されていると<use>仮定して、HTML で選択したアイコンをレンダリングできます。icons.svg

IcoMoon appを使用して SVG スプライトを生成icons.svgし、Angular アプリケーションに保存しました。以下は、ファイルを挿入/インポートし、HTML で SVG アイコンをレンダリングしようとしている私のサンプル Angular コンポーネント ( app.component.ts ) です。icons.svgただし、Angular は私の SVG アイコンをレンダリングしていません。SVG アイコン スプライト ファイルを誤って挿入しているようです。

アップデート:

  1. angular-cli を使用した SVG icon systemという同様の質問を既に認識しています。提案された答えは、Node モジュールsvg-spriteを使用して、CSS モードを使用して SVG スプライトを生成することでした。しかし、これは私が求めているものではありません。私は SVG スプライトを生成しようとはしていません。Angular コンポーネントに SVG スプライトを認識さicons.svgせ、使用するたびに HTML でレンダリングできるようにしようとしています。
  2. https://stackoverflow.com/a/50460361/4988010という解決策が提案され、SVG スプライトから CSS フォントを生成しました。これは実行可能な解決策ではなく、代わりに SVG スプライトを使用できない場合の「回避策」だと思います。

app.component.ts : StackBlitz のライブ サンプル: https://stackblitz.com/edit/angular-bbr2kh?file=src/app/app.component.ts

import { Component } from '@angular/core';
// import `./icons.svg`; // This import method doesn't work


@Component({
  selector: 'my-app',
  template: `

   <!-- This import method doesn't work -->
   <!-- <script src="./icons.svg"></script>  -->

  <p>
  Hello this is a sample Angular 6 component.
  </p>

  <p>Testing to see if SVG icon sprite import works. See below if icons appear. </p>
  <p>Icon (home): <svg class="icon icon-home"><use xlink:href="#icon-home"></use></svg> </p>
  <p>Icon (rocket): <svg class="icon icon-rocket"><use xlink:href="#icon-rocket"></use></svg> </p>
  <p>Icon (wifi): <svg class="icon icon-connection"><use xlink:href="#icon-connection"></use></svg>

  <!-- This import method doesn't work -->
  <!-- <p>Icon (home): <svg class="icon icon-home"><use xlink:href="./icons.svg#icon-home"></use></svg> </p>-->

   </p>
  `,
  styles: [`

  .icon {
  display: inline-block;
  width: 1em;
  height: 1em;
  stroke-width: 0;
  stroke: currentColor;
  fill: currentColor;
  }

  `]
})
export class AppComponent {
}
4

5 に答える 5

3

あなたのルートパスはあなたが問題を抱えている場所だと思います。あなたのコードでは、角度を調べるように指示していますappが、ブラウザはこれを次のように認識していますhttps://your-site.com./icons

アイコン ファイルをフォルダーの下に移動すると、フォルダーが既に に含まれているため、アイコン ファイルは既に/assets使用可能になっているはずです。src\assetsangular.json"assets"

<svg class="icon">
   <use xlink:href="/assets/icons.svg#icon-rocket"></use> // Notice root path not "./"
</svg>

ファイルを別のディレクトリから提供したい場合は、angular.json にパスを追加するだけです。

…
"assets": [
   "src/favicon.ico",
   "src/assets",
   "src/your-dir"
],
…

次に、コードで

<svg class="icon">
   <use xlink:href="/your-dir/icons.svg#icon-rocket"></use>
</svg>

アセット パスとして追加することはお勧めしません/src/app。これにより、基本的にファイルを提供するためにアプリ全体が開かれ、ディレクトリ全体にアクセスできるようになります。

私はあなたの例をフォークし、ここで更新しました

于 2018-08-01T02:55:00.357 に答える
0

私は同様の問題に遭遇し、与えられた回答のいくつかと同様の手法を使用して解決しました。オプションの高さと幅の設定で必要に応じてこれを使用して...

<app-icon icon="filter" width="15" height="15"></app-icon>

また

<app-icon icon="filter"></app-icon>

コンポーネントには、次の 2 つのアイコンしかありません (現在使用しているすべて) icon.component.svg

<!-- https://icons.getbootstrap.com/ -->
<div [ngSwitch]="icon">
    <svg *ngSwitchCase="'filter'" xmlns="http://www.w3.org/2000/svg" [attr.width]="width" [attr.height]="height" fill="currentColor" viewBox="0 0 16 16">
        <path d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5v-2zm1 .5v1.308l4.372 4.858A.5.5 0 0 1 7 8.5v5.306l2-.666V8.5a.5.5 0 0 1 .128-.334L13.5 3.308V2h-11z"/>
    </svg>
    <svg *ngSwitchCase="'tags'" xmlns="http://www.w3.org/2000/svg" [attr.width]="width" [attr.height]="height" fill="currentColor" viewBox="0 0 16 16">
        <path d="M3 2v4.586l7 7L14.586 9l-7-7H3zM2 2a1 1 0 0 1 1-1h4.586a1 1 0 0 1 .707.293l7 7a1 1 0 0 1 0 1.414l-4.586 4.586a1 1 0 0 1-1.414 0l-7-7A1 1 0 0 1 2 6.586V2z"/>
        <path d="M5.5 5a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0 1a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM1 7.086a1 1 0 0 0 .293.707L8.75 15.25l-.043.043a1 1 0 0 1-1.414 0l-7-7A1 1 0 0 1 0 7.586V3a1 1 0 0 1 1-1v5.086z"/>
    </svg>
</div>

icon.component.ts:

import { Component, Input, OnInit } from '@angular/core';

@Component({
    selector: 'app-icon',
    templateUrl: './icon.component.svg',
    styleUrls: []
})
export class IconComponent implements OnInit{
    @Input() icon: any
    @Input() width?: any
    @Input() height?: any

    ngOnInit(): void {
        if (typeof this.width != 'string') {
            this.width = '20'
        }
        if (typeof this.height != 'string') {
            this.height = '20'
        }
    }
}

アイコン ライブラリ セット全体を含める必要はなく、アプリケーション内でかなり簡単に再利用できます。

于 2022-02-12T23:40:54.787 に答える