The part pseudo class allows consumers of a web component to manipulate certain key elements inside the Shadow DOM. In this lesson we will explore two use cases to using the part pseudo class.
const employeesTemplate = document.querySelector('#employees-custom-element');
class EmployeesComponent extends HTMLElement {
cards;
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(employeesTemplate.content.cloneNode(true));
this.cards = [...this.shadowRoot.querySelectorAll('.card')];
}
connectedCallback() {
this.cards.forEach((card, index) => {
card.addEventListener('click', (e) => {
const name = card.querySelector('h4').innerText;
const role = card.querySelector('p').innerText;
const selectionEvent = new CustomEvent('cardSelection', {
bubbles: true, composed: true, detail: { index, name, role }
});
this.dispatchEvent(selectionEvent);
});
});
}
toggleSelected(cardIndex) {
const card = this.cards[cardIndex];
const oldAttributeValue = card.getAttribute('part');
if (oldAttributeValue.indexOf('selected') === -1) {
card.setAttribute('part', `${oldAttributeValue} selected`);
} else {
card.setAttribute('part', `${oldAttributeValue.replace('selected', '')}`);
}
}
}
customElements.define(employeesTemplate.id, EmployeesComponent);
const employeesComponent = document.querySelector(employeesTemplate.id); let selectedCard; const element = employeesComponent.addEventListener('cardSelection', (e) => { const {index: cardIndex, name, role} = e.detail; employeesComponent.toggleSelected(cardIndex); if (selectedCard) employeesComponent.toggleSelected(selectedCard.index); selectedCard = e.detail; });
employees-custom-element::part(card) { background: rgba(0, 0, 50, .5); } employees-custom-element::part(selected) { background: rgba(255, 0, 0, .5); }