序文 この記事を始める前に、複数選択の質問をしてみましょう。フロントエンド開発でビルド ツールを使用する目的は何ですか? A. 今はnode.jsが人気なので、誰もがビルドツールを使っています B. フロントエンド開発をより高度化し、バックエンドと同様にコンパイルして実行する C. コードのマージ、ブラウザのプレビュー効果の更新など、反復的な手動操作を自動化ツールに置き換えます。 A または B を選択した場合は、この記事をすぐに閉じてください。C を選択した場合は、読み続けてください。 実際、ツールを使用する目的はただ 1 つ、反復的な操作の一部を自動化し、作業効率を向上させることです。さて、この点を明確にしたので、多数の小さなアイコンを 1 つの画像ファイルに結合し、対応するスタイルを生成する方法をいくつか検討してみましょう。 生成されるファイルと使用方法に応じて、大きく分けて次の 3 種類の処理方法に分けられます。 png スプライト Synthetic Sprite は、さまざまな PNG アイコンを 1 つの PNG 画像に結合する、最も古くて成熟したソリューションです。 手動操作 企業によっては、UI デザイナーに小さなアイコンの結合を依頼するところもあります (UI デザイナーは自動化ツールになっていて、恥ずかしいですね~)。これにより、フロントエンドの作業負荷は軽減されますが、いくつかの問題も発生します。
したがって、このアプローチは推奨されず、ここでの議論の範囲外となります。 自動化ツール 自動化ツールがあれば、いくつかの問題を解決してプロセス全体を最適化することができます。
設定ファイル プロセス全体を実装するには、npm の gulp.spritesmith モジュールを例に挙げます。 これは gulpfile.js で設定されたタスクです。 var gulp = require('gulp'); var $ = require('gulp-load-plugins')(); gulp.task('png', 関数() { gulp.src('./src/*.png') .pipe($.spritesmith({ imgName: 'icon.png', // パラメーター、生成された画像ファイル名 cssName: 'icon.css', // パラメーター、生成されたスタイルファイル名 cssTemplate: './src/png_template.hbs' // パラメーター、スタイルファイルテンプレートのパス、デフォルトは handlerbars テンプレートです })) .pipe(gulp.dest('dist/png')); }); 強力な機能を備えています。CSS ファイルに加えて、SCSS ファイルや Less ファイルも生成でき、テンプレート ファイルでフォーマットすることもできます。ここでは、次の内容で png_template.hbs ファイルをカスタマイズしました。 // 主にアイコンにインラインブロックレベルのスタイルを与えるために共通のスタイルを追加します。icon { 表示: インラインブロック; } {{#スプライト}} .icon-{{name}} { 背景画像: url({{{escaped_image}}}); 背景位置: {{px.offset_x}} {{px.offset_y}}; 幅: {{px.width}}; 高さ: {{px.height}}; } {{/スプライト}} 開発プロセス 設定が完了したら、デバッグ用に 2 つの小さなアイコン (question.png と hook.png) をソース フォルダーに配置します。 gulp 処理後、icon.css と icon.png の 2 つのファイルが生成されます。 icon.css を開くと、アイコン名に応じて 2 つのスタイル クラスが生成されていることがわかります。 .アイコン { 表示: インラインブロック; } .アイコンフック{ 背景画像: url(icon.png); 背景位置: -40px 0px; 幅: 16px; 高さ: 16px; } .icon-質問{ 背景画像: url(icon.png); 背景位置: 0px 0px; 幅: 40px; 高さ: 40px; } コード内での使用は簡単です // 生成された CSS ファイルを参照します <link rel="stylesheet" href="./png/icon.css" charset="utf-8"> ... // タグに直接スタイル クラスを追加します <i class="icon icon-hook"></i> <i class="icon icon-question"></i> プレビュー効果については記事の最後にあるスクリーンショットをご覧ください。 質問 技術の進歩と人々の生活水準の向上のおかげで、この効率的な方法はすぐに「天敵」、つまり高 DPR の網膜スクリーンに遭遇しました。 応答性を使用して DPR を決定すると、これまでの作業負荷がすべて 2 倍になり、冗長なスタイルも読み込む必要があります。しかも画面が更新されるごとにDPRも増えて、余計な絵やスタイルを作らないといけないので、考えただけでも疲れます-_-|| では、異なる DPR の画面に適応できる画像はあるのでしょうか? CSS3 の登場により、私たちは新たな方向性を見出すことができました。 フォント フォント アイコンとも呼ばれるこのテクノロジは、ベクター グラフィックを組み合わせてフォント ファイルを生成し、CSS 内の対応するフォント エンコーディングを参照して画像にレンダリングするだけです。フォントはさまざまな画面に適応するため、フォントアイコンもこの利点を継承します。 手動操作 フォントアイコンを作成する Web サイトは多数ありますが、人気のあるものとしては icomoon、Alibaba Icon Library などがあります。 基本的な操作は、アイコンをオンラインで編集し、フォント ファイルとスタイルを含む圧縮パッケージをダウンロードすることです。最初の問題は、アイコンのサイズが異なると、font-size 属性を手動で調整する必要があることです。2 つ目は、アップロード - 編集 - ダウンロードという手動操作が頻繁すぎることです。最後の問題は、ネットワーク環境に依存し、ネットワークがないとアイコンを編集できないことです。この場合、自動化ツールを使用してオフラインでファイルを生成しようとしました。 自動化ツール GitHub で多数のスターを獲得しているモジュール gulp-iconfont は引き続き使用されますが、同時に CSS を生成するために別のモジュール gulp-iconfont-css が必要になります。 設定ファイル gulpfile.js を設定する var gulp = require('gulp'); var $ = require('gulp-load-plugins')(); gulp.task('アイコンフォント', 関数() { // 最初にスタイルを設定し、次にフォントファイルを設定します return gulp.src(['src/*.svg']) .pipe($.iconfontCss({ fontName: 'iconfont', //フォント名 path: './src/font_template.css', //テンプレートファイルパス cssClass: 'iconfont' //スタイルクラス名 })) .pipe($.iconfont({ fontName: 'iconfont', //フォント名形式: ['ttf', 'eot', 'woff', 'woff2', 'svg'] //出力フォントファイル形式})) .pipe(gulp.dest('dist/font')); }); テンプレートファイルはここでは省略します〜 開発プロセス 設定が完了したら、デバッグ用に 2 つの小さなアイコン (question.svg と hook.svg) をソース フォルダーに配置します。 gulp 処理後、_icon.css、iconfont.eot、iconfont.svg、iconfont.ttf、iconfont.woff、iconfont.woff2 の 6 つのファイルが生成されます。 _icon.css を開くと、アイコン名に応じて 2 つのスタイル クラスが生成されていることがわかります。 @フォントフェイス { フォントファミリ: "アイコンフォント"; ソース: url('./iconfont.eot'); ソース: url('./iconfont.eot?#iefix') フォーマット('eot'), url('./iconfont.woff2') フォーマット('woff2'), url('./iconfont.woff') フォーマット('woff'), url('./iconfont.ttf') フォーマット('truetype'), url('./iconfont.svg#iconfont') フォーマット('svg'); } .iconfont:before { フォントファミリ: "アイコンフォント"; -webkit-font-smoothing: アンチエイリアス; -moz-osx-font-smoothing: グレースケール; フォントスタイル: 通常; フォントバリアント: normal; フォントの太さ: 標準; /* 発言: なし; プライベート Unicode 範囲 (firstGlyph オプション) を使用しない場合にのみ必要 */ テキスト装飾: なし; テキスト変換: なし; } .iconfont-hook:before { 内容: "\E001"; } .iconfont-question:before { 内容: "\E002"; } コード内での使用も簡単 // 生成された CSS ファイルを参照します <link rel="stylesheet" href="./font/_icons.css" charset="utf-8"> ... // タグに直接スタイル クラスを追加します <i class="iconfont iconfont-hook"></i> <i class="iconfont iconfont-question"></i> プレビュー効果については記事の最後にあるスクリーンショットをご覧ください。 使用上の問題 前に紹介したツールと同様に、テンプレートを使用して、複数の形式で scss、less、css ファイルを生成できます。厄介な問題は、生成されたすべてのフォント アイコンが最も高いアイコンの高さを占有することです。つまり、一部のアイコンの高さをリセットする必要があるということです。 自動操作が一瞬で半自動にダウングレードされ、生成された画像がギザギザになった(設定の問題なのかは分かりませんが)ので、失敗した解決策としか言いようがありません。 svg スプライト ちょうど落ち込んでいたときに、張新旭の「未来のホット:SVGスプライト技術入門」という記事を見つけました。 (最後の結論ではフォントアイコンと svg スプライトを比較しています。興味のある方はご覧ください) 明るい未来があると感じました。より強力な svg スプライトがあることが判明しました。 SVG ベクター アイコンを 1 つの SVG ファイルに統合し、シンボルの形式で表示したり、使用時にタグを使用したりします。 手動操作 このソリューションを検討する際、手動の方法を使用する予定はありませんでした。手動操作が必要な場合は、フォントアイコンを使用する方がよいため、自動化ツールを直接検討しました。 自動化ツール 使用されるモジュールは gulp-svg-sprite で、これは gulp-svgstrore に次いで github で 2 番目に多くのスターを獲得しています。 scss、less、css ファイル形式の出力をサポートします。 設定ファイル var gulp = require('gulp'); var $ = require('gulp-load-plugins')(); gulp.task('svg', 関数() { gulp.src('./src/*.svg') を返します .pipe($.svgスプライト({ モード: { シンボル: { プレフィックス: `.svg-`, 寸法: '%s', スプライト: '../icon.svg', シンボル: true、 与える: { css: { 保存先: '../icon.css' } } } } })) .pipe(gulp.dest('dist/svg')); }); 開発プロセス 全体のプロセスは上記と同じです。設定が完了したら、デバッグ用に 2 つの小さなアイコン (question.svg と hook.svg) をソース フォルダーに配置します。 gulp 処理後、icon.svg と icon.css の 2 つのファイルが生成されます。 icon.css を開くと、アイコン名に応じて 2 つのスタイル クラスが生成されていることがわかります。 .svgフック{ 幅: 16px; 高さ: 16px; } .svg-質問{ 幅: 40px; 高さ: 40px; } とても簡潔ですね。 ! ! 使い方は少し複雑です: //スタイルファイルを参照 <link rel="stylesheet" href="./svg/icon.css" charset="utf-8"> ... <svg クラス="svg-hook"> <xlink:href="./svg/icon.svg#hook" を使用></use> </svg> <svg クラス="svg-question"> <xlink:href="./svg/icon.svg#question" を使用></use> </svg> プレビュー効果については記事の最後にあるスクリーンショットをご覧ください。 フォントアイコンと比較すると:
使用上の問題 すべての IE ブラウザ (IE11 を含む) は、外部 SVG ファイルの特定のコンポーネントの取得をサポートしていません。しかし、これも簡単に解決できます。サードパーティの js (svg4everybody) を使用するだけです。 要約する 記事に記載されているコードアドレス:https://github.com/yalishizhude/sprite-demo またはローカルにダウンロードすることもできます さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただき、ありがとうございます。 |
<<: JavaScriptのアンチシェイクとスロットリングとは
>>: Linux Centos8 CA証明書作成チュートリアル
余計なことは言わないで、コードだけ見てみましょう〜 プロジェクト番号を選択、 sum(case wh...
ブラウザはTIF形式の画像を表示しますコードをコピーコードは次のとおりです。 <html>...
元の住所: http://www.webdesignfromscratch.com/web-2.0-...
この記事の例では、マウスに従ってボールを動かすjsの具体的なコードを参考までに共有しています。具体的...
CSS デフォルトスタイルをクリア通常の明確なデフォルト スタイル: *{ マージン:0; パディン...
目次1. MHAの紹介1. MHAとは何ですか? 2. MHAの構成3. MHAの特徴2. MySQ...
導入この章では、主に Linux で FTP サーバーを構築するプロセスを紹介します。習得すべき重要...
フロントエンド開発を行っている初心者の学生を多く見かけますが、彼らの効率は比較的遅いです。常にコード...
目次親コンポーネントリストボックスリストコンポーネントボタンコンポーネント PageButton昨年...
目次1. 一般的な高階関数1.1、フィルター1.2、地図1.3、減らすHigher Order fu...
検索パフォーマンスは最速から最遅まで次のとおりです (私が聞いたところによると)。 1 番目: ti...
1. Reactコンポーネントを定義する2つの方法1. 関数コンポーネント。単純な関数コンポーネント...
MySQL 基本データ型一般的な MySQL データ型の概要 ![1036857-201708011...
1. 効果を達成する 2 知識ポイント2.1 <label> タグHTML では、<...
目次ポータルエラー境界処理エラー境界を使用しない場合はどうなりますか?注記ポータルスロットとも言えま...