Fade and scroll items into view while scrolling

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
- Hi there, my name is Kevin, and welcome to this video where we're continuing our exploration of intersection observers. If you missed the beginning of the series, I encourage you to go and check it out. But what we're doing in this one is, do you know when you're scrolling down a page and those things slowly fade in as you go? Well we're gonna be doing that in this video and seeing how we can do it, 'cause intersection observers are pretty much perfect for that. So let's go and check it out. (beeping) Before we jump into the content of this video, I just want to say a big thank you to Skillshare for sponsoring this video. If you don't know about Skillshare, it is a massive online learning community with over 25000 classes. By getting a membership with them, you get access to the entire library, unlimited access to everything, which is really, really cool. They have classes in web development, in UI, in UX, in Photoshop, in all sorts of really, really cool things. If you're interesting in learning and you just wanna absorb tons and tons of information, I'm guessing you do if you're here, it's an awesome, really cool platform. As an added bonus too, if you use the link down below, the first 500 people who use it will get access to Skillshare for two months for free. And one of the classes I think you might like since you're watching this video, is The JavaScript Toolkit. It's focus is cleaner, faster, and better code. But it's a really nice overview. It's not the longest course, which is also nice 'cause you get to plow through it pretty quickly. So as I mentioned, if you use the link down below, you get two months for free. If you do sign up for an annual membership after that, that's less than 10 dollars a month, and that gives you access to their entire library, unlimited, which is really, really cool and awesome. It's a platform I've used, I've keep watching stuff on there like that Java Script class and others. So I really do think that you will like it, and I really encourage you to check it out. And when you do, you'll be joining up with more than seven million other people who are also in there and getting their learn on with Skillshare. Thank you very much to Skillshare for sponsoring this video. Now, let's get on with what we came here for. Before we get into this, I just wanna say that I'm continuing working on a file that I started last week where I did the navigation. So when I get into the JavaScript, if you didn't see that video, you're gonna see some JavaScript that's already in there, but I'm not actually touching it. But just if you're like, why is there all this code there already? That is from the last video where we change the navigation on Scroll. You can check that video out if you do want to. And if you didn't see my original video on the introduction to intersection observer, that one I really go into detail on how these are working, whereas in this video, I'm just sort of making it work. So if you want more information and understanding on how this intersection observers working all the different things, I'm doing this set it up. I really recommend going and checking out that first video. So if you did follow along with the last video, it's the same deal in this one. There's a link down below to the starting files as well as the finished files. They're both GitHub repos, so you can either follow along with what I'm doing here, and the finished ones if you ever get stuck or anything like that. You can go in there and take a look. So let's just give a quick look at the markup to see how I've set this up a little bit. So you can see I have three columns here. That's these three columns right there. I have a fade-in class on those. So we'll start with those ones and then we'll look at how we can also bring in these things. 'Cause we're actually gonna do it in a, I think, in a clever way, to make it all work with a single class. So we can actually use the same observer for all of them, which is kinda cool. So, we're gonna come over to my file here, and these are all my columns, So right here I'm just gonna add in a fade-in. And we're gonna start with these having an opacity of zero on them. And we'll add a transition to the opacity. Opacity of, we'll say, 250 milliseconds. Transition, you gotta have the I there, transition. And we'll have it ease-in. And then, what we're gonna use is a class called appear. So if we have a fade-in with also a class of appear on it, it's going to get an opacity of one. So, if I save that, whoop! You can see that they just disappeared. So, perfect, we know that everything is working. So if I come over to my observers here, I'm gonna create our new observers. So I'm just going to, let's come up to the top here. I'm gonna turn word wrap off just for a second to make it a bit cleaner. So here we can do our const, let's call these faders, for lack of a better word. So to be a document.querySelector. In this case, we wanna do a querySelectorAll 'cause we're gonna have multiple, it's not just one item. And that's anything that has the class of fade-in. So anything with the class of fade-in, let's turn word wrap back on 'cause we're there. So there we go. Anything with the class of fade-in, we'll be calling it a fader. So let's save that. So let's come down and write our observer for that. So for this observer, I'm gonna call it appearOnScroll 'cause I think that name makes a lot of sense. And appearOnScroll will be a new IntersectionObserver. And once again, we do need to have a function, and we also want to have our options on there as well. So in our function, we're going to want to be looking for our entries as well as appearOnScroll. And now we can come in and write our actual function in here. So that's working but you're seeing we're getting an error here for options not being defined. So let's come and set those options up right away. Const, and I shall call them, we'll call them, appearOptions. So const appearOptions will be equal to, and we'll do nothing for now, but once again, we'll come back and add some stuff into that a little bit later on. So inside of our appearOnScroll here, inside of our function now, what do we wanna do in our function? Well we want to do like we did last time, and which we'll be doing all the time with these, is our entries for each, and set it up for each individual entry. And then another function so that we can pull up our error function. And in this case, what we wanna do is, it's really important to do this, where we're gonna say if it's false, that the entry.isIntersecting. So if you remember from the last, the very first video I looked at when we explored these, intersection observer, whether or not it's intersecting, is gonna fire as soon as the page loads. And it's gonna say this is or isn't intersecting. So if it does that and we have a function here that's toggling a class on and off, that's gonna be a problem, or just toggling a class on in this case. But that's gonna be a problem because it's gonna turn the class on everywhere, and we're not gonna see what it's actually doing. So the first thing we have to do is say if it isn't intersecting with the page, we want to return. Let's get the heck out of here. So, return. This function's done. Don't look at anything else. But if it is intersecting with the page, now we can actually do something. So in this case, we can set our entry.target.classlist.add, and we wanna add in appear, 'cause that was the class that we just created. And the other thing we need to do at the same time is appearOnScroll, circling back to our actual function here that we created or even our intersection observer that we created here. And we're going to unobserve(entry.target). So if you're not sure why I'm doing that, you can check out the first video that I did as well, but pretty much it's just to say stop looking at something once you've done your job. So everything is in place but now we actually wanna get it to work. So to do that, we need to come down. And we can't do it like we did when we did our navigation here. 'Cause when we were doing that, we were observing only one thing. We were observing the section one part of our page here, and paying attention to where that was. But in this case, we're gonna be looking at all three of these columns. Plus, eventually, we're gonna use the same thing to look at these as well. So if we're doing that, what we need to do is first do our faders, which we already set up our const for. So faders. On the faders we're gonna do a forEach. So for each fader inside of faders, we want to run appearOnScroll, or we don't wanna run it, we wanna set up it to observe that individual fader. So now if I hit save, look at that, they all came in. So let's scroll back up to the top of the page, hit refresh. Now actually, we might run into a bit, we will run into a problem here. 'Cause when I scroll down, see how they faded in right away? Let's do that one more time. I'll scroll up. Pay attention to the bottom of the page. As soon as they get there, they're already there. They're fading in super, super fast. So let's use our appearOptions here. So I'm gonna use two different options here. One of them that we're gonna do is my threshold. Threshold. I wanna make sure the entire image, or the entire column, is in the page. Whatever I'm fading in, I want the whole thing to be there before it starts to fade in. So let's leave that there, not a semicolon. Let's just hit save like that. Whoops. Scroll up and refresh. So now when I get to here, you can see they haven't faded in yet. They haven't faded in. And now, there we go. Then they fade in. So only once the entire thing is visible, will they fade in. So that's good. But I think we also could use a rootMargin on this as well. rootMargin. In this case, we're looking at the bottom so it'd be zero pixels, zero pixels. The bottom, let's say, 200 pixels. Negative 200 and zero pixels. So let's scroll back up, and I'll save my JavaScript file here. And now, when we scroll down, not only do we need the whole thing to be in the screen, but it needs to be pretty far into the screen. I think I overdid it there, but now they're fading in. So I think I can probably make this a bit smaller, maybe negative 100. Something like that. So they're fading in once we're a 100 pixels in. And I think that'll work a little bit better. Let's just try out one more time. The whole thing is there, they have 100 pixels from the bottom, and then they're fading in. Perfect! So that is working really, really nicely. Now let's set that up to also work to get these things here to slide in. So the first thing I'm gonna have to do is come back to my CSS, and come down here. So I already have my from-left and from-right. So this is, anything on the left I have a class of from-left on, any of the ones on the right, I have a from-right on. I was a little bit lazy. I set up the grid columns, I set them up on a grid, and use the grid columns on those specifically, which I'm not sure if I'd wanna do it that way. Whatever, it's for a quick demo, I think it works. So on anything that's on the left side, we want to also do a transform of translateX. And let's move it 50% of the way that way. And I'm gonna take the same thing but if it's on the right side, into a positive 50%. Let's save that. And you can see they've moved out. Now it's causing some side scrolling. We'll fix that in a bit. But it's movement out to the sides like that. And then for either one of these, so for my from, whoops, spell things right? From, scroll down a little, from-left, let's say my from-left and actually my from-right. From-right. We're gonna set up for both of these we want it to have a transition of, for now I'm just gonna set it to transform, so we can see it working, and then we'll add in the opacity afterwards. So we can set up our transition like that, and when both of them, let's just copy that, when both of them get the class of appear on it, they are going to get a transform of translateX of zero. So they're gonna move back into their normal place. So with all that set up, now what we need to do is actually observe and make it work. Now just really fast, what I did is if we come and look at them, I've done two things on it. I've given them from-right and from-left, which is positioning them, but I've given them all the class of slide-in, just because that way we can set up one observer for all of them, in one shot. So let's turn word wrap off for a second. So I have my faders. Here I'm gonna add in another one. We'll call it sliders. So document.querySelectorAll. And in this case, we're going to be looking for anything with a class of slide-in on it. So anything with a class of slide-in, we've saved right to there. So now we can actually use this, and say sliders.forEach(slider => {appearOnScroll.observe (slider); and it should have the same effect. And it's not working. And there's a really good reason it's not working actually. And it's because the observer is looking for anything that's intersecting with the page, but I said appear that the whole thing has to be in the view, and that's actually causing a problem because right now they're not all the way in the view. The whole thing is actually sticking out the sides. So either we could play with our left and right margins on this and make them positive to be a lot bigger, which is an option, or I could put the threshold down to zero. So if I put the threshold down to zero, you can see now it's actually starting to work. And as I go down, those items are starting to slide into view. There is also the problem of the side scrolling, which probably in this case, if you really wanted to set it up this way, I think the easiest way to fix it would just be to come on to the body here, and say the overflow-x, is it x? Yeah, is hidden. So if we do that, and let's go scroll all the way back up, and it should actually fix that. So these will all come in like that, and then you can see they're sliding in from the left and the right like that. And we don't have any side scrolling, which is handy. So I think what I do is leave it that way. But, we're gonna wanna do two more things. One, I'm gonna make this so it's actually back up, maybe to 250 pixels, just cause the threshold is so low. So actually let's come back up to here and refresh. And, so there we go. So I think that'll work a little bit better. The other advantage with this is if your threshold is one, and you have something really long, that you're fading in for some reason, I probably wouldn't do it. But if that does happen, it will never come in. If it's longer than the viewport, it just can't hit a threshold of one. So this might be a safer option as well. And these types of mistakes that I think everybody can run into. So it's working but obviously, it looks weird that they're sticking out the side and coming in. So I think the other thing that's important that we do is on our from-left and from-right. They're also gonna start with an opacity of zero. And the opacity will become one. Opacity of one. But that means we also need to transition that. So here, let's say the opacity is, let's make it a little faster, 250 milliseconds, ease-in. And so we can have the two on there. And actually just to make it. So we're doing a transition on both the opacity and on our transform property there. So if we go and look at it now, let's refresh my page, when we scroll down, that is coming into view. Then we get to here, it sort of fades in and slides into view at the same time. So it just grabs the attention a little bit. That was fine, that was cool, don't overdo it please, if you do this. Especially, we learn new effects and they're like, whoa, that's cool, and then everything on the page is just flying, no, please. Using it for a little bit, something to grab attention, a little bit extra here or there, that's fine. That's cool. But if you start really doing it, be really careful. And also, just be note that people don't always like lots of animation. People might've prefer reduced animation, things like that, so just do please try and take them into account, that you don't have all these things flying around because even a normal person won't like that and they'll get the hell out. (chuckling) It's a cool thing but don't overdo it. But yeah, I think it was not only is it a cool thing, it is a good way to learn how intersection observers work. So I hope you liked that. If you did like the video, please let me know in the comments below. A big thank you to my patreons for helping support me and everything I do here on my channel. Thank you guys so much. And of course, an extra big thank you to my supporters of Awesome Lauren, Fernando, and Jonathon for being super, super generous with their support over on Patreon. If you enjoyed this video, I'm gonna encourage you to hit the subscribe button. But if you're already subscribed, or even if you're not subscribed. Also if you go into the description, I do have a newsletter. So that's another way you can know that you're not missing anything, including articles i write. I do occasionally write some articles over on my website, and very, very rarely, but occasionally on other websites as well. So if you wanna know everything I'm up to and you never wanna miss anything, you can subscribe to my newsletter below and get that, or actually it should be showing up on the side card any second now as well. Click that, it should let you sign up. And you'll know that you're getting everything I do. So if you like my stuff, it's a good way to keep up with everything I'm doing. Thank you very much for watching, and we're gonna be continuing our intersection observer exploration, that took a lot of concentration (chuckles) to think about that one. So we're gonna be continuing that exploration in next week's video, where we're gonna be looking at lazy loading images which is probably the best thing to be using it for honestly. It has a massive benefit to the user, just cause if you're on your phone and you don't wanna be getting dinged with all the data that you don't need to be using. But it also boosts the performance of your sight which Google likes, and just is a good idea to do in general too. So if you really wanted to use one, you don't want these fancy effects going on, this is a really good reason. We're gonna be looking at that in next week's video. So I'm really looking forward to that but until then, don't forget to make your corner of the internet just a little bit more awesome.
Info
Channel: Kevin Powell
Views: 133,947
Rating: 4.9357047 out of 5
Keywords: Kevin Powell, tutorial, html, css, intersection observer, javascript, js, fade in on scroll, slide in on scroll
Id: huVJW23JHKQ
Channel Id: undefined
Length: 17min 12sec (1032 seconds)
Published: Sat Jun 22 2019
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.