&) met BEMIn de vorige lessen heb je geleerd hoe je met SCSS variabelen aanmaakt en eenvoudig selectors in elkaar opsluit (nesting). Maar wat gebeurt er als je pseudo-klassen zoals :hover wilt toevoegen, of wanneer je werkt met de BEM-methode (Block, Element, Modifier)?
Daar komt de magische Parent Selector (&) in SCSS om de hoek kijken. Met dit simpele teken schrijf je veel schonere, beter georganiseerde en sneller te onderhouden code!
&)?In SCSS staat het &-teken voor de parent selector (de bovenliggende selector). Het verwijst letterlijk naar het CSS-blok waar je op dat moment binnenin aan het typen bent.
Wanneer je SCSS compileert naar standaard CSS, plakt de compiler het &-teken vast aan de selector waarin het zich bevindt.
Bij standaard CSS herhaal je voortdurend de klassenaam om een :hover of :focus status aan te spreken. In SCSS gebruik je daar direct & voor.
.btn {
background-color: #2563eb;
color: #ffffff;
padding: 10px 20px;
border-radius: 6px;
// & verwijst hier naar .btn
&:hover {
background-color: #1d4ed8;
}
&:focus {
outline: 2px solid #93c5fd;
}
}
.btn {
background-color: #2563eb;
color: #ffffff;
padding: 10px 20px;
border-radius: 6px;
}
.btn:hover {
background-color: #1d4ed8;
}
.btn:focus {
outline: 2px solid #93c5fd;
}
Tip: De&moet zonder spatie voor de dubbele punt staan (&:hover). Zet je wel een spatie (& :hover), dan zoekt SCSS naar een kind-element binnen de knop dat gehoverd wordt!
De BEM-methode (Block, Element, Modifier) is de standaard in de grafische en front-end sector om CSS-klassen helder te structureren:
.card).card__title of .card__img).card--featured of .card__title--large)Dankzij het &-teken kun je in SCSS de klassenamen van BEM aan elkaar plakken!
.card {
background-color: #ffffff;
border: 1px solid #e5e7eb;
padding: 1.5rem;
// Plakt '__title' achter '.card' -> .card__title
&__title {
font-size: 1.25rem;
color: #1f2937;
}
// Plakt '__button' achter '.card' -> .card__button
&__button {
display: inline-block;
margin-top: 1rem;
}
// Plakt '--featured' achter '.card' -> .card--featured
&--featured {
border-color: #f59e0b;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}
}
.card {
background-color: #ffffff;
border: 1px solid #e5e7eb;
padding: 1.5rem;
}
.card__title {
font-size: 1.25rem;
color: #1f2937;
}
.card__button {
display: inline-block;
margin-top: 1rem;
}
.card--featured {
border-color: #f59e0b;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}
Belangrijke regel: Nesting maakt je SCSS heel overzichtelijk, maar sla er niet in door! Volg de Inception-regel: nest nooit dieper dan 3 niveaus. Hoe dieper je nest, hoe specifieker en zwaarder de uiteindelijke CSS wordt.
Laten we BEM, HTML en SCSS met de &-operator nu eens samenbrengen in een realistisch component.
<article class="product-card product-card--sale">
<img src="images/schoen.jpg" alt="Sneaker" class="product-card__image">
<div class="product-card__body">
<h3 class="product-card__title">Retro Sneaker</h3>
<p class="product-card__price">€ 89,99</p>
<button class="product-card__btn">In winkelmand</button>
</div>
</article>
&:$color-primary: #10b981;
$color-sale: #ef4444;
.product-card {
background: #ffffff;
border-radius: 12px;
overflow: hidden;
max-width: 300px;
transition: transform 0.2s ease;
&:hover {
transform: translateY(-5px);
}
&__image {
width: 100%;
height: 200px;
object-fit: cover;
}
&__body {
padding: 1rem;
}
&__title {
font-size: 1.1rem;
margin: 0 0 0.5rem 0;
}
&__price {
font-weight: bold;
color: $color-primary;
}
&__btn {
width: 100%;
padding: 0.5rem;
background-color: $color-primary;
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
&:hover {
opacity: 0.9;
}
}
// Modifier voor uitverkoop
&--sale {
border: 2px solid $color-sale;
.product-card__price {
color: $color-sale;
}
}
}
In deze opdracht ga je de Parent Selector (&) in SCSS toepassen om een profielkaartje (Profile Badge) te bouwen volgens de BEM-structuur.
style.scss)..profile-card.profile-card__avatar, .profile-card__name, .profile-card__role, .profile-card__btn.profile-card--pro (voor een premium/pro account).profile-card met behulp van de parent selector & (dus &__avatar, &__name, etc.).
&__btn) een :hover-status toe met &:hover.&--pro een opvallende rand- of achtergrondkleur.Een strak vormgegeven profielkaartje waarvan de volledige styling in SCSS is opgebouwd vanuit één enkel hoofdblok (.profile-card) met behulp van de &-operator.