Jaki jest cel punktów przerwania zdefiniowanych w `breakpoints.yml?
Dlaczego zapytania o media są zdefiniowane w pliku breakpoints.yml, a nie w plikach CSS?
Jaki jest cel punktów przerwania zdefiniowanych w `breakpoints.yml?
Dlaczego zapytania o media są zdefiniowane w pliku breakpoints.yml, a nie w plikach CSS?
Odpowiedzi:
Nie ma możliwości użycia punktów przerwania zdefiniowanych w pliku breakpoints.yml w CSS bez wstępnego lub końcowego przetwarzania. Ponieważ nie używamy procesorów do stylizacji w rdzeniu, punkty przerwania są nadal zakodowane na stałe w plikach CSS. W niestandardowym motywie możesz jednak swobodnie korzystać z narzędzi takich jak Gulp lub Grunt i teoretycznie byłoby możliwe użycie danych breakpoints.yml do generowania CSS.
Obecnie breakpoints.yml jest interesujący głównie dla JavaScript (JS). Spójrz na przykład na moduł Toolbar w rdzeniu. Informacje o punkcie przerwania są dodawane do obiektu JS „drupalSettings” w pliku „src / Element / Toolbar.php” w następujący sposób:
$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;
}
Następnie w JS odczytywane są ustawienia czasu pracy zdefiniowane powyżej.
var options = $.extend(
{
breakpoints: {
'toolbar.narrow': '',
'toolbar.standard': '',
'toolbar.wide': ''
}
},
drupalSettings.toolbar
);
Później detektor zdarzeń jest dodawany dla każdego punktu przerwania, aby „coś” można było zrobić, gdy zmienia się rozmiar ekranu.
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));
}
}
W przypadku zmiany można podjąć różne działania dla każdego punktu przerwania.
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;
}
}
};
Uwaga : przykłady kodu są pobierane z modułu Drupal Toolbar i usuwane. Użyj jako inspiracji, a nie jako kodu funkcjonalnego.
Dobre wyjaśnienie dotyczące korzystania z JS mediaQueries ogólnie można znaleźć tutaj: https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Testing_media_queries