こんにちは、何よりもあなたの仕事に感謝します、このライブラリは本当に良いです:)
質問があります。srcsetを使用してimgタグに遅延読み込みを実装する必要があります。 ライブラリを少し調べましたが、srcsetがサポートされていないようですが、正しいですか、それとも何かが足りませんか?
もしそうなら、あなたは異なる解像度の画像で例を提供できますか? (1x、2xなど...)
手伝ってくれてありがとうございます。
NS。
やあ、
このライブラリは残念ながらsrcsetをサポートしていませんが、サポートする必要があります。 これは非常に重要な機能です。
そうは言っても、ブラウザと同じ方法でsrcsetを解析して理解する必要があるため、サポートは非常に簡単ではありません。
srcsetを特殊なケースとして扱い、画像をバックグラウンドで読み込もうとはしませんが、代わりに、画像がビューポートの場合にsrcset
を設定します。
次のhtmlタグがあるとしましょう。
<img [defaultImage]="defaultImage" lazyLoad="small.jpg 300w, large.jpg 500w">
画像がビューポートにあるとき、 srcset
を見て、 lazyLoad
にsrcset
文字列が含まれていることを検出し、タグを次のように変換します。
<img srcset="small.jpg 300w, large.jpg 500w">
プロ:
簡単な実装
短所:
ユーザーには「defaultImage」は表示されません。
画像の読み込み中にネットワークエラーを処理することはできません。
srcset
を解析し、最適なオプションを選択します(ブラウザーが実行すべきだったと思うように)。
次のhtmlタグがあるとしましょう。
<img [defaultImage]="defaultImage" lazyLoad="small.jpg 300w, large.jpg 500w">
lazyLoad
にsrcset
が含まれていることを検出し、文字列を次のように解析します。
[ { url: 'small.jpg', width: 300 }, { url: 'large.jpg', width: 500 } ]
それをブラウザの幅(およびデバイスのピクセル比)と比較して、最適な画像を選択します。 画像をバックグラウンドで読み込みます。画像が読み込まれると、 srcset
を設定するだけで、画像はキャッシュにあるため、すぐに読み込まれます。
プロ:
画像はレイジーロードされます🎉
ユーザーにはデフォルトの画像が表示されます。
ネットワークエラーを処理できます( srcset
から他のイメージをロードしようとする必要がありますか、それとも
短所:
ブラウザが行うべき方法と同じ方法で文字列を解析することは常に注意が必要です。 エッジのユースケースを見逃す可能性があります。
私の理解では、ブラウザはキャッシュに保存されている場合、常に最大の画像を使用します。 画像がすでに読み込まれているかどうかを知る方法がないため、最適な画像を読み込む必要があります(ただし、 srcset
を設定すると、最大の画像が表示されます)。 たとえば、次のsrcset small.jpg 300w, large.jpg 500w
あり、画面が500 px未満であるが、 large.jpg
がすでにロードされているとします。 私の理解では、ブラウザはキャッシュ内にあるのでlarge.jpg
をピケッティングする必要がありましたが、 small.jpg
をロードするかどうかわからないため、ロード時にsrcset
を設定します。 large.jpg
(ただし、間違っている可能性があります)。 つまり、不必要に画像をロードしました。
オプション2は実行可能であり(それほど難しくないはずです)、実行する必要があると思います。 私の時間は今はかなり限られていますが、私は喜んでPRを受け入れます:)
こんにちは@tjoskar 、迅速な返信をありがとう、私は2番目のオプションが実行可能である可能性があることに同意します。 また、締め切りが迫っているため、今はあまり時間がありませんが、時間があればすぐにこの機能に貢献したいと思います。特に、ライブラリの動作を拡張して遅延をサポートしていることを考慮します。 hlink.hrefプロパティを使用した画像タグの読み込み:)
または、デフォルトのブラウザsrcsetオプションを無視して、独自の意思決定プロセスとして実装し、時間をかけて調整して、可能な限り最適なものにします:)
レスポンシブイメージのサポートを両方に追加するプルリクエスト(#231)を送信しました\ ご意見をお待ちしております。
これは3.4.0
含まれています。 ありがとう@sapierens