Как добавить «медиа-запрос ориентации» в загрузочный медиа-запрос 4 sass - PullRequest
0 голосов
/ 19 апреля 2019

Я использую в своих файлах scss медиа-запрос "vanilla" bootstrap 4:

@include media-breakpoint-up(xs){}
@include media-breakpoint-up(sm){}
@include media-breakpoint-up(lg){}
@include media-breakpoint-up(xl){}

Я знаю, что если я использую медиа-запрос ширины css, я могу связать его с медиа-запросом ориентации,но я хочу использовать Sass Framework.Я хочу добавить медиа-запрос ориентации в один из них, XS.таким образом, это специфично.Потому что, как вы знаете, bootsrap 4 пока не поддерживает запрос ориентации (странно).

Я пытался объединить «запрос ориентации» с «SASS начальной загрузки медиа-запроса (xs)» по-другому, но у меня всегда была ошибка sass.

Таким образом, я вложилэто в медиа-запросе начальной загрузки SASS (xs):

@include media-breakpoint-up(xs){

... some SCSS rules

  @media (orientation: landscape){
     header{
     display:none !important;   
     } 
     .navbar{ 
     display:none !important;   
     } 
  }
}

Проблема, которую я даже подумал, заключается в том, что она вложена в запрос XS, что она применяется ко всем точкам останова.это как будто не учитывает вложенность.

Мой вопрос: как объединить «запрос ориентации» с «медиазапросом загрузки SASS (xs)»?Или как сделать его специфичным для точки останова XS, вложив его.

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Я использую это вне Bootstrap.Вы должны иметь возможность использовать его с Bootstrap или любым другим фреймворком, предоставляя вам больше гибкости в ваших медиа-запросах.

// Extra map functions by Hugo Giraudel
@function map-deep-get($map, $keys...) {
  @each $key in $keys {
    $map: map-get($map, $key);
  }
  @return $map;
}

@function map-has-keys($map, $keys...) {
  @each $key in $keys {
    @if not map-has-key($map, $key) {
      @return false;
    }
  }
  @return true;
}

@function map-has-nested-keys($map, $keys...) {
  @each $key in $keys {
    @if not map-has-key($map, $key) {
      @return false;
    }
    $map: map-get($map, $key);
  }
  @return true;
}

Это дополнительные функции карты Hugo Giraudel записал.map-deep-get - это в основном упрощенная вложенная функция map-get.map-has-keys аналогичен map-has-key, который встроен в sass, но проверяет наличие нескольких ключей.map-has-nested-keys расширяет этот раздел, проверяя наличие вложенных ключей.Это очень важно для этого метода.Я бы определенно посмотрел на дополнительные функции Sass, которые он создал.Я довольно легко нашел применение почти для всех из них.

// Map
$sizes: (
  null: (
    breakpoint: 0,
    container: 100%
  ),
  xs: (
    breakpoint: 480px,
    container: 464px
  ),
  sm: (
    breakpoint: 768px,
    container: 750px
  ),
  md: (
    breakpoint: 992px,
    container: 970px
  ),
  lg: (
    breakpoint: 1200px,
    container: 1170px
  )
);

Это простая карта точек останова.Я обычно использую это как базовую карту для всех настроек моих проектов, поэтому я включу в нее такие вещи, как базовые размеры шрифтов и еще много чего.

// Breakpoint mixin
@mixin break($screen-min: null, $screen-max: null, $orientation: null) {
  $min: $screen-min;
  $max: $screen-max;
  $o: $orientation;
  $query: unquote("only screen");
  @if $min != null and $min != "" {
    @if map-has-nested-keys($base, sizes, $screen-min) {
      $min: map-deep-get($base, sizes, $screen-min, breakpoint);
    }
    @else {
      $min: $screen-min;
    }
    @if is-number($min) {
      $query: append($query, unquote("and (min-width: #{$min})"));
    }
  }
  @if $max != null and $max != "" {
    @if map-has-nested-keys($base, sizes, $screen-max) {
      $max: map-deep-get($base, sizes, $screen-max, breakpoint);
    }
    @else {
      $max: $screen-max;
    }
    @if is-number($max) {
      $query: append($query, unquote("and (max-width: #{$max})"));
    }
  }
  @if $orientation == landscape or $orientation == portrait {
    $o: $orientation;
    $query: append($query, unquote("and (orientation: #{$o})"));
  }
  @else {
    $o: null;
  }
  @media #{$query} {
    @content;
  }
};

Вот миксин.Вы можете использовать ключи из карты размеров (xs, sm, md, lg) для первых двух аргументов или использовать пользовательские значения (например, 30em).Третий аргумент принимает либо пейзаж, либо портрет.Вы можете даже настроить микс в make l = landscape и p = Portrait, если хотите.

Кроме того, если вы хотите, например, только ориентацию, вы можете передать аргументы (null, null, landscape).

Для наглядности приведем несколько примеров:

@include break(null, md, landscape) {
  ...
}

@include break(null, null, landscape) {
  ...
}

@include break(md) {
  ...
}

@include break(null, md) {
  ...
}

@include break(480px) {
  ...
}

Вывод:

@media only screen and (max-width: 992px) and (orientation: landscape) {
  ...
}
@media only screen and (orientation: landscape) {
  ...
}
@media only screen and (min-width: 992px) {
  ...
}
@media only screen and (max-width: 992px) {
  ...
}
@media only screen and (min-width: 480px) {
  ...
}
0 голосов
/ 20 апреля 2019

Я нашел решение.

Можно объединить sass mixin, вложив их, поэтому я создал следующий mixin в моем файле _mixins.scss:

@mixin orientation($direction) { 

  $orientation-landscape: "(orientation:landscape)"; 
  $orientation-portrait: "(orientation:portrait)";

  @if $direction == landscape {
    @media #{$orientation-landscape} { @content; } 
  }
  @if $direction == portrait {
    @media #{$orientation-portrait} { @content; } 
  }
} 

Примечание: я не сделалне ставьте «и» в значение переменной: «и (ориентация: ландшафт)».Я полагаю, SASS или загрузчик поместили его автоматически.

Затем в свой файл SCCS я добавил следующие правила:

@include media-breakpoint-down(sm) {
  @include orientation(landscape) {
    .path-frontpage header {
      display: none !important;
    }
    .path-frontpage .navbar {
      display: none !important;
    }
  }
}

Примечание: в моем первом посте яговорил, что вложенные мной правила CSS были применены ко всем точкам останова, потому что когда генерируется CSS, точка останова SASS Bootstrap 4 XS не записывается, я полагаю, это потому, что значение равно 0. Таким образом, запрос медиа ориентации былне объединяется со значением минимальной ширины.Поэтому я изменил значение на max-width вместо min-width, так как точка останова Bootstrap 4 SM имеет значение 576px.

Результат в файле CSS - это то, что я хотел:

@media (max-width: 767.98px) and (orientation: landscape) {
  .path-frontpage header {
    display: none !important;
  }
  .path-frontpage .navbar {
    display: none !important;
  }
}

Надеюсь, это поможет сообществу.

...