画像を遅延読み込みするプラグインは多数ありますが、lazySizes はレスポンシブイメージに対応、jQueryに依存しない、余計なオプションが少ないなどでおすすめです。

lazySizesの使い方

GitHub よりzipをダウンロードし、 lazysizes.min.js を読み込みます。

<script src="js/lazysizes.min.js"></script>

CSSの記述

CSSでアニメーションを入れます。

.lazyload {
  opacity: 0;
  transition: opacity .8s ease-out;
}
.lazyloaded {
  opacity: 1;
}

HTMLの記述

<img>タグのclassにlazyloadを、src="" にはダミー画像を data-src="" に表示させる画像を設定します。

<img class="lazyload" data-src="https://placehold.jp/400x200.png" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==">

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== は、data URI化した1×1のgif画像です。このまま使用できます。
参考:快速ページ表示のためのblank.gifのdata URI化、最短表現や処理の重さを実際にテストしてみた | 初代編集長ブログ―安田英久 | Web担当者Forum

ダミー画像のときに高さがなくなるのを防ぐ

画像が読み込まれる前(ダミー画像)の状態は高さがないため、画像が表示されるまでの間表示が崩れたり、スクロールイベントが正常に動作しなかったりします。
「lazysizes aspectratio extension」は、指定したアスペクト比でダミー画像の高さを保ってくれるプラグインです。
GitHub からlazysizesをzipでダウンロードすると lazysizes/plugins/aspectratio/ 内に入っています。
ディレクトリの中からls.aspectratio.min.js をlazysizesの後に読み込みます。
公式:lazysizes/plugins/aspectratio at gh-pages · aFarkas/lazysizes · GitHub

アスペクト比の指定方法

幅400・高さ200の画像の場合(全て同じ意味): "400/200""4/2""2/1""2""2.0"
<img>タグの中に下記の記述を追加します。

data-aspectratio="400/200"

img要素に width:100% を指定します。max-width では動作しません。

img.lazyload {
  width: 100%;
}