0 1 00:00:00,880 --> 00:00:08,770 Now, in the CSS module, you might have realized that one of the biggest annoyances of using CSS is actually 1 2 00:00:08,800 --> 00:00:10,050 layout. 2 3 00:00:10,240 --> 00:00:17,100 We've looked at all the ways that you can lay out items, from changing the position, to the display, to 3 4 00:00:17,110 --> 00:00:25,210 floating, and you would have noticed that it can get very complex very very quickly. And often, all that 4 5 00:00:25,210 --> 00:00:31,230 you need to do is just lay out things very simply, according to very simple rules. 5 6 00:00:31,240 --> 00:00:38,560 So let's take a look at the AirBnB web site, and I pulled up the listings for where to stay in Bali. 6 7 00:00:38,560 --> 00:00:40,590 This has kind of become like my spiritual home. 7 8 00:00:40,600 --> 00:00:47,940 If you take a look, they have this very very simple format of four listings per row, 8 9 00:00:47,980 --> 00:00:48,570 right? 9 10 00:00:48,910 --> 00:00:56,290 And if we go onto a smaller screen size, say on an iPad or an iPhone, it doesn't make sense to have four 10 11 00:00:56,290 --> 00:01:00,710 items in a row, because they'll get crushed and they become really really tiny, 11 12 00:01:00,820 --> 00:01:04,260 so you can’t actually see the image or read the text properly. 12 13 00:01:04,510 --> 00:01:13,240 So what happens is that, if you do go onto this web site, and you start going from the desktop size to 13 14 00:01:13,300 --> 00:01:20,410 make the jump to the iPad size, you would have noticed that there is a little step just about here where 14 15 00:01:20,470 --> 00:01:24,850 four items in a row turns into three items in a row. 15 16 00:01:25,120 --> 00:01:32,620 And this makes each of the listings more visible and more easy to read on the iPad size. 16 17 00:01:32,620 --> 00:01:39,670 Now there's one other jump when you get to about the smartphone size, which is around here, and this 17 18 00:01:39,670 --> 00:01:42,780 size only has two listings per row, 18 19 00:01:42,810 --> 00:01:49,050 again using more of that width and allowing you to be able to view the images more easily. 19 20 00:01:49,050 --> 00:01:53,850 Now this is very very easily done using Bootstrap. 20 21 00:01:54,130 --> 00:02:00,550 And this is one of the biggest reasons why people like using Bootstrap. It’s because it makes creating 21 22 00:02:00,550 --> 00:02:04,240 responsive web sites very very easy. 22 23 00:02:04,270 --> 00:02:11,880 Now, a lot of people think that responsive means it's fast, or it loads up quickly, but it actually doesn't. 23 24 00:02:11,920 --> 00:02:18,830 It means that the web site responds to the size of the screen or the viewport. 24 25 00:02:19,030 --> 00:02:25,870 So that means that it looks slightly different when it's on iPad or when it's on desktop or versus when 25 26 00:02:25,870 --> 00:02:27,490 it's on mobile. 26 27 00:02:27,490 --> 00:02:34,630 So let's take a look at how we can implement this super easily using Bootstrap, so that we can use it 27 28 00:02:34,630 --> 00:02:37,830 for our web site’s layout. And, more specifically, 28 29 00:02:37,850 --> 00:02:42,690 I want this title, this big title where it says ‘Meet new and interesting dogs nearby’, 29 30 00:02:42,910 --> 00:02:48,850 plus the two download buttons, to show up on the left side of the screen, taking up roughly half of the 30 31 00:02:48,850 --> 00:02:49,560 screen. 31 32 00:02:49,690 --> 00:02:57,040 And then I want this mobile phone image to take up the right 50 percent of the screen. And then when 32 33 00:02:57,040 --> 00:03:03,370 it goes down to maybe, say, iPhone sized, for everything to be stacked up one on top of each other taking 33 34 00:03:03,370 --> 00:03:05,110 up 100 percent of the width. 34 35 00:03:05,110 --> 00:03:07,620 Now let's load up the documentation for this. 35 36 00:03:07,630 --> 00:03:14,110 So if you go into Documentation, and then Layout, and then we're going to go into Grid to look at the 36 37 00:03:14,110 --> 00:03:24,190 grid system. And you can see that we can create these columns as easily as by using some divs and specifying 37 38 00:03:24,220 --> 00:03:25,940 a few Bootstrap classes. 38 39 00:03:25,960 --> 00:03:31,270 So let's see that in action by launching a new Code Ply. 39 40 00:03:31,600 --> 00:03:37,300 And I want you to follow along with me just so that you can mess around with the code and really fully 40 41 00:03:37,300 --> 00:03:39,010 understand what's going on. 41 42 00:03:39,010 --> 00:03:44,620 So, the first thing I'm going to do is I'm going to change our framework to Bootstrap 4, and at some 42 43 00:03:44,620 --> 00:03:50,190 point in the future, once a lot of people begin using Bootstrap 4, it will become the default selection, 43 44 00:03:50,200 --> 00:03:54,850 so you might not have to do this step. But for now there's still a lot of people who haven't learnt this 44 45 00:03:54,850 --> 00:03:57,060 new framework and the rules for it, 45 46 00:03:57,130 --> 00:04:03,040 so you might see that the default might be Bootstrap 3. But we are going to sit at the bleeding edge 46 47 00:04:03,100 --> 00:04:04,120 of technology, 47 48 00:04:04,180 --> 00:04:08,680 so that is why we’ll always be using the latest version of Bootstrap in our course. 48 49 00:04:08,800 --> 00:04:13,300 So, the first thing we're going to do is, we're going to create a new div, and we're going to give it a 49 50 00:04:13,300 --> 00:04:15,880 class of row. 50 51 00:04:16,330 --> 00:04:23,580 Now, inside this div I'm going to create another div, and this one will have a class of column. 51 52 00:04:23,590 --> 00:04:30,490 Now I'm also going to add some inline styles, just so that we can see it more clearly when it gets rendered 52 53 00:04:30,550 --> 00:04:34,930 on screen, and we can differentiate it from other columns or other rows. 53 54 00:04:35,140 --> 00:04:44,450 So I'm just going to set the background color to red, and then we'll give it a border of 1 pixel solid. 54 55 00:04:44,500 --> 00:04:50,920 So now let's close off that div, and of course remember that divs don't appear unless they have some 55 56 00:04:50,920 --> 00:04:51,920 content. 56 57 00:04:52,120 --> 00:04:57,990 So, we're just going to give it the name of this class, which is the column that we used. 57 58 00:04:58,210 --> 00:05:05,840 So now, if we hit run, you’ll see that I have this full width column that is taking up the entire 58 59 00:05:05,840 --> 00:05:08,720 width of the screen. 59 60 00:05:08,720 --> 00:05:11,290 So I have basically a single row. 60 61 00:05:11,300 --> 00:05:19,010 Now the interesting thing about this class column is that it will divide up the row to as many sections 61 62 00:05:19,040 --> 00:05:22,810 as it needs in order to equally distribute all of the columns. 62 63 00:05:22,820 --> 00:05:33,080 So that means that, if I have two divs that are both class equals column, then they will both only take 63 64 00:05:33,080 --> 00:05:35,330 up 50 percent of the screen. 64 65 00:05:35,660 --> 00:05:44,800 And equally, if I add a third one, then each of these column divs will take up a third of that row width. 65 66 00:05:44,810 --> 00:05:50,580 Now what if I wanted a column that only took up half of the width of the screen? 66 67 00:05:50,840 --> 00:05:58,520 So, you might think that, OK, the way to do this is to delete that third div so that we have two column 67 68 00:05:58,520 --> 00:06:01,610 divs resting side by side in the same row. 68 69 00:06:01,820 --> 00:06:03,080 Well, you might think that, 69 70 00:06:03,110 --> 00:06:09,660 OK, you could probably use some CSS and, you know, make this div appear white or not there. 70 71 00:06:09,730 --> 00:06:12,740 Well, there's actually a much much easier way using Bootstrap. 71 72 00:06:12,890 --> 00:06:18,560 So, let's create a new row, just so that we can keep a reference to this and we can see it on screen. 72 73 00:06:18,800 --> 00:06:24,980 So again, we're going to create a new div with the class ‘row’, and inside here I'm going to create a div 73 74 00:06:25,340 --> 00:06:30,700 that has a class called col-6. 74 75 00:06:30,770 --> 00:06:35,410 And again I'm going to basically add the same style, so background color, 75 76 00:06:35,870 --> 00:06:37,950 and this one I'm going to make green, 76 77 00:06:38,240 --> 00:06:47,110 and then again border, one pixel solid, and I'm going to close off that div. And inside here I'm going 77 78 00:06:47,110 --> 00:06:51,960 to call this col-6, so that we can see it when we run it. 78 79 00:06:52,030 --> 00:06:59,020 Now, you’ll notice that in this case, my column only takes up 50 percent of the width of the screen without 79 80 00:06:59,020 --> 00:07:06,250 the need for anything else on the right. And the cool thing about this is that you can use a number to 80 81 00:07:06,250 --> 00:07:14,810 specify how much of the row do you want to take up. And the total for a single row is 12. 81 82 00:07:14,830 --> 00:07:24,730 So that means that if you add a div that has a number, say col-3, then it will only take up a 82 83 00:07:24,730 --> 00:07:26,090 quarter of the screen. 83 84 00:07:26,110 --> 00:07:33,790 So, remember, 12 divided by 3 equals 4, right? So col-3 only takes up 3 units inside 12 84 85 00:07:33,790 --> 00:07:34,330 units, 85 86 00:07:34,330 --> 00:07:40,810 so therefore it's only a quarter of the screen. And you can repeat this code so that you actually fill 86 87 00:07:40,810 --> 00:07:41,530 up the row. 87 88 00:07:41,530 --> 00:07:45,020 So, for example, you could have a col-2, 88 89 00:07:45,190 --> 00:07:48,540 so that's a sixth of the row, 89 90 00:07:48,880 --> 00:07:55,930 and then you could have something like a col-1, right, go all the way down to the smallest unit, 90 91 00:07:56,410 --> 00:07:59,870 which means this is a twelfth of the row. 91 92 00:08:00,010 --> 00:08:04,310 And now with the 6 plus 3 plus 2 plus 1, we get 12. 92 93 00:08:04,420 --> 00:08:07,810 And so now we fill up the entire width of the row. 93 94 00:08:07,820 --> 00:08:14,440 Now, that's all very well and good, but the only problem with this is that, as you change the size of the 94 95 00:08:14,440 --> 00:08:15,040 viewport, 95 96 00:08:15,070 --> 00:08:24,170 say if we go down to a tablet size or a mobile size, none of these columns change in width. 96 97 00:08:24,340 --> 00:08:31,360 So what if we want something similar to what AirBnB has? You know, where we can say that maybe on 97 98 00:08:31,360 --> 00:08:39,940 the desktop size we would want four columns, right, taking up equal width, but maybe on iPad we only want 98 99 00:08:39,940 --> 00:08:45,470 three columns and on iPhone we only want two columns. 99 100 00:08:45,470 --> 00:08:47,800 So how can we do that? 100 101 00:08:47,800 --> 00:08:53,950 So let's go ahead and add another row where we add a responsive column. 101 102 00:08:54,220 --> 00:08:59,600 So I'm going to create a div that is going to have a class of row. 102 103 00:08:59,620 --> 00:09:07,660 So all of these columns use the div class row. And then I'm going to add a div that has a different class 103 104 00:09:08,110 --> 00:09:14,300 and this class is going to be col-md-6. 104 105 00:09:14,440 --> 00:09:19,020 And then I'm just going to paste in our style over here. 105 106 00:09:19,970 --> 00:09:25,670 And I'm going to change the color to blue just so that we can see the difference. And we're going to 106 107 00:09:25,670 --> 00:09:30,370 close off that div, and I'm going to call this col-md-6. 107 108 00:09:30,530 --> 00:09:35,630 And now, if we run our code, you can see that, similar to the col-6, 108 109 00:09:35,630 --> 00:09:41,660 this col-md-6 also takes up 6 units, so half of the screen. 109 110 00:09:41,840 --> 00:09:49,160 But, say if I add another div, you can see that we've got two columns inside our row currently, the blue 110 111 00:09:49,160 --> 00:09:50,050 ones, 111 112 00:09:50,150 --> 00:09:59,870 but, if I switch to a smartphone size, you can see that they each now take up 100 percent of the width 112 113 00:10:00,170 --> 00:10:01,350 of the screen. 113 114 00:10:01,580 --> 00:10:05,350 But on tablet they still take up half of the width. 114 115 00:10:05,360 --> 00:10:14,780 So what this col-md-6 means is that we should have a 6 unit column on any size from medium 115 116 00:10:14,780 --> 00:10:17,430 size or tablet size upwards. 116 117 00:10:17,480 --> 00:10:25,640 So that means tablet, laptop, large desktop, they all will take up six units, but anything smaller than the medium 117 118 00:10:25,640 --> 00:10:28,370 size, namely on mobile, 118 119 00:10:28,580 --> 00:10:30,580 they will take up the full width. 119 120 00:10:30,620 --> 00:10:39,020 So let's delete these two divs in the non-responsive sort of section, and let's change this to a 120 121 00:10:39,020 --> 00:10:40,000 col-6, 121 122 00:10:40,040 --> 00:10:43,570 so we now basically have two 6 column divs. 122 123 00:10:43,580 --> 00:10:49,130 Now let's change this blue, actually, to a yellow, because I think it’ll make the text a little bit more 123 124 00:10:49,130 --> 00:10:52,830 visible, so that you can see it slightly easier. 124 125 00:10:53,060 --> 00:10:57,150 Now, you can see that we've got essentially the same thing in three rows, right? 125 126 00:10:57,170 --> 00:11:04,610 These two are two columns that are taking up 50 percent of the width each, because the entire row has to take 126 127 00:11:04,610 --> 00:11:06,080 up 100 percent. 127 128 00:11:06,080 --> 00:11:12,620 Now the second one, each column is only taking up 6 units, but it's non-responsive. 128 129 00:11:12,770 --> 00:11:19,900 And the third one, each column is only taking up 6 units, as long as it's tablet sized or larger. 129 130 00:11:20,090 --> 00:11:22,340 So let's switch to the laptop size. 130 131 00:11:22,340 --> 00:11:23,980 You can see there's no difference. 131 132 00:11:24,170 --> 00:11:31,550 But now let's switch to the smartphone size, and you can see that the third type of columns actually 132 133 00:11:31,550 --> 00:11:32,550 are responsive. 133 134 00:11:32,570 --> 00:11:39,800 So you can use this code and play around with it to see the difference by specifying that medium keyword 134 135 00:11:39,860 --> 00:11:41,250 and not doing so. 135 136 00:11:41,270 --> 00:11:46,130 Now what if you wanted to be more specific than that? 136 137 00:11:46,330 --> 00:11:49,700 What if you wanted to recreate the AirBnB experience, 137 138 00:11:49,700 --> 00:11:59,500 so you have four items per row, or four columns rather, on desktop, but then on tablet to only have three, 138 139 00:11:59,690 --> 00:12:03,270 and then on mobile to only have two? 139 140 00:12:03,320 --> 00:12:06,870 How would you do that using Bootstrap? 140 141 00:12:07,070 --> 00:12:12,780 Well, let's modify our third row so that we have something that works in a similar way. 141 142 00:12:12,890 --> 00:12:16,010 So the first thing is that we need four divs to play around with. 142 143 00:12:16,010 --> 00:12:24,620 So I'm going to add another two divs to the bottom, and now we have four divs that are in this responsive 143 144 00:12:24,830 --> 00:12:25,820 kind of mode. 144 145 00:12:25,910 --> 00:12:34,340 Let's start from the simplest, which is I want there to be four columns on desktop, so 12 divided by 145 146 00:12:34,340 --> 00:12:35,950 4 is 3, 146 147 00:12:35,960 --> 00:12:46,050 so we need a 3 unit column. And we can specify this by changing the keyword to large. 147 148 00:12:46,130 --> 00:12:51,450 So now we have col-lg-3. 148 149 00:12:51,620 --> 00:12:57,460 And if you run that you can see that we've got a 3 unit column on desktop. 149 150 00:12:57,500 --> 00:13:05,360 So let's go ahead and change all of the other divs to this kind of format. 150 151 00:13:05,900 --> 00:13:14,690 So, if we run now, you'll see that we have four columns, each taking up three units on desktop, but anything 151 152 00:13:14,690 --> 00:13:18,550 smaller than desktop, they will take up 100 percent of the width. 152 153 00:13:18,680 --> 00:13:22,640 So on tablet and on mobile they will take up 100 percent. 153 154 00:13:22,820 --> 00:13:24,550 So that's not quite what we want, 154 155 00:13:24,560 --> 00:13:30,460 because on tablet we want it to take up a third of the row. 155 156 00:13:30,710 --> 00:13:34,420 So 12 divided by 3 is 4. 156 157 00:13:35,090 --> 00:13:42,020 So let's add another rule in here where we say on the medium sized screens and above, we want to have 157 158 00:13:42,110 --> 00:13:44,580 a 4 unit column. 158 159 00:13:44,840 --> 00:13:53,430 So now let's again replace all of these other divs with this new format. 159 160 00:13:53,600 --> 00:14:03,110 And, if we run our code, you'll see that, on the tablet size, each of these columns now take up four units 160 161 00:14:03,260 --> 00:14:10,280 when we're on the tablet or the medium size, and on desktop it goes to that col-lg-3 rule 161 162 00:14:10,580 --> 00:14:12,950 and becomes a three unit column, 162 163 00:14:12,950 --> 00:14:17,550 and similarly on the large desktop it's also the same. 163 164 00:14:17,600 --> 00:14:19,730 Now what about mobile? 164 165 00:14:19,820 --> 00:14:27,140 Well it's still taking up 100 percent of the width, unless we specify another class. 165 166 00:14:27,140 --> 00:14:33,530 So, on the smaller size screen, we want each column to take up only 50 percent of the width, so that we 166 167 00:14:33,530 --> 00:14:39,620 end up with two columns per row. So two columns per row means 12 divided by 2. 167 168 00:14:39,620 --> 00:14:42,520 So that's a six unit column. 168 169 00:14:42,890 --> 00:14:53,450 So let's add this to our text and let's delete these three other divs so that we can make a copy of 169 170 00:14:53,450 --> 00:14:55,030 this first one 170 171 00:14:56,490 --> 00:14:58,470 and paste it in. 171 172 00:14:58,470 --> 00:15:03,790 So we now have four divs which take up a quarter of the width 172 173 00:15:04,080 --> 00:15:14,160 when we're on the desktop size or larger, but only a third of the width when we're on tablet, and only 173 174 00:15:14,190 --> 00:15:17,510 half of the width when we're on mobile. 174 175 00:15:17,640 --> 00:15:23,020 So you can see that when we're on tablet, because we can't fit all four of these on the same row, it 175 176 00:15:23,030 --> 00:15:26,630 actually pushes it to the next row automatically. 176 177 00:15:26,640 --> 00:15:29,620 Now there's a lot of new ideas in this lesson, 177 178 00:15:29,670 --> 00:15:36,240 and in order to really fully understand this concept, you will need to have a play around with the code 178 179 00:15:36,330 --> 00:15:37,350 yourself. 179 180 00:15:37,380 --> 00:15:45,000 So, as a challenge, I want you to create another set of responsive columns, but this one is going to have 180 181 00:15:45,000 --> 00:15:48,300 slightly different rules from the previous row. 181 182 00:15:48,330 --> 00:15:53,500 So, if you already followed along with the code, you should have your own version of this Code Ply. 182 183 00:15:53,520 --> 00:15:59,190 Now, if you haven't, I'm going to include a link in the resources for this section, so that you can open up the 183 184 00:15:59,190 --> 00:16:07,530 Code Ply, and you can copy the code in my HTML section, and paste it to your own Code Ply. 184 185 00:16:07,530 --> 00:16:15,330 Now, what I want you to do is to create another row below these three, and you can give it a different 185 186 00:16:15,360 --> 00:16:16,270 color. 186 187 00:16:16,290 --> 00:16:20,880 Now, it doesn't matter what you choose, as long as you can see the difference from the previous rows. 187 188 00:16:20,880 --> 00:16:26,550 Now, for this particular set of columns, I want you to make it responsive. 188 189 00:16:26,550 --> 00:16:28,690 So on the larger sizes, 189 190 00:16:28,710 --> 00:16:35,920 so desktop and also on laptop, you should have six columns per row. 190 191 00:16:35,970 --> 00:16:45,600 Now, on tablet you should only have four columns per row, and on mobile they should each take up 100 percent 191 192 00:16:45,630 --> 00:16:46,450 of the width. 192 193 00:16:46,680 --> 00:16:51,330 So, pause the video now and see if you can complete this challenge. 193 194 00:16:51,330 --> 00:16:51,720 All right. 194 195 00:16:51,720 --> 00:16:53,740 So how did that go? 195 196 00:16:54,090 --> 00:16:59,420 Well, in order to complete the challenge, you really need to understand how the grid system works. 196 197 00:16:59,550 --> 00:17:07,760 And, if you get stuck, always remember that there's always the documentation to go back to. 197 198 00:17:07,890 --> 00:17:11,760 Now, once you've read that and it all makes sense, then we can get started. 198 199 00:17:11,910 --> 00:17:18,000 So, we're going to create another div, of course, and this will be the row which is going to contain our 199 200 00:17:18,000 --> 00:17:25,370 columns, and inside this row we're going to create a new column. 200 201 00:17:25,560 --> 00:17:31,800 Now here we have to think carefully. What we want is that, on the larger sizes, 201 202 00:17:31,800 --> 00:17:40,740 so on the laptop and desktop, we want there to be a two unit column, because it's going to take up a sixth 202 203 00:17:41,130 --> 00:17:42,240 of the width. 203 204 00:17:42,510 --> 00:17:46,830 So that's going to be col-lg-2. 204 205 00:17:46,920 --> 00:17:53,670 Now, the other thing we want to happen is that, on the medium sizes, on the tablet size and above, we want 205 206 00:17:53,670 --> 00:18:02,800 to have a three unit column, so that's col-md-3, because 12 divided by 3 is 4, 206 207 00:18:02,880 --> 00:18:06,780 so that's four columns per row, which is what we wanted. 207 208 00:18:06,930 --> 00:18:14,310 Now, for the smaller size, you can either say col-sm-12 for the columns to take up the full 208 209 00:18:14,310 --> 00:18:20,670 100 percent of the width, or you can actually leave that out because by default all of the columns 209 210 00:18:20,730 --> 00:18:23,620 should take up 100 percent of the width. 210 211 00:18:23,670 --> 00:18:32,300 So, now that we've got our classes, let's add in our style so that we can see it and make it more visible. 211 212 00:18:32,310 --> 00:18:35,770 So, in this case I'm going to change my background color to grey. 212 213 00:18:35,880 --> 00:18:38,340 Now it doesn't really matter what you choose. 213 214 00:18:38,430 --> 00:18:45,720 And then I'm going to add the text here into my div, so that my div actually shows up, because it has 214 215 00:18:45,780 --> 00:18:48,800 some content rather than just style. 215 216 00:18:49,050 --> 00:18:51,290 So now let's hit run. 216 217 00:18:52,140 --> 00:18:56,150 And we've now got this column that takes up a sixth of the width. 217 218 00:18:56,160 --> 00:19:03,510 Now, in order to make that a little bit more visible, I'm going to copy this and paste in another five copies, 218 219 00:19:04,170 --> 00:19:12,080 and we can count that there's now six columns in our row on the laptop and on the desktop sizes. 219 220 00:19:13,170 --> 00:19:19,530 Now, the next step to check is what happens on tablet. And you can see the rule of col-md-3 220 221 00:19:19,530 --> 00:19:27,570 means that we have three unit columns, so 12 divide by 3 is 4 columns per row on the tablet 221 222 00:19:27,570 --> 00:19:34,950 size, and on the mobile size we have 100 percent of the width, because we've only specified that anything 222 223 00:19:35,010 --> 00:19:41,430 above medium should be 3 units, and anything below automatically becomes 100 percent. 223 224 00:19:41,430 --> 00:19:46,100 So, if you didn't manage to get it, create it now, and see if it makes sense. 224 225 00:19:46,140 --> 00:19:53,400 And also just mess around with the layout, you know, try to make a row that has, maybe, 12 items on large 225 226 00:19:53,400 --> 00:20:00,260 sizes, or, maybe, only six items on the smaller mobile screen. 226 227 00:20:00,420 --> 00:20:07,130 But basically, the key to understanding this is trying to get the code to do what you want it to, 227 228 00:20:07,230 --> 00:20:11,020 and that way you'll understand how all of these classes work. 228 229 00:20:11,370 --> 00:20:16,750 And if you get confused, there's always the grid system documentation to fall back on.