All language subtitles for 194 Building a Tabbed Component.en_US1

af Afrikaans
ak Akan
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bem Bemba
bn Bengali
bh Bihari
bs Bosnian
br Breton
bg Bulgarian
km Cambodian
ca Catalan
ceb Cebuano
chr Cherokee
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
ee Ewe
fo Faroese
tl Filipino
fi Finnish
fr French
fy Frisian
gaa Ga
gl Galician
ka Georgian
de German
el Greek
gn Guarani
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian Download
is Icelandic
ig Igbo
id Indonesian
ia Interlingua
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
rw Kinyarwanda
rn Kirundi
kg Kongo
ko Korean
kri Krio (Sierra Leone)
ku Kurdish
ckb Kurdish (Soranî)
ky Kyrgyz
lo Laothian
la Latin
lv Latvian
ln Lingala
lt Lithuanian
loz Lozi
lg Luganda
ach Luo
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mfe Mauritian Creole
mo Moldavian
mn Mongolian
my Myanmar (Burmese)
sr-ME Montenegrin
ne Nepali
pcm Nigerian Pidgin
nso Northern Sotho
no Norwegian
nn Norwegian (Nynorsk)
oc Occitan
or Oriya
om Oromo
ps Pashto
fa Persian
pl Polish
pt-BR Portuguese (Brazil)
pt Portuguese (Portugal)
pa Punjabi
qu Quechua
ro Romanian
rm Romansh
nyn Runyakitara
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
sh Serbo-Croatian
st Sesotho
tn Setswana
crs Seychellois Creole
sn Shona
sd Sindhi
si Sinhalese
sk Slovak
sl Slovenian
so Somali
es Spanish
es-419 Spanish (Latin American)
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
tt Tatar
te Telugu
th Thai
ti Tigrinya
to Tonga
lua Tshiluba
tum Tumbuka
tr Turkish
tk Turkmen
tw Twi
ug Uighur
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
wo Wolof
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 00:00:01,410 --> 00:00:03,510 In this video we're gonna implement 2 00:00:03,510 --> 00:00:08,510 a very popular component which is a tabbed component. 3 00:00:08,550 --> 00:00:10,500 And you will see tabbed components 4 00:00:10,500 --> 00:00:12,870 on many websites these days. 5 00:00:12,870 --> 00:00:16,163 So it's great to learn how to build one yourself. 6 00:00:17,850 --> 00:00:19,940 So the component that we're gonna build 7 00:00:19,940 --> 00:00:22,650 in this video is this one. 8 00:00:22,650 --> 00:00:26,660 Now a tabbed component can appear in many different ways, 9 00:00:26,660 --> 00:00:28,440 but what they all have in common 10 00:00:28,440 --> 00:00:32,210 is that they have some kind of tabs like this here. 11 00:00:32,210 --> 00:00:33,630 And when you clicked it up 12 00:00:33,630 --> 00:00:38,380 then the content of this area below will change. 13 00:00:38,380 --> 00:00:42,770 And so that's exactly what happens here with these buttons. 14 00:00:42,770 --> 00:00:45,360 So basically these three are our tabs. 15 00:00:45,360 --> 00:00:47,930 And then as we click on one of the tabs, 16 00:00:47,930 --> 00:00:50,850 it will reveal the associated content. 17 00:00:50,850 --> 00:00:55,170 So a little bit like tabs here in our browser, right? 18 00:00:55,170 --> 00:00:58,810 So each browser tab has its own webpage. 19 00:00:58,810 --> 00:01:03,370 And so here each tab has its own content area, basically. 20 00:01:03,370 --> 00:01:06,130 So I'm sure you've seen this on other websites 21 00:01:06,130 --> 00:01:09,653 and so let's now go ahead and implement this ourselves. 22 00:01:10,808 --> 00:01:13,940 Okay, now for this component, 23 00:01:13,940 --> 00:01:16,713 we actually need a bunch of HTML. 24 00:01:18,040 --> 00:01:20,780 So let's first take a look at that. 25 00:01:20,780 --> 00:01:22,690 So the whole tabbed component 26 00:01:22,690 --> 00:01:25,423 in our case is called operations. 27 00:01:26,480 --> 00:01:28,253 So let's scroll down here also. 28 00:01:29,950 --> 00:01:33,100 And so this section here is about the operations 29 00:01:33,100 --> 00:01:34,940 we can do on a bank account 30 00:01:34,940 --> 00:01:38,153 and therefore this component here is called operations. 31 00:01:39,040 --> 00:01:42,040 And you can also see that here on the page. 32 00:01:42,040 --> 00:01:45,740 Then we have a the tab container basically. 33 00:01:45,740 --> 00:01:47,143 So that's this element. 34 00:01:49,000 --> 00:01:51,090 And so you can also see it here again 35 00:01:51,090 --> 00:01:54,630 and it's the element which will contain the three tabs. 36 00:01:54,630 --> 00:01:57,680 And so each tab is itself a button 37 00:01:57,680 --> 00:02:02,680 and it has this class of operations tab, okay? 38 00:02:02,810 --> 00:02:05,163 Then below that we have the content. 39 00:02:07,100 --> 00:02:10,100 And in fact, we have three contents. 40 00:02:10,100 --> 00:02:14,463 So we have one content element here for each of the tabs. 41 00:02:15,579 --> 00:02:17,920 All right, so the first one here as you see 42 00:02:17,920 --> 00:02:20,950 is called operations-content-1 43 00:02:20,950 --> 00:02:23,550 then the other one is operations-content-2 44 00:02:23,550 --> 00:02:25,810 and operations-content-3. 45 00:02:25,810 --> 00:02:28,320 So as we click on one of these tabs, 46 00:02:28,320 --> 00:02:30,910 we will not create any new content. 47 00:02:30,910 --> 00:02:35,293 What we will do instead is to hide the other tabs basically. 48 00:02:36,540 --> 00:02:39,530 So you see that right now this first one here 49 00:02:39,530 --> 00:02:43,000 has the operations content active class. 50 00:02:43,000 --> 00:02:45,080 And so therefore this one is visible 51 00:02:45,080 --> 00:02:46,723 and all the others are hidden. 52 00:02:48,010 --> 00:02:50,900 And what's also important here is that 53 00:02:52,640 --> 00:02:56,350 these buttons here, they have this data tab attribute. 54 00:02:56,350 --> 00:02:58,170 And so this one is number one 55 00:02:58,170 --> 00:03:01,990 and this will then be associated with this class name here. 56 00:03:01,990 --> 00:03:05,310 So operations content and then again one 57 00:03:05,310 --> 00:03:07,370 but more about that in a minute 58 00:03:07,370 --> 00:03:10,040 when we actually implement this ourselves. 59 00:03:10,040 --> 00:03:11,920 So for now we just need to get down 60 00:03:11,920 --> 00:03:14,770 the basic structure of the HTML here. 61 00:03:14,770 --> 00:03:17,940 And it might be a good idea for you to pause the video 62 00:03:17,940 --> 00:03:21,250 and take a minute or two to get yourself familiar 63 00:03:21,250 --> 00:03:23,140 with this HTML structure 64 00:03:23,140 --> 00:03:27,780 and all of the class names that are involved here, okay? 65 00:03:27,780 --> 00:03:30,480 And you can even take a look at the CSS 66 00:03:31,540 --> 00:03:36,000 because there's also a lot of CSS involved here, all right? 67 00:03:37,300 --> 00:03:40,050 So of course I couldn't write all of this code here 68 00:03:40,050 --> 00:03:44,053 together with you now, because that would take way too long. 69 00:03:45,880 --> 00:03:47,360 All right, but anyway 70 00:03:47,360 --> 00:03:49,783 let's not build this tabbed component here. 71 00:03:53,620 --> 00:03:57,160 And we're gonna start by selecting the tabs, okay? 72 00:03:57,160 --> 00:04:00,510 And that will keep the elements here open 73 00:04:00,510 --> 00:04:02,923 so we can see it at all time. 74 00:04:04,160 --> 00:04:05,450 And so you'll see that the buttons 75 00:04:05,450 --> 00:04:08,483 they have the class operations tab. 76 00:04:10,590 --> 00:04:14,267 So tabs=documents.querySelectorAll 77 00:04:17,989 --> 00:04:21,239 and then with the class operations_tab. 78 00:04:25,920 --> 00:04:29,110 Then let's also select the tabs container 79 00:04:36,217 --> 00:04:38,967 and so that is this element here. 80 00:04:41,170 --> 00:04:42,970 Let's actually go ahead and copy it. 81 00:04:46,820 --> 00:04:49,623 And finally, also the three content areas. 82 00:04:50,900 --> 00:04:55,900 So that's here, operations content. 83 00:04:56,830 --> 00:05:00,200 You see I cannot copy it for some reason. 84 00:05:00,200 --> 00:05:01,100 It doesn't matter. 85 00:05:03,430 --> 00:05:07,583 So a tabs content is document.querySelectorAll. 86 00:05:10,070 --> 00:05:12,443 So because again, we have three of them. 87 00:05:17,950 --> 00:05:21,920 All right, so we have our selections nicely done 88 00:05:21,920 --> 00:05:26,020 and now we can actually work on the functionality 89 00:05:26,020 --> 00:05:28,470 and let's start by adding event handlers 90 00:05:28,470 --> 00:05:31,340 to these buttons here, right? 91 00:05:31,340 --> 00:05:34,640 Because that is the action that we actually want to handle 92 00:05:34,640 --> 00:05:36,320 in this component. 93 00:05:36,320 --> 00:05:38,740 So we could do it like this. 94 00:05:38,740 --> 00:05:41,990 So taking all the tabs and then on each of them 95 00:05:41,990 --> 00:05:43,783 we could attach an event handler. 96 00:05:45,570 --> 00:05:47,073 So for example, like this. 97 00:05:47,960 --> 00:05:51,740 So for each, because we want to do it on each of them, 98 00:05:51,740 --> 00:05:56,740 so we get then each tab and then tab.addEventListener click. 99 00:06:00,840 --> 00:06:03,140 And let's just use a quick arrow function here 100 00:06:04,800 --> 00:06:07,483 because this is really just a demonstration. 101 00:06:11,890 --> 00:06:13,600 Well, nothing happens. 102 00:06:13,600 --> 00:06:15,453 Let's try to reload this page. 103 00:06:17,250 --> 00:06:21,490 Yeah indeed, now we get the tab locked to the console. 104 00:06:21,490 --> 00:06:25,640 Now, however, as we already learned in the last video 105 00:06:25,640 --> 00:06:28,570 doing this here is a bad practice 106 00:06:28,570 --> 00:06:32,180 because what if we had like 200 tabs? 107 00:06:32,180 --> 00:06:34,080 Then we would have 200 copies 108 00:06:34,080 --> 00:06:36,610 of this exact callback function here 109 00:06:36,610 --> 00:06:39,290 and that would simply slow down the page. 110 00:06:39,290 --> 00:06:41,890 So that's not at all desirable. 111 00:06:41,890 --> 00:06:44,520 And so let's get rid of this 112 00:06:44,520 --> 00:06:47,870 and one more time, use events delegation. 113 00:06:47,870 --> 00:06:50,270 And remember that for event delegation, 114 00:06:50,270 --> 00:06:52,320 we need to attach the event handler 115 00:06:52,320 --> 00:06:54,140 on the common parent element 116 00:06:54,140 --> 00:06:57,040 of all the elements that we're interested in. 117 00:06:57,040 --> 00:07:01,563 And in our case, that is this tabs container, right? 118 00:07:02,930 --> 00:07:04,383 So we have our buttons here. 119 00:07:06,700 --> 00:07:09,220 So right here or buttons 120 00:07:09,220 --> 00:07:11,370 and a common parent of all of them 121 00:07:11,370 --> 00:07:15,320 is this tab container that we already selected previously. 122 00:07:15,320 --> 00:07:18,160 And so let's attach our event handler 123 00:07:18,160 --> 00:07:19,803 to that element instead. 124 00:07:21,190 --> 00:07:25,497 So tabsContainer.AddEventListener, click, 125 00:07:29,830 --> 00:07:31,410 we need the event of course, 126 00:07:31,410 --> 00:07:34,630 so that we can figure out where the click happened. 127 00:07:34,630 --> 00:07:36,740 And so let's now actually work on 128 00:07:36,740 --> 00:07:39,660 or matching strategy, okay? 129 00:07:39,660 --> 00:07:43,580 So we already know that we are interested in the buttons. 130 00:07:43,580 --> 00:07:46,803 And so let's now figure out which button was clicked. 131 00:07:47,650 --> 00:07:50,260 So let's actually create an element called clicked 132 00:07:51,420 --> 00:07:53,593 that we can then use to work with. 133 00:07:54,810 --> 00:07:56,683 And so what about this? 134 00:07:57,700 --> 00:08:00,713 So what about simply using the e.target? 135 00:08:01,730 --> 00:08:02,723 Well, let's see. 136 00:08:06,570 --> 00:08:10,920 So in our console, let's now click somewhere here 137 00:08:10,920 --> 00:08:15,920 and indeed now we got the button that was clicked, okay? 138 00:08:16,030 --> 00:08:17,600 However, there is a problem 139 00:08:17,600 --> 00:08:19,900 when we click here on this number. 140 00:08:19,900 --> 00:08:22,660 So you see that now we did not get a button 141 00:08:22,660 --> 00:08:24,733 but we got this spin element. 142 00:08:25,650 --> 00:08:27,840 And that's because inside of this button, 143 00:08:27,840 --> 00:08:30,120 we actually have another element. 144 00:08:30,120 --> 00:08:31,730 And so now, even though 145 00:08:31,730 --> 00:08:34,760 it looked like we clicked on the button here 146 00:08:34,760 --> 00:08:36,580 or here for example, 147 00:08:36,580 --> 00:08:41,450 actually we are clicking on this span element, right? 148 00:08:41,450 --> 00:08:44,280 So we are not actually clicking on the button, 149 00:08:44,280 --> 00:08:46,680 but we still need the button. 150 00:08:46,680 --> 00:08:49,550 So no matter if we click on this button itself 151 00:08:49,550 --> 00:08:51,430 or here on the span element 152 00:08:51,430 --> 00:08:54,090 we actually need the button element itself 153 00:08:54,090 --> 00:08:55,670 because from that button 154 00:08:55,670 --> 00:08:59,410 we will need to read this data tab attribute here 155 00:08:59,410 --> 00:09:01,400 because as I mentioned earlier, 156 00:09:01,400 --> 00:09:03,640 this one contains the number of the tab 157 00:09:03,640 --> 00:09:05,530 that should become visible. 158 00:09:05,530 --> 00:09:07,140 And so here this data attribute 159 00:09:07,140 --> 00:09:11,223 becomes really important to store information in the DOM. 160 00:09:12,130 --> 00:09:15,550 So basically we need a way of finding the button element 161 00:09:15,550 --> 00:09:20,053 whenever we click on this span element, right? 162 00:09:20,920 --> 00:09:25,920 Now, one simple way to fix it, 163 00:09:25,990 --> 00:09:28,267 which would not really fix it actually 164 00:09:28,267 --> 00:09:30,830 is to do some DOM traversing 165 00:09:30,830 --> 00:09:34,060 and simply select the parent element. 166 00:09:34,060 --> 00:09:35,910 We can move up the DOM tree 167 00:09:35,910 --> 00:09:39,250 and instead of simply taking a e.target 168 00:09:39,250 --> 00:09:41,890 we can use the parent element of that. 169 00:09:41,890 --> 00:09:43,440 So let's see what happens then. 170 00:09:44,560 --> 00:09:47,010 And so now indeed when we click on the number, 171 00:09:47,010 --> 00:09:48,690 we get the button. 172 00:09:48,690 --> 00:09:52,310 And so again that's because that is the parent element 173 00:09:52,310 --> 00:09:53,850 of that span. 174 00:09:53,850 --> 00:09:55,380 Now the problem appears 175 00:09:55,380 --> 00:09:57,700 when we click on the button itself, 176 00:09:57,700 --> 00:10:00,610 because now of course we will also get the parent 177 00:10:00,610 --> 00:10:02,260 of the button element. 178 00:10:02,260 --> 00:10:04,890 And so that is this container. 179 00:10:04,890 --> 00:10:08,290 But of course that is not what we want. 180 00:10:08,290 --> 00:10:11,140 So basically what we want is to get the button, 181 00:10:11,140 --> 00:10:14,340 no matter if we click here on the span 182 00:10:14,340 --> 00:10:17,000 or on the button itself. 183 00:10:17,000 --> 00:10:19,930 So we need a way of selecting the parent element 184 00:10:19,930 --> 00:10:22,200 that is always a tab. 185 00:10:22,200 --> 00:10:24,520 And can you think of a special method 186 00:10:24,520 --> 00:10:26,953 that we learned previously to do that? 187 00:10:27,850 --> 00:10:32,023 Well, the solution is right here in the previous video. 188 00:10:33,160 --> 00:10:35,313 Well, and that's down here somewhere. 189 00:10:37,200 --> 00:10:41,193 So remember that we want a way of going upwards, 190 00:10:42,310 --> 00:10:45,080 but we want to specify that we want to select 191 00:10:45,080 --> 00:10:46,950 an operations tab. 192 00:10:46,950 --> 00:10:51,770 And so we can use this closest method for exactly that. 193 00:10:51,770 --> 00:10:53,400 So remember that I said 194 00:10:53,400 --> 00:10:56,160 that this method is gonna be really helpful 195 00:10:56,160 --> 00:10:58,070 in event delegation. 196 00:10:58,070 --> 00:10:59,973 And so now that's actually the case. 197 00:11:01,240 --> 00:11:04,700 Okay, so this method makes it really easy for us 198 00:11:04,700 --> 00:11:06,590 to dynamically get the element 199 00:11:06,590 --> 00:11:08,380 that we're interested in. 200 00:11:08,380 --> 00:11:11,570 So here, instead of always selecting the parent element 201 00:11:11,570 --> 00:11:16,570 we will search basically for the closest operations tab. 202 00:11:17,470 --> 00:11:21,833 And so here we need to do the exact same query as that. 203 00:11:23,487 --> 00:11:27,600 All right, and this should actually now fix our problem. 204 00:11:27,600 --> 00:11:30,840 So let's see, when we click the button itself 205 00:11:30,840 --> 00:11:32,370 then we get the button 206 00:11:32,370 --> 00:11:35,950 and when we click the number here so the span, 207 00:11:35,950 --> 00:11:37,640 then we also get the button 208 00:11:37,640 --> 00:11:40,070 because now it finds the closest parent 209 00:11:40,070 --> 00:11:41,340 with this class name, 210 00:11:41,340 --> 00:11:44,550 which indeed is the button itself, so the tab 211 00:11:45,560 --> 00:11:47,540 And here we get to tab number two 212 00:11:47,540 --> 00:11:48,973 as you can see down here. 213 00:11:49,970 --> 00:11:53,633 And here we get tab number three, great. 214 00:11:57,020 --> 00:11:59,100 And let's actually immediately do something 215 00:11:59,100 --> 00:12:01,760 with this select the tab. 216 00:12:01,760 --> 00:12:05,270 So the tab that is currently active here 217 00:12:05,270 --> 00:12:07,230 has a different style as you can see. 218 00:12:07,230 --> 00:12:09,230 So it's a bit moved up. 219 00:12:09,230 --> 00:12:13,200 And so that's because the active tab 220 00:12:13,200 --> 00:12:15,133 basically has this class. 221 00:12:16,220 --> 00:12:17,373 So where's that? 222 00:12:18,240 --> 00:12:21,883 It has this clap of operations tab active. 223 00:12:23,860 --> 00:12:27,650 All right, so we can simply add that 224 00:12:27,650 --> 00:12:30,490 to the element that was just clicked. 225 00:12:30,490 --> 00:12:35,490 So classList.add operations_tab_active, okay? 226 00:12:39,070 --> 00:12:40,590 And now as we click 227 00:12:40,590 --> 00:12:44,140 you see that it activates basically does tab. 228 00:12:44,140 --> 00:12:45,290 Now of course later 229 00:12:45,290 --> 00:12:48,440 then all the other tabs we'll have to move down 230 00:12:48,440 --> 00:12:52,150 but we're gonna take care of that in a second. 231 00:12:52,150 --> 00:12:55,400 Because now watch what happens when we actually click 232 00:12:55,400 --> 00:12:57,710 on the tabs container itself. 233 00:12:57,710 --> 00:12:59,770 So outside of any of the buttons 234 00:12:59,770 --> 00:13:01,780 but still in the tabs container 235 00:13:01,780 --> 00:13:04,863 where this EventListener is actually attached to. 236 00:13:06,270 --> 00:13:09,930 So you see that we get null here 237 00:13:09,930 --> 00:13:12,550 and that's because null is the results 238 00:13:12,550 --> 00:13:14,850 of the closest method here 239 00:13:14,850 --> 00:13:18,740 when there is no matching parent element to be found. 240 00:13:18,740 --> 00:13:22,690 So of course, when we click here in this tabs container 241 00:13:22,690 --> 00:13:27,420 then there is gonna be no parent with this class. 242 00:13:27,420 --> 00:13:30,860 And so therefore, as I just said, we get to null. 243 00:13:30,860 --> 00:13:33,810 And so we need to fix that now in our code 244 00:13:33,810 --> 00:13:38,150 and basically ignore any clicks that happen on that area. 245 00:13:38,150 --> 00:13:41,520 So basically ignore any clicks 246 00:13:41,520 --> 00:13:46,270 where the result is then null, all right? 247 00:13:46,270 --> 00:13:48,460 So we can do that by saying, 248 00:13:48,460 --> 00:13:53,460 if there is no clicked, then return immediately. 249 00:13:55,070 --> 00:13:57,890 And this is something that we haven't done before. 250 00:13:57,890 --> 00:14:01,683 So what I'm doing here is called a guard clause. 251 00:14:04,170 --> 00:14:06,400 So it's basically an if statement 252 00:14:06,400 --> 00:14:10,820 which will return early if some condition is matched. 253 00:14:10,820 --> 00:14:13,720 So in this case, when there's nothing clicked 254 00:14:13,720 --> 00:14:16,950 then we want to immediately finish this function. 255 00:14:16,950 --> 00:14:21,890 And in this case, when we have null which is a faulty value, 256 00:14:21,890 --> 00:14:25,060 then not faulty will become true 257 00:14:25,060 --> 00:14:26,770 and then the function will return 258 00:14:26,770 --> 00:14:30,470 and none of the code that's after it will be executed. 259 00:14:30,470 --> 00:14:33,220 But of course, if clicked does exist 260 00:14:33,220 --> 00:14:35,820 then this return will not be executed 261 00:14:35,820 --> 00:14:40,130 and the rest of the code will be executed just fine. 262 00:14:40,130 --> 00:14:44,083 So this is a more modern way of writing this. 263 00:14:45,380 --> 00:14:47,780 So we could have written instead also, 264 00:14:47,780 --> 00:14:52,230 if there is a clicked on element, then do this. 265 00:14:52,230 --> 00:14:54,300 And this is the more traditional way 266 00:14:54,300 --> 00:14:56,880 as we have been doing it all the time. 267 00:14:56,880 --> 00:14:59,050 But this is actually more modern 268 00:14:59,050 --> 00:15:01,290 because it looks a bit nicer 269 00:15:01,290 --> 00:15:05,470 because we don't need to create all these additional blocks. 270 00:15:05,470 --> 00:15:07,300 So in this case, just this block 271 00:15:07,300 --> 00:15:10,090 but sometimes when we have so many conditions 272 00:15:10,090 --> 00:15:12,550 it can become a little bit confusing. 273 00:15:12,550 --> 00:15:14,860 And then it's a bit cleaner 274 00:15:14,860 --> 00:15:17,320 to simply return the function immediately 275 00:15:17,320 --> 00:15:19,800 if a certain condition is matched. 276 00:15:19,800 --> 00:15:21,130 And again in this case, 277 00:15:21,130 --> 00:15:23,710 whenever there is no clicked element here 278 00:15:23,710 --> 00:15:27,000 then we want to simply return to function right away. 279 00:15:27,000 --> 00:15:29,770 And so then that code here will not be executed 280 00:15:30,760 --> 00:15:34,950 but otherwise, of course it will be executed. 281 00:15:34,950 --> 00:15:36,853 And so that's null see what happens. 282 00:15:39,100 --> 00:15:42,790 So now clicking outside, nothing happens. 283 00:15:42,790 --> 00:15:44,930 Of course, we still get to the null here 284 00:15:44,930 --> 00:15:46,010 but no error occurs 285 00:15:47,610 --> 00:15:51,270 because null JavaScript is no longer trying to execute 286 00:15:51,270 --> 00:15:54,773 this line of code here, okay? 287 00:15:56,710 --> 00:15:58,566 But now let's actually take care 288 00:15:58,566 --> 00:16:03,040 of basically putting all of these other buttons down 289 00:16:03,040 --> 00:16:04,370 as I was saying. 290 00:16:04,370 --> 00:16:06,130 So when I click one of them, 291 00:16:06,130 --> 00:16:08,640 then the other ones show to move down. 292 00:16:08,640 --> 00:16:13,640 So basically we should remove this class from them, right? 293 00:16:13,800 --> 00:16:15,410 And so the solution to that 294 00:16:15,410 --> 00:16:19,020 is before we add this class here to anyone, 295 00:16:19,020 --> 00:16:22,223 we will simply remove it on all of the tabs. 296 00:16:23,290 --> 00:16:25,142 So we removed them on all. 297 00:16:25,142 --> 00:16:27,950 So that's all the tabs.forEach. 298 00:16:32,380 --> 00:16:35,490 And so each tab I'm simply calling T here. 299 00:16:35,490 --> 00:16:40,463 And then tab.clasList.remove. 300 00:16:43,830 --> 00:16:45,503 And so now that should work, 301 00:16:46,610 --> 00:16:50,040 and yeah, it does, okay? 302 00:16:50,040 --> 00:16:53,490 So this is something that we do quite usually. 303 00:16:53,490 --> 00:16:56,950 So basically clearing the class on all of them 304 00:16:56,950 --> 00:17:00,253 and then only add it afterwards on one of them. 305 00:17:01,290 --> 00:17:06,210 So that's at a comment here, active tab. 306 00:17:06,210 --> 00:17:08,950 But now finally let's actually 307 00:17:08,950 --> 00:17:11,380 activate the content area itself 308 00:17:11,380 --> 00:17:12,990 because that's the main part 309 00:17:12,990 --> 00:17:14,690 that we're actually interested in. 310 00:17:19,140 --> 00:17:21,860 Now remember that the information about 311 00:17:21,860 --> 00:17:24,570 which content area should be displayed 312 00:17:24,570 --> 00:17:27,263 is here in this data attribute. 313 00:17:28,240 --> 00:17:29,744 So let me click again. 314 00:17:29,744 --> 00:17:33,590 And so in this case, we want the tab a number two. 315 00:17:33,590 --> 00:17:36,380 And so that's this number two is encoded here 316 00:17:36,380 --> 00:17:39,510 basically in this data attribute. 317 00:17:39,510 --> 00:17:41,060 So having the number two here 318 00:17:41,060 --> 00:17:44,580 means that we want to select the element 319 00:17:45,510 --> 00:17:50,123 which has the class of operations_content_2, okay? 320 00:17:52,670 --> 00:17:55,100 So let's do that. 321 00:17:55,100 --> 00:17:56,823 Let me grab this here. 322 00:17:57,730 --> 00:17:58,803 So the selector, 323 00:18:01,470 --> 00:18:03,670 and then let's select it. 324 00:18:03,670 --> 00:18:05,790 So document.querySelector. 325 00:18:07,260 --> 00:18:09,770 And now I'm using a template string here, 326 00:18:09,770 --> 00:18:12,470 because of course we don't want to hard code 327 00:18:12,470 --> 00:18:13,670 the number two here 328 00:18:13,670 --> 00:18:15,470 but instead we want to get that 329 00:18:15,470 --> 00:18:18,993 exactly from the data attribute that I just told you. 330 00:18:22,050 --> 00:18:24,630 So let me just show that again to you. 331 00:18:24,630 --> 00:18:26,000 Now we got an error here 332 00:18:26,930 --> 00:18:29,003 but just put something there for now. 333 00:18:30,850 --> 00:18:35,030 So it is called data tab, okay. 334 00:18:35,030 --> 00:18:37,410 And so remember all these attributes 335 00:18:37,410 --> 00:18:41,160 are in the element and then in the dataset property. 336 00:18:41,160 --> 00:18:43,180 So the element that was clicked 337 00:18:43,180 --> 00:18:47,713 is indeed stored in or variable clicked, right? 338 00:18:48,740 --> 00:18:50,550 So every time we click a button, 339 00:18:50,550 --> 00:18:53,920 that button is then stored in the clicked variable 340 00:18:53,920 --> 00:18:58,563 and then .data set.tab. 341 00:18:59,850 --> 00:19:02,300 So that's only the part after the data. 342 00:19:02,300 --> 00:19:04,463 Remember, so it's just tab. 343 00:19:05,680 --> 00:19:07,433 So in this case, it's gonna be two. 344 00:19:08,360 --> 00:19:11,920 And so we already have that now selected 345 00:19:11,920 --> 00:19:15,010 and then we want to add a special class to it. 346 00:19:15,010 --> 00:19:17,570 So that's classList.add 347 00:19:18,990 --> 00:19:21,983 and let's just check out the class that we need to add. 348 00:19:23,440 --> 00:19:25,920 So we can see that here on the first content area 349 00:19:25,920 --> 00:19:27,790 which is already active. 350 00:19:27,790 --> 00:19:31,573 And so the class here is operations content active. 351 00:19:33,330 --> 00:19:37,130 Okay, and one more time you can check out the CSS 352 00:19:37,130 --> 00:19:41,173 to figure out why actually this makes the element active. 353 00:19:42,170 --> 00:19:44,313 And we can quickly do that ourselves. 354 00:19:46,700 --> 00:19:51,700 So here it is actually the active, right? 355 00:19:53,500 --> 00:19:55,300 And so basically what this does 356 00:19:55,300 --> 00:19:57,560 is to change the display property 357 00:19:57,560 --> 00:20:00,160 to something which is not none. 358 00:20:00,160 --> 00:20:03,350 So previously without this active part, 359 00:20:03,350 --> 00:20:06,740 so just operation content makes it display none 360 00:20:06,740 --> 00:20:08,500 which basically hides it. 361 00:20:08,500 --> 00:20:12,270 But then as it becomes active, we give it display grid 362 00:20:12,270 --> 00:20:17,203 and then specify all of these properties down, all right? 363 00:20:18,990 --> 00:20:22,350 So this would actually already been working 364 00:20:22,350 --> 00:20:26,870 just to really see it as a bit better in the console also. 365 00:20:26,870 --> 00:20:31,023 Let's lock this value also to the console, okay? 366 00:20:32,530 --> 00:20:33,633 But let's see. 367 00:20:35,260 --> 00:20:38,423 And indeed it now appeared down here. 368 00:20:39,470 --> 00:20:42,390 Great, so it's no longer hidden. 369 00:20:42,390 --> 00:20:46,930 And indeed we successfully read that value here 370 00:20:46,930 --> 00:20:49,520 from the data tab, which is two. 371 00:20:49,520 --> 00:20:52,640 And the same, it's going to happen here for three. 372 00:20:52,640 --> 00:20:55,550 And so you'll see that's the content number three 373 00:20:55,550 --> 00:20:57,900 also appeared down here. 374 00:20:57,900 --> 00:21:00,740 Now of course this is not quite finished yet 375 00:21:00,740 --> 00:21:03,663 because we want the other ones to be hidden. 376 00:21:04,850 --> 00:21:08,110 So that's the whole idea of this component. 377 00:21:08,110 --> 00:21:10,690 And so basically all we need to do 378 00:21:10,690 --> 00:21:13,870 is to do the same that we did for the tabs. 379 00:21:13,870 --> 00:21:17,510 So basically removing the active class for all of them 380 00:21:17,510 --> 00:21:18,880 before then adding it 381 00:21:18,880 --> 00:21:21,820 to the one that we're interested in, all right? 382 00:21:21,820 --> 00:21:23,893 So basically just what we have here. 383 00:21:25,740 --> 00:21:28,860 So let's select all the contents 384 00:21:29,730 --> 00:21:33,320 and that we actually already have here, right? 385 00:21:33,320 --> 00:21:35,860 So tabs content is also a note list 386 00:21:35,860 --> 00:21:37,563 because of query selector all 387 00:21:37,563 --> 00:21:39,850 that we can now loop over 388 00:21:39,850 --> 00:21:43,003 and then remove that active class from all of them. 389 00:21:45,640 --> 00:21:47,020 So tabsContent.forEach 390 00:21:51,180 --> 00:21:53,433 and I'm just calling it C very short here. 391 00:21:54,570 --> 00:21:56,600 So C for content. 392 00:21:56,600 --> 00:21:58,793 So class list remove. 393 00:22:01,420 --> 00:22:04,770 And so you'll see that it's always the same idea. 394 00:22:04,770 --> 00:22:08,260 So it's all about removing and adding classes 395 00:22:08,260 --> 00:22:13,260 to manipulate the page to look just like we want, all right? 396 00:22:13,490 --> 00:22:16,290 So this comment is actually more here. 397 00:22:16,290 --> 00:22:20,030 So activate tab and here 398 00:22:21,920 --> 00:22:26,890 remove the act of classes for both the tab 399 00:22:26,890 --> 00:22:28,403 and the content areas. 400 00:22:29,580 --> 00:22:32,290 And with this actually our component 401 00:22:32,290 --> 00:22:33,590 should already be working. 402 00:22:34,810 --> 00:22:35,703 So let's see. 403 00:22:36,570 --> 00:22:41,230 And yeah, beautiful, it works great, all right. 404 00:22:44,330 --> 00:22:45,610 Let's just get rid 405 00:22:45,610 --> 00:22:48,370 of all these different console.logs here 406 00:22:49,431 --> 00:22:51,553 because we only need them for development, 407 00:22:52,430 --> 00:22:53,593 but now we're done. 408 00:22:54,510 --> 00:22:56,980 So let's just quickly recap. 409 00:22:56,980 --> 00:22:59,430 And as I just mentioned a minute ago 410 00:22:59,430 --> 00:23:02,950 the whole idea when we build components like this 411 00:23:02,950 --> 00:23:05,280 is to just add and remove classes 412 00:23:05,280 --> 00:23:09,410 as necessary to manipulate the content to our needs. 413 00:23:09,410 --> 00:23:11,520 That's actually the exact same thing 414 00:23:11,520 --> 00:23:13,610 we did with a modal window. 415 00:23:13,610 --> 00:23:17,420 So if you take a look at the code, it's a bit similar. 416 00:23:17,420 --> 00:23:20,060 So to hide and display the modal window 417 00:23:20,060 --> 00:23:23,893 all we do is to add and remove this hidden class. 418 00:23:24,860 --> 00:23:27,300 Now, in this case, it's a little bit more complex 419 00:23:27,300 --> 00:23:29,430 but the idea is always the same. 420 00:23:29,430 --> 00:23:31,170 It's to work with classes 421 00:23:31,170 --> 00:23:34,680 that have some styles for showing and hiding the classes. 422 00:23:34,680 --> 00:23:38,010 And so if you're not yet really familiar with CSS, 423 00:23:38,010 --> 00:23:41,290 it's also important that you really check out to CSS 424 00:23:41,290 --> 00:23:43,720 to build these components for yourself 425 00:23:43,720 --> 00:23:46,130 and the same goes for the HTML. 426 00:23:46,130 --> 00:23:49,940 But of course, I could not write this code here as well 427 00:23:49,940 --> 00:23:52,130 because then this tutorial would take 428 00:23:52,130 --> 00:23:55,030 like one hour instead of 15 minutes. 429 00:23:55,030 --> 00:23:58,080 But anyway, I hope that this was fun 430 00:23:58,080 --> 00:24:00,880 and that make sure to understand what we did here 431 00:24:00,880 --> 00:24:03,310 including the HTML and CSS. 432 00:24:03,310 --> 00:24:05,833 And then let's go right to the next video. 32004

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.