SASS соблюдает порядок примесей

Как я могу заставить SASS соблюдать порядок миксина:

Вход SASS:

@mixin containerMargins {
  margin: 4rem 10vw;


    @media only screen and (min-width: 768) {
        margin: 7rem 10vw;
    };

    @media only screen and (min-width: 1024) {
        margin: 7rem 20vw;
    };
}

.myContainer {
  @include containerMargins;
  margin-top: 0;
}

Выход SASS:

.myContainer {
  margin: 4rem 10vw;
  margin-top: 0;  /* I want this to be at the bottom */
}
@media only screen and (min-width: 768) {
  .myContainer {
    margin: 7rem 10vw;
  }
}
@media only screen and (min-width: 1024) {
  .myContainer {
    margin: 7rem 20vw;
  }
}

Желаемый результат:

.myContainer {
  margin: 4rem 10vw;
}
@media only screen and (min-width: 768) {
  .myContainer {
    margin: 7rem 10vw;
  }
}
@media only screen and (min-width: 1024) {
  .myContainer {
    margin: 7rem 20vw;
  };
}
.myContainer {
  margin-top: 0;
}

Как я могу сделать так, чтобы margin-top был последним? т. е. все в миксине (включая запросы @media) должно стоять перед margin-top. Это возможно?

Что вы имеете в виду at the bottom? Если вы посмотрите на свой вывод, запросы media ВНЕ вашего класса. Кроме того, вам нужно добавить px к вашим размерам min-width, иначе ваши медиа-запросы все равно ничего не сделают.

disinfor 18.07.2019 20:05

@disinfor Обновил вопрос, указав, что я хочу, надеюсь, он более понятен.

A H 18.07.2019 20:17

Ваш вывод недействителен. Посмотрите, где находится margin-top: 0. Это вне всех селекторов. Вы хотите margin-top: 0 внутри запроса media?

disinfor 18.07.2019 20:26
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
3
202
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Самый простой способ, которым я бы пошел, это:

.myContainer { 
    @include containerMargins;
}
.myContainer {margin-top: 0; }

Это действительно работает. Интересно, есть ли менее хакерский ответ.

A H 18.07.2019 20:20

похоже, что вы удваиваете верхнюю часть поля здесь в сокращении:

margin: 4rem //-> Верх + низ 10vw // лево + право-> ;

а затем добавив «margin-top: 0;

Попробуйте что-то вроде этого:

@mixin containerMargins {

    @media only screen and (min-width: 768) {
        margin: 7rem 10vw;
    };

    @media only screen and (min-width: 1024) {
        margin: 7rem 20vw;
    };
}

.myContainer {
  @include containerMargins;
  margin-top: 0;
}

OR


@mixin containerMargins {
  margin: 4rem 10vw;

    @media only screen and (min-width: 768) {
        margin: 7rem 10vw;
    };

    @media only screen and (min-width: 1024) {
        margin: 7rem 20vw;
    };
}

.myContainer {
  @include containerMargins;
}

В зависимости от желаемого результата.

Ответ принят как подходящий

Я бы создал параметры для вашего миксина, чтобы вы могли передать значение свойства margin-top:

@mixin containerMargins( $sm:'', $md:'', $lg:'' ) {
  margin: 4rem 10vw;
  margin-top: #{$sm};


    @media only screen and (min-width: 768) {
        margin: 7rem 10vw;
        margin-top: #{$md};
    };

    @media only screen and (min-width: 1024) {
        margin: 7rem 20vw;
        margin-top: #{$lg};
    };
}

.myContainer {
  @include containerMargins('','','0');
}

Это выводит:

.myContainer {
  margin: 4rem 10vw;
}
@media only screen and (min-width: 768) {
  .myContainer {
    margin: 7rem 10vw;
  }
}
@media only screen and (min-width: 1024) {
  .myContainer {
    margin: 7rem 20vw;
    margin-top: 0;
  }
}

Если вы оставите параметры @include containerMargins(); пустыми, он выведет этот CSS:

.myContainer {
  margin: 4rem 10vw;
}
@media only screen and (min-width: 768) {
  .myContainer {
    margin: 7rem 10vw;
  }
}
@media only screen and (min-width: 1024) {
  .myContainer {
    margin: 7rem 20vw;
  }
}

Тогда это не повлияет на свойство margin-top.

Именно то, что мне было нужно, спасибо. Использование наследования действительно сломало мой css.

A H 18.07.2019 20:45

Потрясающий! Да, я удалил его. Я забыл, что inherit берет стиль от родителя. Обновленный ответ полностью удаляет свойство, если в качестве параметра явно не передается значение.

disinfor 18.07.2019 22:34

Другие вопросы по теме