Learn CSS BEM (and avoid these common mistakes)

Dmitry Mayorov
3 Mar 202415:36

Summary

TLDRThis video script delves into the intricacies of CSS methodologies, focusing on BEM (Block Element Modifier). It explains that CSS can be challenging due to its numerous components like selectors, box model, and flexbox. BEM offers a structured approach to writing maintainable CSS by organizing styles into blocks (reusable layout parts), elements (components within blocks), and modifiers (style variations). The script clarifies the use of naming conventions, avoiding high specificity, and common pitfalls like using margins on blocks. It also touches on the flexibility of BEM, such as blocks being elements or utility classes. The speaker encourages viewers to ask questions and shares a personal milestone of reaching 100 subscribers.

Takeaways

  • 😀 CSS is challenging due to its vast knowledge requirements and potential for creating unsystematic 'Spaghetti code'.
  • 🔧 CSS methodologies, like BEM, provide a structured approach to writing styles to maintain code quality.
  • 🔑 BEM stands for Block, Element, Modifier, and helps in organizing CSS for better maintainability.
  • 🧩 A Block in BEM is a standalone piece of the layout, which can be reused across different contexts.
  • 📐 Elements are parts of a block that only make sense within the context of that block and do not function independently.
  • 🎨 Modifiers in BEM represent variations in style or state of a block or element, avoiding high CSS specificity.
  • 📄 When naming in BEM, focus on describing the layout rather than the content to ensure reusability.
  • 🔄 Grid is a special block type that serves as a container for other blocks but cannot stand alone semantically.
  • 🚫 Avoid using margins on blocks as it can hinder reusability and lead to maintenance issues.
  • ❌ Common mistakes in BEM include nesting CSS classes, using BEM entities like utility classes, and creating overly complex or simple blocks.
  • 🌟 The speaker emphasizes the importance of community engagement, answering questions, and the personal milestone of 8,100 subscribers.

Q & A

  • What does CSS methodology entail?

    -CSS methodology refers to a set of rules that guide the writing of CSS styles to ensure systematic and maintainable code.

  • Why is BEM considered beneficial for CSS?

    -BEM (Block, Element, Modifier) is beneficial because it helps avoid the 'Butterfly Effect' in CSS, where changes in one part of the project can cause unintended side effects elsewhere, making projects easier to maintain.

  • What is the significance of the double underscore and double dash in BEM syntax?

    -The double underscore and double dash in BEM syntax are used to denote elements and modifiers, respectively, which helps in creating a clear and systematic naming convention for CSS classes.

  • What is a 'Block' in BEM and how is it different from a 'Grid'?

    -A 'Block' in BEM is a standalone component of a layout that can be reused in different contexts. A 'Grid' is a special case of a block that cannot stand alone semantically but serves a functional purpose as a container for other blocks.

  • How should you name blocks in BEM to ensure reusability?

    -Blocks should be named in a way that describes their layout rather than their content to ensure they can be reused in different contexts.

  • What defines an 'Element' in BEM?

    -An 'Element' in BEM is a part of a block that does not have semantic meaning or function on its own and only makes sense within the context of its block.

  • Why is it recommended to keep CSS specificity low in BEM?

    -Keeping CSS specificity low in BEM helps maintain a flat structure, avoiding nesting and concatenated selectors, which simplifies the CSS and makes it easier to maintain.

  • How do modifiers work in BEM and what is their purpose?

    -Modifiers in BEM represent changes in state or slight visual modifications of a block or element. They are used to alter the style or behavior of a block or element without creating entirely new classes.

  • What is the difference between using a modifier and creating a new block in BEM?

    -Modifiers should be used for minor changes to a block or element, such as color or size. If extensive changes are needed, creating a new block is recommended to avoid complex overrides and maintain clarity.

  • Can a block also be an element at the same time in BEM?

    -Yes, a block can also be an element at the same time in BEM. This is common in patterns where one block is used as a component within another block.

  • What are some common mistakes to avoid when using BEM?

    -Common mistakes to avoid in BEM include using margins on blocks, nesting classes in CSS, treating BEM entities like utility classes, creating elements of elements, and creating blocks that are either too complex or not reusable.

Outlines

00:00

📚 Introduction to CSS Methodologies and BEM

The paragraph begins with the speaker recounting their earlier statement about the complexity of CSS and the need to learn it quickly. They introduce CSS methodologies as a set of rules to follow when writing styles, with BEM (Block Element Modifier) being one of them. BEM's syntax, which includes double underscores and double dashes, may seem odd at first, but it becomes intuitive once understood. BEM is explained with the example of blocks, which are standalone parts of a layout, possibly reusable. Blocks can be semantic or functional, like a grid. The speaker emphasizes the importance of naming blocks based on their layout rather than their content for reusability. The paragraph concludes with a discussion on why the grid is considered a special case in BEM.

05:01

🔍 Deep Dive into Blocks and Elements in BEM

This paragraph delves deeper into the concept of elements within BEM. Elements are parts of a block that cannot stand alone; they lack semantic meaning and function only within the context of a block. The speaker uses a button with a label and icon as an example to illustrate the concept of elements. The paragraph also explains the CSS implementation of BEM, advocating for low specificity by avoiding nesting and using single class selectors. Modifiers, which represent changes in state or slight visual modifications, are introduced, with an example of how to apply them to both blocks and elements. The speaker provides tips on using modifiers and the decision-making process between using a modifier or creating a new block.

10:03

💡 Practical BEM Usage and Common Questions

The speaker addresses common questions and considerations when using BEM. They discuss the application of modifiers to elements, providing examples of how to highlight specific content. The paragraph also covers the decision of when to use a modifier versus creating a new block, emphasizing the importance of low specificity and avoiding extensive overrides. The speaker explains how blocks can be elements and even other blocks, providing examples and discussing the implications for reusability and maintainability. The paragraph concludes with a discussion on the use of utility classes within the BEM methodology.

15:04

🚩 Avoiding Common Mistakes in BEM

In this paragraph, the speaker outlines common mistakes to avoid when using BEM. They caution against using margins on blocks as it can hinder reusability and lead to maintenance issues. The paragraph also warns against nesting classes in CSS and using BEM entities like utility classes, which can increase specificity and go against BEM principles. The speaker advises against creating elements of elements and creating blocks with too many or too few elements, emphasizing the importance of abstraction and reusability. The paragraph concludes with a brief acknowledgment of the channel's milestone and an invitation for further questions from the audience.

🎉 Conclusion and Subscriber Milestone

The final paragraph is a conclusion where the speaker expresses gratitude for reaching 8,100 subscribers on their YouTube channel. They emphasize the personal significance of this milestone and their commitment to continue creating helpful content. The speaker thanks their audience and looks forward to the next video.

Mindmap

Keywords

💡CSS Methodology

CSS methodology refers to a set of guidelines or rules that developers follow to write consistent and maintainable CSS code. In the video, the speaker emphasizes the importance of methodologies in organizing CSS, making it easier to manage and less prone to errors. The main theme revolves around one such methodology, BEM (Block Element Modifier), which is discussed in detail.

💡BEM

BEM stands for Block, Element, Modifier, a naming convention for classes in CSS that helps to create reusable components and code. The video script explains BEM as a methodology that, once understood, simplifies the maintenance of CSS in large projects by avoiding the 'Butterfly Effect' where changes in one part of the code can have unintended consequences elsewhere.

💡Block

In BEM, a 'Block' is a standalone component that can be reused in different parts of a layout or even in different projects. The script uses examples such as 'button', 'card', and 'grid' to illustrate blocks, explaining that these can function independently and are not tied to specific content.

💡Element

An 'Element' in BEM is a part of a block that does not have semantic meaning or functionality on its own. It only makes sense within the context of a block. For instance, the script mentions a 'button' block having 'label' and 'icon' elements, which are dependent on the button for their functionality and styling.

💡Modifier

A 'Modifier' in BEM is used to change the style or state of a block or element. The video provides an example of a button with a modifier class 'button--green' to style it differently without affecting other buttons. Modifiers help in keeping the CSS flexible and responsive to changes.

💡Specificity

Specificity in CSS refers to the priority given to CSS rules. The video script advocates for low specificity in BEM by avoiding nested selectors and using single class selectors. This approach helps maintain a flat structure in CSS, making it easier to override styles and reducing the complexity of the stylesheet.

💡Spaghetti Code

Spaghetti code is a term used to describe code that is tangled and difficult to follow. In the context of the video, the speaker warns against writing CSS that quickly leads to spaghetti code, which is hard to maintain. BEM is presented as a solution to this problem by promoting a systematic and organized approach to writing CSS.

💡Semantic

Semantic in web development refers to code that clearly conveys the meaning and function of content. The video script discusses how blocks should have semantic meaning and be reusable in different contexts. For example, a 'card' block should be named in a way that describes its layout rather than its content to ensure it can be reused for different types of content.

💡Reusability

Reusability is a key concept in the video, emphasizing the importance of creating CSS components that can be used in multiple places without modification. The speaker advises against using margins on blocks to maintain reusability, as it can lead to unintended spacing issues when the block is reused in different contexts.

💡Utility Classes

Utility classes are generic CSS classes that can be applied to elements for common styling needs. The video mentions using utility classes like 'visually-hidden' in moderation with BEM, to maintain consistency and avoid conflicts. The script provides an example of using a utility class to hide text for screen readers while keeping it accessible.

💡Nesting

Nesting in CSS refers to the practice of defining styles for child elements within the styles of their parent elements. The video script advises against nesting in BEM, as it increases specificity and goes against the flat structure philosophy of BEM, which can make the CSS harder to maintain and understand.

Highlights

CSS methodologies, like BEM, help create maintainable, systematic, and reusable code.

BEM stands for Block Element Modifier and is a methodology for structuring CSS classes.

Blocks are reusable parts of the layout, such as buttons, cards, and grids, which can function independently.

Elements exist within the context of blocks and don't have independent functionality, like labels or icons within a button.

Modifiers represent changes in state or visual alterations of blocks or elements, such as changing a button color from orange to green.

One of BEM’s core principles is to keep CSS specificity low by avoiding nesting and using flat class selectors.

Naming blocks based on layout rather than content helps make components reusable across different contexts.

Utility classes can be used with BEM, but it's important to remain consistent and use them in moderation.

Common mistake: adding margins to blocks, which affects reusability when blocks are used in different contexts.

Avoid nesting classes in CSS to maintain BEM's low specificity and flat structure.

Another common mistake is creating elements of elements, which isn't part of BEM’s intended structure.

BEM encourages creating new blocks when modifiers require multiple overrides, avoiding excessive specificity and style overrides.

Blocks and elements should be kept separate to avoid style bleeding in component-based systems like React.

Blocks can function as elements or other blocks simultaneously, allowing for modular and scalable design systems.

Mistake: creating overly complex blocks with too many elements or blocks that aren't reusable.

Transcripts

play00:00

in one of the previous videos I said

play00:01

that it takes a few minutes to learn bam

play00:03

and when I rewatched that video my

play00:05

immediate thoughts were dude if you're

play00:07

so smart why don't you explain them in a

play00:09

few minutes so that's what we're doing

play00:13

today let's address the elephant in the

play00:15

room CSS is hard you need to know a lot

play00:19

of things to write good Styles you need

play00:21

to know different types of selectors Box

play00:23

model formatting contacts Flex box grid

play00:27

and just diving into Styles and starting

play00:30

to write what comes to mind first

play00:32

quickly lead to Spaghetti code that is

play00:36

not systematic that's hard to maintain

play00:38

so that's why Engineers came up with CSS

play00:41

methodologies CSS methodology is

play00:43

basically just a fancy way of saying a

play00:45

set of rules that you follow when you

play00:47

write Styles and bem is just one of them

play00:50

bem seems a little annoying at the

play00:52

beginning because it has this weird

play00:53

syntax with double underscore Double

play00:56

Dash but once it clicks you realize that

play00:58

maintaining project written in BM is so

play01:01

easy you don't have this Butterfly

play01:03

Effect when you change one thing on one

play01:05

side of the project and something else

play01:08

like completely unrelated Brak so b

play01:10

stands for Block element modifier and

play01:13

let's focus on blocks for now a block is

play01:15

a single potentially reusable part of

play01:19

the layout and let's go through an

play01:21

exercise of identifying blocks in this

play01:23

layout so the most obvious are button

play01:27

card and grid so why are these

play01:29

considered blocks

play01:30

because you can take them and use them

play01:33

in different layouts and context even

play01:35

here you can see the button is used

play01:36

inside cards and as a CTA at the bottom

play01:40

of the page and all of these blocks uh

play01:42

except for the grid which is a special

play01:44

case which we'll cover shortly can

play01:46

function on their own meaning that

play01:49

semantically they could work as a as a

play01:52

single unit okay so once we've

play01:53

identified which parts of the layout

play01:55

will convert into blocks we need to give

play01:57

them names and one tip I can can give

play02:00

you for naming um entities in B is to

play02:03

describe the layout instead of content

play02:05

here's what I mean so we have this page

play02:07

about parks in Ontario one thing we

play02:09

could do is name the card a park card

play02:12

that would work for this page because

play02:15

it's only about Parks but imagine if you

play02:16

want to reuse this card component on a

play02:19

different page that's about lakes in

play02:21

Ontario that would not work semantically

play02:24

because Park and Lake is not the same

play02:26

thing so always try to describe the

play02:28

layout in the name of the BL instead of

play02:30

describing content now let's briefly

play02:32

pause on why grid is a special case the

play02:35

reason for that is that it cannot stand

play02:37

on its own semantically its value is

play02:40

purely functional it works as a

play02:43

container for holding other blocks but

play02:45

because it's such a common pattern it

play02:47

makes perfect sense to abstract it as a

play02:50

single block okay so I hope that's clear

play02:52

blocks reusable parts of layout either

play02:56

semantic or functional like a grid now

play02:59

let's move on on to elements so an

play03:01

element is something that exists only

play03:03

within the context of a block and

play03:06

doesn't work on its own when I say

play03:08

doesn't work on its own I mainly mean

play03:10

three things it doesn't have a semantic

play03:13

meaning on its own it doesn't have a

play03:15

function on its own and it has styles

play03:18

that only make sense inside the context

play03:22

of a block so let's consider this button

play03:25

for example it has a label and an icon

play03:28

so why doesn't this icon can make sense

play03:30

outside the button essentially like what

play03:32

function would it serve it doesn't carry

play03:35

semantic meaning right it's just an

play03:37

arrow like it could point at something

play03:39

but I guess like if there's no something

play03:42

like what's the meaning of it if it

play03:44

didn't have a meaning its margin would

play03:46

mess up reusability and we'll cover that

play03:48

a little later so in B terminology the

play03:51

label and the icon are the elements of

play03:54

the button and we identify them with the

play03:56

double underscore notation so again to

play03:58

summarize block reusable part of the

play04:01

layout works on its own uh either

play04:03

semantic or functional meaning element

play04:06

part of the block that doesn't work on

play04:08

its own so I hope that's clear so before

play04:09

we jump into modifiers Let's uh cover

play04:12

the CSS implementation one of the core

play04:15

principles of bem is to keep specificity

play04:18

very low therefore in CSS we avoid

play04:21

nesting and there are some exceptions

play04:23

but uh in general we avoid nesting and

play04:26

instead we use just a single class

play04:28

selector for both the block and an

play04:31

element and we put them at the top level

play04:34

of the style sheet and that's why it's

play04:36

called Flat we keep it at the at the

play04:39

same level there's no nesting there's no

play04:41

concatenated selectors nothing okay so a

play04:44

modifier is another bem entity it

play04:46

represents a change of a state or a

play04:50

slight visual modification of either a

play04:52

block or an element so let's say we want

play04:55

to have a different style for a button

play04:58

here that isn't orange but Green in then

play05:01

we would create another class for this

play05:03

it could look something like this button

play05:05

Double Dash green and Double Dash is a

play05:08

standard notation for modifiers in HTML

play05:11

we would put that on the same Noe as the

play05:14

button and same low specificity approach

play05:16

applies in CSS we would put modifiers on

play05:18

the same level as the block and an

play05:21

element and the override will still work

play05:23

here because button green is declared

play05:26

after the button so Styles inside button

play05:30

green Will trump Styles and button and

play05:32

if you want to avoid overriding uh

play05:35

Styles alog together you can introduce a

play05:38

default modifier which will contain only

play05:41

the Declarations that you later change

play05:43

with auto modifiers now that we've

play05:45

covered the basics I want to answer a

play05:46

few common questions that come up when

play05:48

you first start using them the first one

play05:50

is can I use the modifier with an

play05:51

element yes I have already covered that

play05:54

but let's dive a little deeper here so

play05:56

we have this page with all the parks and

play05:57

let's say we want to highlight Al bin

play06:00

and make the card stretch for two

play06:02

columns so you create a modifier that

play06:04

looks something like this and now we can

play06:06

take this class and apply it to a

play06:09

corresponding element in the HTML and it

play06:12

will make sure that the cell is

play06:14

stretched and another tip while we're

play06:16

here notice how the cart handles

play06:18

different widths easily we should always

play06:21

strive to create blocks in isolation

play06:23

with an idea that we don't know the

play06:25

context where they will be used like

play06:27

here for example it could be a narrow

play06:29

column it could be a white column and it

play06:32

still works how do I decide whether to

play06:34

use a modifier or create a new block no

play06:39

hard rule here but my rule of thumb is

play06:41

that modifiers should be used for

play06:44

changing just one property or like two

play06:47

at Max like it could be color or size or

play06:50

B and let me give you an example see how

play06:52

the card looks bigger but the entire

play06:54

layout looks a little bit off we have

play06:57

this uh card on the right that's super

play06:59

tall and we should probably change the

play07:01

main card that we want to highlight to

play07:03

something that looks more like this and

play07:06

you might be thinking okay so like we

play07:07

have the card block right like this

play07:11

looks very similar because it has the

play07:13

same elements so we would create a

play07:16

modifier that says card overlay and we

play07:19

would Nest each element of the original

play07:21

card block inside and provide new styles

play07:24

for it this code stinks though because

play07:26

not only we create a lot of overrides we

play07:28

are raking up specificity and the more

play07:30

nesting we start adding to this uh block

play07:34

the harder it is to read and imagine

play07:36

it's just one modifier now but what if

play07:38

we had another variation to the card

play07:40

like it's going to be two three or four

play07:42

and also imagine if you need to update

play07:45

the default card Styles let's say uh you

play07:48

want to add padding to an image now you

play07:51

do that and this update will propagate

play07:55

automatically to all of the variations

play07:57

that You' have created in our cases one

play07:59

but it could be more so usually when I

play08:01

find myself creating a lot of overrides

play08:03

I create a new block instead of a

play08:05

modifier so in this case I would create

play08:07

a new block that would be called overlay

play08:09

card and we would nicely keep them

play08:12

separate in case I want to update the

play08:14

original card I updated overlay card

play08:17

stays intact and same goes for overlay

play08:20

card another question can block be an

play08:22

element at the same time the answer is

play08:25

yes to illustrate this let's go back to

play08:28

our grid basically each great item can

play08:31

also be a card now should you combine a

play08:34

block and an element on the same note I

play08:36

don't do this very often because we are

play08:39

rarely writing plain HTML usually we're

play08:43

working in the context of some kind of

play08:45

content management system or react

play08:47

framework and card usually would be its

play08:51

own component if you are a front Ender

play08:54

and you're writing this code in PL HTML

play08:57

first and handing it to a back Ender or

play09:00

someone who will be implementing it they

play09:02

might take grid item and card and put

play09:05

inside a component and that would create

play09:08

a lot of frustration because styles from

play09:11

grid item will bleed into a component

play09:14

usually I separate those two and make

play09:17

sure that the card sits on its own node

play09:19

so logical next question can block be

play09:22

another block at the same time and the

play09:24

answer is also yes and I have this code

play09:26

to illustrate this in this same example

play09:28

you see that we have container block and

play09:32

content flow block one is basically

play09:35

defining the width of the content inside

play09:37

and side gutters and CF flow defines the

play09:41

vertical Rhythm so they both do

play09:44

different things they they're not

play09:45

conflicting so they could technically

play09:48

leave on the same node can B be used

play09:51

with uh utility classes I don't see why

play09:54

not even though it sort of goes against

play09:56

the B philosophy I do it all the time

play09:58

because utility classes could be

play10:01

extremely helpful when used in

play10:02

moderation for example in our project I

play10:05

have a utility class called visually

play10:06

hidden a common method for hiding an

play10:09

element visually but keeping it

play10:11

accessible for screen readers I want the

play10:14

call to action to say learn more about

play10:17

gangin Park but I don't want the links

play10:20

to say that entire phrase so I hide

play10:24

about Al gonin Park in this utility

play10:26

class I could have made this another El

play10:29

inside the button but since this is such

play10:31

a common pattern it makes perfect sense

play10:34

to abstract it into utility class the

play10:37

main point with utility classes is

play10:39

staying consistent so if you start using

play10:41

this visually hidden class make sure

play10:43

that you use this instead of elements or

play10:47

modifiers okay so these are common

play10:49

questions that I could think of on my

play10:50

own if you have more questions about bam

play10:53

don't hesitate to ask in the comments

play10:56

I'll respond every single one of them

play10:58

now now bear with me we have one more

play11:00

section about common mistakes and this

play11:02

is very important so the first one is

play11:05

using margins on blocks and let me

play11:08

explain why this is such a big deal

play11:10

consider this example let's put a form

play11:13

at the bottom of our page it looks okay

play11:15

right but the space between the button

play11:18

and the form is uh like sort of tiny so

play11:21

we might think let's just add some space

play11:23

above by Eddie margin block start to

play11:26

newsletter form block and it looks

play11:28

perfectly fine now there's more space

play11:30

and you might not even face any issues

play11:32

if you don't reuse the newsletter form

play11:35

anywhere else problems begin when you

play11:37

actually start reusing the form so see

play11:39

we have this empty space in the grid

play11:41

after we changed the alonquin park this

play11:44

overlay card you get a message from your

play11:47

designer or your PM or the client and

play11:49

they say why don't we put our form in

play11:51

there and you take the form you put it

play11:54

in and you see that now you have the

play11:57

space at the top that comes from the

play11:59

block itself and this can cause big

play12:02

headaches in real projects because this

play12:04

form could be used in hundreds or

play12:07

thousands of pages and simply removing

play12:10

the margin will introduce a lot of

play12:13

regressions and unless you have a very

play12:15

robust testing system in place it can be

play12:18

very scary to change stuff like that so

play12:20

what we usually do in these cases we

play12:22

create a patch right GD item newsletter

play12:25

form and we reset the margin and then we

play12:27

add another patch for another block and

play12:29

another one and another one and another

play12:31

one you see how quickly it turns into a

play12:35

spaghetti mess of styles never Ed

play12:37

margins on blocks that messes up

play12:39

reusability big time okay so next

play12:42

mistake I see people make with bam is

play12:43

nesting classes in CSS and it looks

play12:47

something like this this defeats the

play12:49

purpose of bam because the whole point

play12:53

of this underscore and Double Dash

play12:55

notation is to keep Styles flat and

play12:58

spefic specificity low so if we do this

play13:00

we basically increase specificity of

play13:03

elements for no particular reason you

play13:05

should always try for low specificity

play13:08

and flat Styles and avoid nesting like

play13:11

this concatenating selectors can also go

play13:14

into this bucket it's a terrible pattern

play13:16

because you make elements unsearchable

play13:18

and I made the entire video why it's

play13:21

okay so next mistake I want to cover is

play13:24

using bem entities like utility classes

play13:28

so here's a quick example we have

play13:30

overlay card CTA element that looks

play13:32

something like this and it has only one

play13:35

uh declaration margin block start Auto

play13:37

just because it has only one declaration

play13:40

doesn't mean that we should copy this

play13:42

class and use it on any HTML element

play13:44

that needs this style this goes against

play13:47

B principles because it prioritizes

play13:49

Styles over semantics and that's not how

play13:53

how bem works okay next mistake and I've

play13:56

seen this a lot creating elements of

play13:58

elements you look at the markup of the

play14:00

card and you think that okay so since

play14:04

image is inside media we'll just keep

play14:07

doing the same pattern with double

play14:10

underscore that might be some kind of

play14:12

CSS methodology but that's not bam

play14:15

instead of this we should just keep one

play14:17

level of elements regardless of how

play14:19

deeply they nested okay and the last

play14:21

mistake I want to cover today is

play14:24

creating blocks that have too many or

play14:27

too few elements remember how in our

play14:29

project we have a grid block and a card

play14:33

block and card block does its own thing

play14:35

grid block does its own thing what we

play14:38

could have done instead is create a

play14:40

single block that does both if we did

play14:43

that we would end up with a block that

play14:45

has nine elements not only this could be

play14:47

hard to scan because the CSS file will

play14:50

become too big we're also missing out on

play14:52

creating a system by abstracting two

play14:54

blocks that do uh different things

play14:57

similar concept applies to creating

play15:00

blocks that are not reused at all so for

play15:03

example we could have abstracted card

play15:05

content into a single blog but if we're

play15:08

not reusing anywhere what's the point so

play15:11

this was bem in a nutshell if you have

play15:13

any other questions about it feel free

play15:15

to ask in the comments and thank you

play15:17

everyone who subscribed to my channel we

play15:19

just crossed A8 100 subscribers doesn't

play15:22

seem like a lot in YouTube universe but

play15:25

for me this is a big deal it just makes

play15:27

me want to continue

play15:29

making these videos as helpful as I can

play15:32

and again thank you so much and I'll see

play15:34

you in the next one

Rate This

5.0 / 5 (0 votes)

الوسوم ذات الصلة
CSS MethodologyBEMWeb DevelopmentCode MaintainabilityFront-end DesignLayout BlocksSemantic ElementsCSS SelectorsReusabilityWeb Standards
هل تحتاج إلى تلخيص باللغة الإنجليزية؟