Qual è lo scopo dei breakpoint definiti in `breakpoints.yml?
Perché le media query sono definite in breakpoints.yml e non nei file CSS?
Qual è lo scopo dei breakpoint definiti in `breakpoints.yml?
Perché le media query sono definite in breakpoints.yml e non nei file CSS?
Risposte:
Non è possibile utilizzare i punti di interruzione definiti in un file breakpoints.yml nei CSS senza pre o post-elaborazione. Poiché non utilizziamo processori per lo styling in core, i punti di interruzione sono ancora codificati nei file CSS. In un tema personalizzato sei comunque libero di usare strumenti come Gulp o Grunt e teoricamente sarebbe possibile usare l'input breakpoints.yml per la tua generazione CSS.
Attualmente breakpoints.yml è principalmente interessante per JavaScript (JS). Dai un'occhiata al modulo della barra degli strumenti nel core. Le informazioni sul breakpoint vengono aggiunte all'oggetto JS 'drupalSettings' in 'src / Element / Toolbar.php' in questo modo:
$breakpoints = static::breakpointManager()->getBreakpointsByGroup('toolbar');
if (!empty($breakpoints)) {
$media_queries = array();
foreach ($breakpoints as $id => $breakpoint) {
$media_queries[$id] = $breakpoint->getMediaQuery();
}
$element['#attached']['drupalSettings']['toolbar']['breakpoints'] = $media_queries;
}
Quindi in JS vengono lette le impostazioni di runtime definite sopra.
var options = $.extend(
{
breakpoints: {
'toolbar.narrow': '',
'toolbar.standard': '',
'toolbar.wide': ''
}
},
drupalSettings.toolbar
);
Successivamente viene aggiunto un listener di eventi per punto di interruzione, in modo che "qualcosa" possa essere fatto quando cambiano le dimensioni dello schermo.
for (var label in options.breakpoints) {
if (options.breakpoints.hasOwnProperty(label)) {
var mq = options.breakpoints[label];
var mql = Drupal.toolbar.mql[label] = window.matchMedia(mq);
mql.addListener(Drupal.toolbar.mediaQueryChangeHandler.bind(null, model, label));
}
}
In caso di modifica è possibile intraprendere diverse azioni per breakpoint.
Drupal.toolbar = {
mediaQueryChangeHandler: function (model, label, mql) {
switch (label) {
case 'toolbar.narrow':
model.set({
isOriented: mql.matches,
isTrayToggleVisible: false
});
break;
case 'toolbar.standard':
// Logic
break;
case 'toolbar.wide':
// Logic
break;
default:
break;
}
}
};
Nota : gli esempi di codice sono presi dal modulo Drupal Toolbar e rimossi. Usa come ispirazione, non come codice funzionale.
Una buona spiegazione sull'uso di JS mediaQueries in generale è disponibile qui: https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Testing_media_queries