In deze video bekijken we de anatomie van de CSS (of LESS) en JavaScript die wordt gebruikt om de component van de Titel van de Kern van het Beheer van de Stijl te creëren gebruikend het Systeem van de Stijl, evenals hoe deze stijlen op HTML en DOM worden toegepast.
Het verstrekte AEMPakket (technical-review.sites.style-system-1.0.0.zip) installeert de stijl van de voorbeeldtitel, steekproefbeleid voor de componenten van de Lay-out van de Wij.Detailhandel en van de Titel, en een steekproefpagina.
technical-review.sites.style-system-1.0.0.zip
Hier volgt de definitie LESS voor de voorbeeldstijl die u vindt op:
/apps/demo/sites/style-system/clientlib-example/components/titles/styles/example.less
Voor diegenen die liever CSS gebruiken, wordt onder dit codefragment de CSS weergegeven waarin LESS compileert.
/* LESS */
.cmp-title--example {
.cmp-title {
text-align: center;
.cmp-title__text {
color: #EB212E;
font-weight: 600;
font-size: 5rem;
border-bottom: solid 1px #ddd;
padding-bottom: 0;
margin-bottom: .25rem
}
// Last Modified At element injected via JS
.cmp-title__last-modified-at {
color: #999;
font-size: 1.5rem;
font-style: italic;
font-weight: 200;
}
}
}
Het bovenstaande LESS wordt native gecompileerd door te Experience Managers naar de volgende CSS.
/* CSS */
.cmp-title--example .cmp-title {
text-align: center;
}
.cmp-title--example .cmp-title .cmp-title__text {
color: #EB212E;
font-weight: 600;
font-size: 5rem;
border-bottom: solid 1px #ddd;
padding-bottom: 0;
margin-bottom: 0.25rem;
}
.cmp-title--example .cmp-title .cmp-title__last-modified-at {
color: #999;
font-size: 1.5rem;
font-style: italic;
font-weight: 200;
}
Met de volgende JavaScript-code worden de datum en tijd waarop de pagina voor het laatst is gewijzigd onder de titeltekst verzameld en geïnjecteerd wanneer de voorbeeldstijl op de component Title wordt toegepast.
Het gebruik van jQuery is optioneel en de gebruikte naamgevingsconventies.
Hier volgt de definitie LESS voor de voorbeeldstijl die u vindt op:
/apps/demo/sites/style-system/clientlib-example/components/titles/styles/js/title.js
/**
* JavaScript supporting Styles may be re-used across multi Component Styles.
*
* For example:
* Many styles may require the Components Image (provided via an <img> element) to be set as the background-image.
* A single JavaScript function may be used to adjust the DOM for all styles that required this effect.
*
* JavaScript must react to the DOMNodeInserted event to handle style-switching in the Page Editor Authoring experience.
* JavaScript must also run on DOM ready to handle the initial page load rendering (AEM Publish).
* JavaScript must mark and check for elements as processed to avoid cyclic processing (ie. if the JavaScript inserts a DOM node of its own).
*/
jQuery(function ($) {
"use strict;"
moment.locale("en");
/**
* Method that injects p element, containing the current pages last modified date/time, under the title text.
*
* Similar to the CSS Style application, component HTML elements should be targeted via the BEM class names (as they define the stable API)
* and targeting "raw" elements (ex. "li", "a") should be avoided.
*/
function applyComponentStyles() {
$(".cmp-title--example").not("[data-styles-title-last-modified-processed]").each(function () {
var title = $(this).attr("data-styles-title-last-modified-processed", true),
url = Granite.HTTP.getPath() + ".model.json";
$.getJSON(url, function(data) {
var dateObject = moment(data['lastModifiedDate']),
titleText = title.find('.cmp-title__text');
titleText.after($("<p>").addClass("cmp-title__last-modified-at").text("Last modified " + dateObject.fromNow()));
});
});
}
// Handle DOM Ready event
applyComponentStyles();
// Apply Styles when a component is inserted into the DOM (ie. during Authoring)
$(".responsivegrid").bind("DOMNodeInserted", applyComponentStyles);
});
Goed - Alle elementen in de component kunnen via BEM-notatie worden geadresseerd:
<!-- Good practice -->
<div class="cmp-list">
<ul class="cmp-list__item-group">
<li class="cmp-list__item">...</li>
</ul>
</div>
Slecht - De lijst en lijstelementen zijn slechts adresseerbaar door elementnaam:
<!-- Bad practice -->
<div class="cmp-list">
<ul>
<li>...</li>
</ul>
</div>
Het is beter om meer gegevens bloot te stellen en het te verbergen dan te weinig gegevens bloot te stellen die toekomstige achterste-eindontwikkeling vereisen om het bloot te stellen.
Het implementeren van afhandelbare inhoudsschakelingen kan helpen om deze HTML slank te houden, waarbij auteurs kunnen selecteren welke inhoudselementen naar de HTML worden geschreven. De optie kan vooral belangrijk zijn bij het schrijven van afbeeldingen naar de HTML-indeling die mogelijk niet voor alle stijlen worden gebruikt.
De uitzondering op deze regel is wanneer dure bronnen, bijvoorbeeld afbeeldingen, standaard beschikbaar worden gemaakt, aangezien gebeurtenisafbeeldingen die door CSS worden verborgen, in dit geval onnodig worden opgehaald.
Het Stijlsysteem maakt een kleine technische afwijking van BEM, in die zin dat BLOCK
en BLOCK--MODIFIER
niet op hetzelfde element worden toegepast, zoals gespecificeerd door BEM.
In plaats daarvan wordt BLOCK--MODIFIER
vanwege productbeperkingen toegepast op het bovenliggende element van het BLOCK
-element.
Alle andere huurders van BEM moeten met worden uitgelijnd.
Gebruik preprocessoren zoals LESS (ondersteund door AEM native) of SCSS (vereist aangepast constructiesysteem) voor duidelijke CSS-definitie en herbruikbaarheid.
Gewicht/specificiteit van kiezer uniform houden; Hiermee kunt u conflicten met CSS-trapsgewijze opmaak voorkomen en oplossen.
Elke stijl indelen in een afzonderlijk bestand.
@imports
of als onbewerkte CSS is vereist, via het opnemen van HTML-clientbibliotheekbestanden of aangepaste front-end systemen voor het bouwen van elementen.Vermijd het mengen van vele complexe stijlen.
Gebruik altijd CSS-klassen (na BEM-notatie) om CSS-regels te definiëren.
Vermijd direct het stileren BLOCK--MODIFIER
aangezien dit aan het Responsieve Net in bijlage is. Het wijzigen van de weergave van dit element kan van invloed zijn op de rendering en functionaliteit van het responsieve raster. Stijl dus alleen op dit niveau wanneer de intentie bestaat om het gedrag van het responsieve raster te wijzigen.
Pas stijlbereik toe met BLOCK--MODIFIER
. De BLOCK__ELEMENT--MODIFIERS
kan in de Component worden gebruikt, maar aangezien BLOCK
de Component vertegenwoordigt, en de Component is wat wordt gestileerd, is de Stijl "bepaald"en scoped via BLOCK--MODIFIER
.
Voorbeeld-CSS-selectiestructuur moet als volgt zijn:
Selector op eerste niveau BLOK—MODIFIER |
Selector op het tweede niveau BLOKKEN |
Selector op het derde niveau BLOCK_ELEMENT |
Effectieve CSS-kiezer | |
.cmp-list—donker | .cmp-list | .cmp-list__item | → | .cmp-list—donker .cmp-list .cmp-list__item { kleur: blauw; } |
.cmp-image—hero | .cmp-image | .cmp-image__caption | → | .cmp-image—hero .cmp-image .cmp-image__caption { kleur: rood; } |
In het geval van geneste componenten overschrijdt de CSS-selectierdiepte voor deze geneste componentelementen de selector op het derde niveau. Herhaal hetzelfde patroon voor de geneste component, maar het bereik wordt ingesteld door BLOCK
van de bovenliggende component. Met andere woorden, start de geneste component BLOCK
op het derde niveau en de geneste component ELEMENT
op het vierde selectorniveau.
De in deze sectie gedefinieerde aanbevolen procedures hebben betrekking op 'style-JavaScript' of JavaScript dat specifiek is bedoeld om de component te manipuleren voor stilistische in plaats van functionele doeleinden.
BLOCK--MODIFIERs
worden gekoppeld.BLOCK--MODIFIER BLOCK
te verbergen en weer te geven wanneer alle DOM-manipulaties in JavaScript zijn voltooid.