WEBVTT

1
00:00:01.310 --> 00:00:03.280
<v ->One of the most important things</v>

2
00:00:03.280 --> 00:00:07.000
when building any website is performance.

3
00:00:07.000 --> 00:00:11.940
And images have by far the biggest impact on page loading.

4
00:00:11.940 --> 00:00:13.630
And so it's very important

5
00:00:13.630 --> 00:00:17.310
that images are optimized on any page.

6
00:00:17.310 --> 00:00:18.190
And for that,

7
00:00:18.190 --> 00:00:22.260
we can use a strategy called Lazy Loading Images.

8
00:00:22.260 --> 00:00:23.690
So, let me show you now

9
00:00:23.690 --> 00:00:27.063
how to implement that strategy in JavaScript.

10
00:00:28.790 --> 00:00:32.480
And the effect that I'm talking about is this one.

11
00:00:32.480 --> 00:00:34.930
So what for what happens with the images

12
00:00:34.930 --> 00:00:36.163
in this section here?

13
00:00:37.200 --> 00:00:38.883
So you see, as we approach it,

14
00:00:39.750 --> 00:00:43.560
it basically starts to load and then once it finished,

15
00:00:43.560 --> 00:00:46.340
it will get displayed and that placeholder

16
00:00:46.340 --> 00:00:49.113
which is there in the beginning gets replaced.

17
00:00:50.030 --> 00:00:51.073
So you see that?

18
00:00:52.230 --> 00:00:55.830
So let me quickly show you in the HTML how we implement that

19
00:00:57.150 --> 00:00:59.660
and we're actually already here.

20
00:00:59.660 --> 00:01:02.380
So, it's these features here

21
00:01:02.380 --> 00:01:05.920
and so each of these features has an image.

22
00:01:05.920 --> 00:01:09.740
So, the main ingredient to this lazy loading strategy

23
00:01:09.740 --> 00:01:12.650
is that we have a very low resolution image,

24
00:01:12.650 --> 00:01:15.170
which is really small and which is loaded,

25
00:01:15.170 --> 00:01:16.930
right in the beginning.

26
00:01:16.930 --> 00:01:19.380
So that's this image here, and you'll see

27
00:01:19.380 --> 00:01:24.380
that the dimensions are only 200 times 120 in this case.

28
00:01:24.700 --> 00:01:27.983
So let's actually take a look at that image here.

29
00:01:28.950 --> 00:01:31.230
And so, you see it's really small

30
00:01:31.230 --> 00:01:35.090
and it's only 16 kilobytes while the real one,

31
00:01:35.090 --> 00:01:39.380
so this one called digital, is almost half a megabyte.

32
00:01:39.380 --> 00:01:42.370
So that's a huge difference

33
00:01:42.370 --> 00:01:45.350
and that image we then reference here

34
00:01:45.350 --> 00:01:48.370
in this data-src attribute.

35
00:01:48.370 --> 00:01:50.800
So that's a special attribute that we can use,

36
00:01:50.800 --> 00:01:53.460
but any other would work as well.

37
00:01:53.460 --> 00:01:56.230
So this is not a standard HTML attribute

38
00:01:56.230 --> 00:01:59.720
but instead it's one of these special data attributes

39
00:01:59.720 --> 00:02:01.123
that we can do ourselves.

40
00:02:02.330 --> 00:02:05.030
And so basically the idea is to...

41
00:02:05.030 --> 00:02:08.850
As we scroll to one of these low resolution images

42
00:02:08.850 --> 00:02:12.280
we will then replace this low resolution image

43
00:02:12.280 --> 00:02:14.681
with the one that is here specified

44
00:02:14.681 --> 00:02:17.140
in the data-src attribute.

45
00:02:17.140 --> 00:02:21.090
And we then also are gonna remove this class here

46
00:02:21.090 --> 00:02:22.920
which has kind of this filter,

47
00:02:22.920 --> 00:02:27.320
which makes this image blurred because without this filter,

48
00:02:27.320 --> 00:02:28.633
let me show that to you,

49
00:02:29.490 --> 00:02:32.503
without this, it would look really terrible.

50
00:02:33.580 --> 00:02:38.193
So too small to change this now here.

51
00:02:39.810 --> 00:02:43.033
Okay, but let's just remove it here for a second,

52
00:02:44.900 --> 00:02:47.390
just so you can see what it looks like.

53
00:02:47.390 --> 00:02:50.570
And so, maybe you can see, or maybe it's too small

54
00:02:52.800 --> 00:02:57.800
but notice that it's like really pixelated and really ugly.

55
00:02:57.800 --> 00:03:01.800
And so, I created this filter basically,

56
00:03:01.800 --> 00:03:03.990
and so it makes it look like this.

57
00:03:03.990 --> 00:03:07.880
So it hides the fact that it is actually way too small

58
00:03:07.880 --> 00:03:08.973
for its size.

59
00:03:11.160 --> 00:03:12.573
So let's put it back here.

60
00:03:14.200 --> 00:03:18.720
And so this is what this class looks like.

61
00:03:18.720 --> 00:03:20.850
It's simply a blur filter.

62
00:03:20.850 --> 00:03:24.683
And so modern CSS allows us to do this really cool effect.

63
00:03:27.380 --> 00:03:31.550
So, let's implement this and that's actually not too hard

64
00:03:31.550 --> 00:03:34.773
using the Intersection Observer API, one more time.

65
00:03:40.276 --> 00:03:44.030
So lazy loading images and so once again,

66
00:03:44.030 --> 00:03:47.060
this one is really great for performance

67
00:03:47.060 --> 00:03:50.940
while the other things we did so far are more visual things.

68
00:03:50.940 --> 00:03:54.270
This one really impacts how your site works and especially

69
00:03:54.270 --> 00:03:57.860
for your users who might have a slow internet connection

70
00:03:57.860 --> 00:04:01.310
or a low data plan or a slow cell phone.

71
00:04:01.310 --> 00:04:04.430
And we always have to think about these users as well.

72
00:04:04.430 --> 00:04:07.540
Not everyone has a super high end computer

73
00:04:07.540 --> 00:04:08.923
or the latest phone.

74
00:04:10.950 --> 00:04:14.123
Anyway, let's start by selecting our images,

75
00:04:15.800 --> 00:04:17.483
let's call them image targets.

76
00:04:19.000 --> 00:04:22.120
And this selector is gonna be

77
00:04:22.120 --> 00:04:25.460
a little bit different this time

78
00:04:25.460 --> 00:04:28.593
because we don't want to select all the images.

79
00:04:30.110 --> 00:04:33.250
So, we could simply do a selector of image

80
00:04:33.250 --> 00:04:36.130
and that would then give us all the images.

81
00:04:36.130 --> 00:04:40.580
But however not all of them are gonna be lazy loaded,

82
00:04:40.580 --> 00:04:42.490
for example, this one here,

83
00:04:42.490 --> 00:04:45.050
or we have some down here somewhere.

84
00:04:45.050 --> 00:04:48.930
So these avatars here or even this logo,

85
00:04:48.930 --> 00:04:51.070
so these are not lazy loaded.

86
00:04:51.070 --> 00:04:53.760
And so, the ones that will be lazy loaded

87
00:04:53.760 --> 00:04:56.630
are the ones that have this attribute here.

88
00:04:56.630 --> 00:04:58.820
So, this data-src attribute

89
00:04:58.820 --> 00:05:00.610
because that's where we specified

90
00:05:00.610 --> 00:05:03.400
the real high resolution picture.

91
00:05:03.400 --> 00:05:06.000
And so we can actually select four elements

92
00:05:06.000 --> 00:05:08.163
which contain this property.

93
00:05:09.490 --> 00:05:11.390
So if you're familiar with CSS,

94
00:05:11.390 --> 00:05:13.580
maybe you know how to do that

95
00:05:13.580 --> 00:05:16.450
but in case you're not, this is how it works.

96
00:05:16.450 --> 00:05:19.520
So we select all the images which have

97
00:05:19.520 --> 00:05:24.160
the property of data-src.

98
00:05:24.160 --> 00:05:24.993
And that's it.

99
00:05:26.030 --> 00:05:29.870
So, let's check that just to be sure

100
00:05:29.870 --> 00:05:31.163
so that it's gonna work.

101
00:05:32.270 --> 00:05:35.860
And so, indeed here we have these three images

102
00:05:38.310 --> 00:05:39.423
and nothing else.

103
00:05:42.770 --> 00:05:45.460
Then let's create our image observer

104
00:05:45.460 --> 00:05:47.253
and so this is not always the same.

105
00:05:51.040 --> 00:05:52.400
Here's our callback function,

106
00:05:52.400 --> 00:05:55.660
which I'm gonna call load image in a second

107
00:05:55.660 --> 00:05:57.400
and then all options.

108
00:05:57.400 --> 00:06:01.200
And now, let's attach this image observer here basically

109
00:06:01.200 --> 00:06:03.533
to all these targets.

110
00:06:04.880 --> 00:06:08.390
So I'm gonna loop one more time over our targets

111
00:06:08.390 --> 00:06:10.913
just like we did with this section previously.

112
00:06:14.590 --> 00:06:17.430
And this time, let's actually use an arrow function

113
00:06:17.430 --> 00:06:20.970
because all we want to do is to use the image observer

114
00:06:20.970 --> 00:06:25.540
that we created previously to observe each image.

115
00:06:28.570 --> 00:06:31.140
Now let's create that callback function

116
00:06:31.140 --> 00:06:33.593
here also pretty fast.

117
00:06:37.528 --> 00:06:40.833
So it gets the entries and also the observer.

118
00:06:45.410 --> 00:06:47.760
Okay, that's always starting

119
00:06:47.760 --> 00:06:50.070
with the options here and again,

120
00:06:50.070 --> 00:06:53.140
the route set to the entire viewport

121
00:06:53.140 --> 00:06:56.333
and let's start with the threshold at zero,

122
00:06:57.570 --> 00:07:00.240
and then we can adjust it as we go.

123
00:07:00.240 --> 00:07:04.770
But what matters really here is a disc callback function.

124
00:07:04.770 --> 00:07:07.793
So as always, this is where our functionality is.

125
00:07:08.770 --> 00:07:13.603
And so again, we have only one threshold, so only one entry.

126
00:07:14.510 --> 00:07:15.823
So I'm getting that tier.

127
00:07:18.770 --> 00:07:23.523
and now, let's check out actually this entry.

128
00:07:29.746 --> 00:07:32.983
So here we already got three of them,

129
00:07:34.030 --> 00:07:37.020
but all of them are not yet intersecting.

130
00:07:37.020 --> 00:07:39.020
Well, actually it says that this one is,

131
00:07:40.600 --> 00:07:43.823
well, but it isn't really because it's down here.

132
00:07:45.810 --> 00:07:47.183
So, that's a bit weird.

133
00:07:48.070 --> 00:07:51.380
Oh, but of course this still comes from the sections.

134
00:07:51.380 --> 00:07:54.033
So this is still coming from up here somewhere.

135
00:07:55.020 --> 00:07:57.723
Okay, let's delete it here from the sections.

136
00:08:03.390 --> 00:08:05.090
And now, let's see if it's working

137
00:08:06.140 --> 00:08:08.363
and now it is indeed an image.

138
00:08:10.270 --> 00:08:13.340
Now, it appeared a little bit before

139
00:08:13.340 --> 00:08:16.050
and that's because remember that our sections

140
00:08:16.050 --> 00:08:17.890
are actually a little bit shifted

141
00:08:19.200 --> 00:08:21.980
because of this hidden class that we added to them,

142
00:08:21.980 --> 00:08:23.963
they are shifted 8rem down.

143
00:08:25.699 --> 00:08:27.193
So remember that from here.

144
00:08:29.900 --> 00:08:31.010
Let's see.

145
00:08:31.010 --> 00:08:33.720
Yeah, so because of this translate here,

146
00:08:33.720 --> 00:08:35.930
they have moved 8rem down.

147
00:08:35.930 --> 00:08:37.510
And so, then therefore,

148
00:08:37.510 --> 00:08:40.270
this event will fire a little bit early

149
00:08:40.270 --> 00:08:41.913
but that's not a problem at all.

150
00:08:45.780 --> 00:08:48.660
What matters is that the event fired correctly

151
00:08:48.660 --> 00:08:50.683
and that it is indeed intersecting.

152
00:08:51.890 --> 00:08:54.900
Let's just clear it here to wait for the next ones.

153
00:08:54.900 --> 00:08:58.493
And so, here you get to the next one already.

154
00:09:00.315 --> 00:09:03.353
And so, that is indeed this next lazy image here.

155
00:09:04.610 --> 00:09:06.853
And then the next one here as well.

156
00:09:09.400 --> 00:09:12.620
So this one, okay.

157
00:09:12.620 --> 00:09:14.680
And then, as we're moving out of them,

158
00:09:14.680 --> 00:09:16.140
then we get even more

159
00:09:17.040 --> 00:09:19.470
because now they are no longer intersecting.

160
00:09:19.470 --> 00:09:20.303
And so once again,

161
00:09:20.303 --> 00:09:22.290
we need to only do something

162
00:09:22.290 --> 00:09:24.453
if they are actually intersecting.

163
00:09:26.980 --> 00:09:30.720
So we're gonna use the same guard clause as before.

164
00:09:30.720 --> 00:09:32.773
So if they are not intersecting,

165
00:09:36.997 --> 00:09:39.333
then we want an early return.

166
00:09:40.200 --> 00:09:45.160
But otherwise we now want to replace the src attribute

167
00:09:45.160 --> 00:09:47.613
with the data.src.

168
00:09:50.020 --> 00:09:51.400
So as we reach the image,

169
00:09:51.400 --> 00:09:55.290
it's finally time to replace the placeholder image,

170
00:09:55.290 --> 00:09:57.221
which is at the src,

171
00:09:57.221 --> 00:10:00.620
with the one we actually want, which is data-src.

172
00:10:00.620 --> 00:10:03.920
So just like before, each of these images here

173
00:10:03.920 --> 00:10:08.183
is at target or actually at entry.target

174
00:10:10.390 --> 00:10:14.090
So that's the element that's currently being intersected

175
00:10:14.090 --> 00:10:19.090
and then .src= entry.target.dataset.

176
00:10:21.200 --> 00:10:24.200
Remember, that's where these special data properties

177
00:10:24.200 --> 00:10:27.713
are stored and then .src from there.

178
00:10:29.850 --> 00:10:33.023
So this is already the main functionality right here.

179
00:10:36.030 --> 00:10:41.030
So let's try that, but you will not really see it happening

180
00:10:41.140 --> 00:10:45.140
because there's still this blurry filter here on top.

181
00:10:45.140 --> 00:10:48.010
But if we inspect it now, we should already see

182
00:10:48.010 --> 00:10:52.950
that the src is now actually already the original image.

183
00:10:52.950 --> 00:10:55.160
So you see it that it's the really big one

184
00:10:55.160 --> 00:10:58.700
while the other ones are still the lazy ones.

185
00:10:58.700 --> 00:11:00.870
Well, at least this one, the second one,

186
00:11:00.870 --> 00:11:03.650
is already also the original one

187
00:11:03.650 --> 00:11:06.583
because it's already in the viewport two.

188
00:11:08.970 --> 00:11:12.560
So, that's great, that's working just fine.

189
00:11:12.560 --> 00:11:16.250
Now, all we need to do is to then remove that class

190
00:11:16.250 --> 00:11:18.280
that has this blurred filter.

191
00:11:18.280 --> 00:11:20.630
So, that's the lazy image class.

192
00:11:20.630 --> 00:11:22.730
Now, how do we do that?

193
00:11:22.730 --> 00:11:24.760
Well, it's a little bit tricky

194
00:11:24.760 --> 00:11:28.100
because this replacing of the src attribute

195
00:11:28.100 --> 00:11:31.370
actually basically happens behind the scenes.

196
00:11:31.370 --> 00:11:33.463
So JavaScript finds the new image

197
00:11:33.463 --> 00:11:36.220
that it should load and display here.

198
00:11:36.220 --> 00:11:38.300
And it does that behind the scenes.

199
00:11:38.300 --> 00:11:40.950
And once it's finished loading that image

200
00:11:40.950 --> 00:11:43.063
it will emit the load event.

201
00:11:44.290 --> 00:11:47.430
And the load event is just like any other event.

202
00:11:47.430 --> 00:11:49.530
And so we can just listen for it

203
00:11:49.530 --> 00:11:53.093
and then do something so on that image.

204
00:11:53.093 --> 00:11:57.980
So on that image, so that's entry.target,

205
00:11:57.980 --> 00:12:02.980
we can do, addEventListener, and listen for the load event.

206
00:12:08.800 --> 00:12:11.613
And actually, let me show you why it is important

207
00:12:11.613 --> 00:12:12.703
that we do this.

208
00:12:14.200 --> 00:12:16.240
So let's say that we removed

209
00:12:16.240 --> 00:12:18.440
that lazy image class right away.

210
00:12:20.140 --> 00:12:24.557
So entry.target.classList.remove lazy-img.

211
00:12:32.290 --> 00:12:34.533
Let's scroll up here, reload.

212
00:12:36.990 --> 00:12:40.460
And then, well, in this case, the loading happens so fast

213
00:12:40.460 --> 00:12:42.110
that we don't even see a problem.

214
00:12:42.980 --> 00:12:45.773
Maybe we can change that here in the network tab.

215
00:12:46.920 --> 00:12:49.440
So this is a completely new tab

216
00:12:49.440 --> 00:12:53.733
but what we can do here is to simulate or speed.

217
00:12:54.770 --> 00:12:58.423
So this is a bit too big here, actually, I guess.

218
00:13:01.200 --> 00:13:03.150
So I'm not used to the size,

219
00:13:03.150 --> 00:13:04.950
Let me make it a little bit smaller.

220
00:13:07.160 --> 00:13:10.493
So let's change the tier to fast or to slow 3G.

221
00:13:11.950 --> 00:13:14.803
And maybe then, we can see what happens.

222
00:13:18.880 --> 00:13:20.730
So it's not faking that these images

223
00:13:20.730 --> 00:13:22.910
are loading really slow.

224
00:13:22.910 --> 00:13:25.060
So did you see them here blurred now?

225
00:13:25.060 --> 00:13:28.040
So it's really blurred, you see,

226
00:13:28.040 --> 00:13:30.830
but we already removed the filter.

227
00:13:30.830 --> 00:13:32.950
And so, here you can see how the image

228
00:13:32.950 --> 00:13:35.283
is loading basically in the background.

229
00:13:36.280 --> 00:13:38.600
And so it's doing that really slow now

230
00:13:38.600 --> 00:13:41.120
because we said that we are on a slow network here

231
00:13:42.330 --> 00:13:44.140
and now you see it's finished here

232
00:13:44.140 --> 00:13:47.900
and now the original image is being displayed.

233
00:13:47.900 --> 00:13:49.810
So, hopefully you could see that.

234
00:13:49.810 --> 00:13:51.430
I'm not sure if the resolution

235
00:13:51.430 --> 00:13:54.600
of the video is gonna be good enough to see it

236
00:13:54.600 --> 00:13:56.293
but I did for sure see it.

237
00:13:57.510 --> 00:14:00.010
And tear actually now the same as happening.

238
00:14:00.010 --> 00:14:02.610
Let me increase the size of the window a bit, maybe.

239
00:14:05.160 --> 00:14:07.280
So you see it's pretty blurred

240
00:14:07.280 --> 00:14:10.900
but once it's gonna be finished you will then see the final

241
00:14:10.900 --> 00:14:13.313
and beautiful version showing up here.

242
00:14:15.250 --> 00:14:17.450
All right, so we're gonna come back

243
00:14:17.450 --> 00:14:21.740
to this network tab later when we start loading data

244
00:14:21.740 --> 00:14:24.570
from remote sources on the internet.

245
00:14:24.570 --> 00:14:28.620
So this is a very important top in browser tools

246
00:14:30.320 --> 00:14:31.730
but for now, it's also nice

247
00:14:31.730 --> 00:14:35.183
to see the images loading over time behind the scenes.

248
00:14:36.200 --> 00:14:38.190
Well, it's taking a lot of time

249
00:14:38.190 --> 00:14:40.403
so let me just go back to the code here.

250
00:14:41.510 --> 00:14:44.920
And so yeah, now it's finished actually.

251
00:14:44.920 --> 00:14:47.380
And so by the time this loading finishes

252
00:14:47.380 --> 00:14:50.170
it will emit this load event.

253
00:14:50.170 --> 00:14:53.790
And so it is best to then only remove

254
00:14:53.790 --> 00:14:57.263
that blurry filter once that's done.

255
00:15:04.920 --> 00:15:07.810
So it's loading again very slow now

256
00:15:07.810 --> 00:15:10.660
and you see that now it keeps being blurred

257
00:15:10.660 --> 00:15:12.470
and it will only disappear

258
00:15:12.470 --> 00:15:14.903
once the image is in fact loaded.

259
00:15:16.000 --> 00:15:17.550
So I'm not gonna wait for that

260
00:15:17.550 --> 00:15:20.253
because it seems like it's gonna take forever.

261
00:15:22.050 --> 00:15:25.150
Oh, actually it's already done here.

262
00:15:25.150 --> 00:15:28.010
And so, you'll see now the image is downloading

263
00:15:28.010 --> 00:15:30.660
and at the same time the filter appeared

264
00:15:30.660 --> 00:15:32.590
or actually disappeared.

265
00:15:32.590 --> 00:15:34.193
Let's set it back to online.

266
00:15:35.100 --> 00:15:39.550
And so now all of it happens basically at the same time

267
00:15:39.550 --> 00:15:44.040
because we are working on our local development machine.

268
00:15:44.040 --> 00:15:46.580
And so there of course the image

269
00:15:46.580 --> 00:15:48.563
basically arrives instantaneously.

270
00:15:50.200 --> 00:15:54.580
Now as a last step, we can just, as we did before

271
00:15:54.580 --> 00:15:59.170
stop observing these images because it's no longer necessary

272
00:15:59.170 --> 00:16:02.053
we already did our task of loading.

273
00:16:03.170 --> 00:16:05.380
And so we no longer need this.

274
00:16:05.380 --> 00:16:09.563
So entry.target and that's it.

275
00:16:10.470 --> 00:16:13.260
So I hope that with this video,

276
00:16:13.260 --> 00:16:15.780
I could convince you that it's really important

277
00:16:15.780 --> 00:16:20.050
to implement this kind of functionality into your own sites.

278
00:16:20.050 --> 00:16:21.780
So, all you really need to do

279
00:16:21.780 --> 00:16:24.790
is to generate these placeholder images

280
00:16:24.790 --> 00:16:27.110
and blurred them a little bit

281
00:16:27.110 --> 00:16:29.580
and then implement this kind of logic,

282
00:16:29.580 --> 00:16:31.823
which really shouldn't be too much work.

283
00:16:34.650 --> 00:16:36.933
Let me just get rid of this console.log here.

284
00:16:38.150 --> 00:16:43.150
That's a loaded again, because actually we want probably

285
00:16:43.560 --> 00:16:45.560
to load the images a little bit

286
00:16:45.560 --> 00:16:48.060
before we actually reached them.

287
00:16:48.060 --> 00:16:51.190
So ideally we don't want our users to notice

288
00:16:51.190 --> 00:16:53.380
that we are lazy loading these images

289
00:16:54.800 --> 00:16:56.580
So all of this should basically happen

290
00:16:56.580 --> 00:17:00.340
in the background without our user noticing that.

291
00:17:00.340 --> 00:17:01.930
And so we should probably make these

292
00:17:01.930 --> 00:17:03.893
images load a little bit earlier.

293
00:17:05.440 --> 00:17:07.870
So to do that, we can again,

294
00:17:07.870 --> 00:17:11.160
specify a negative root margin here.

295
00:17:11.160 --> 00:17:16.160
So root margin of let's say minus 200 pixels.

296
00:17:19.213 --> 00:17:20.580
And so this is just the same

297
00:17:20.580 --> 00:17:23.990
as we did previously here with the navigation.

298
00:17:23.990 --> 00:17:26.320
So to make the navigation load a little bit

299
00:17:26.320 --> 00:17:29.160
before the threshold was actually reached

300
00:17:29.160 --> 00:17:31.170
and here we are doing the same

301
00:17:31.170 --> 00:17:35.430
so exactly 200 pixels before any of the images is loaded.

302
00:17:35.430 --> 00:17:38.220
It should already start loading.

303
00:17:38.220 --> 00:17:41.440
And by doing that we don't see any delay

304
00:17:41.440 --> 00:17:45.000
in loading when we browse the page.

305
00:17:45.000 --> 00:17:48.090
Well, actually that didn't quite work.

306
00:17:48.090 --> 00:17:50.490
Maybe it should be plus 200.

307
00:17:50.490 --> 00:17:52.370
So as you see, this is all a matter

308
00:17:52.370 --> 00:17:55.743
of trying out and figuring out as we go here.

309
00:17:57.192 --> 00:17:59.950
And so now indeed, as we approached the images,

310
00:17:59.950 --> 00:18:01.990
they're already fully loaded.

311
00:18:01.990 --> 00:18:06.513
So now that happens 200 pixels before we reach them.

312
00:18:09.280 --> 00:18:12.500
And with that, our functionality here is complete

313
00:18:12.500 --> 00:18:16.800
and we are now indeed almost finished with this project.

314
00:18:16.800 --> 00:18:21.363
All that's left to implement is really this slider.

315
00:18:22.900 --> 00:18:24.840
So this component here.

316
00:18:24.840 --> 00:18:27.803
And so that is what we're gonna do in the next video.

