SASS, когда продлить?

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

Вот несколько примеров _Common.scss, которые импортируются и используются во всех других sass файлах:

.visibility-hidden{visibility: hidden;}
.display-inline { display: inline; }
.display-inline-block { display: inline-block; }
.display-block { display: block; }
.display-none { display: none; }
.display-box { display: box; }

.float-left { float: left; }
.float-right { float: right; }
.clear-both { clear: both; }

.width-percent-100 { width: 100%; }
.width-percent-65 { width: 65%; }
.width-percent-50 { width: 50%; }
.width-percent-45 { width: 45%; }
.width-percent-40 { width: 40%; }
.width-percent-33 { width: 33%; }
.width-percent-30 { width: 30%; }
.width-percent-20 { width: 20%; }

.height-percent-100 { height: 100%; }

.cursor-pointer { cursor: pointer; }

.underline { text-decoration: underline; }
.text-decoration-none { text-decoration: none; }
.bold { font-weight: bold; }
.font-weight-normal { font-weight: normal; }
.text-align-center { text-align: center; }
.text-align-left { text-align: left; }
.text-align-right { text-align: right; }

.font-10 { font-size: 10px; }
.font-11 { font-size: 11px; }
.font-12 { font-size: 12px; }
.font-13 { font-size: 13px; }
.font-14 { font-size: 14px; }
.font-15 { font-size: 15px; }
.font-16 { font-size: 16px; }
.font-17 { font-size: 17px; }
.font-18 { font-size: 18px; }

.font-percent-65 { font-size: 65%; }
.font-percent-80 { font-size: 80%; }
.font-percent-90 { font-size: 90%; }
.font-percent-100 { font-size: 100%; }
.font-percent-110 { font-size: 110%; }
.font-percent-120 { font-size: 120%; }
.font-percent-130 { font-size: 130%; }
.font-percent-140 { font-size: 140%; }
.font-percent-150 { font-size: 150%; }
.font-percent-160 { font-size: 160%; }
.font-percent-170 { font-size: 170%; }
.font-percent-180 { font-size: 180%; }

Пример:

#CategoriesContainer
{
  ul{
    li{
        &:first-child{
          @extend .font-11;
        }
        a
        {
          @extend .font-11;
          @extend .text-decoration-none;
        }
    }
  }
}

Ответ 1

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

Лучший пример для расширения можно найти в справочном руководстве

Скажем, у нас есть 2 класса

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.seriousError {
  border-width: 3px;
}

.error - общий не интересный стиль, но серьезная ошибка должна быть действительно понятной.

.seriousError создается для утолщения строки, единственная проблема заключается в том, что теперь мы должны использовать оба класса в html для объединения стилей.

Поскольку мы ленивы и просто хотим использовать один класс, а не дублирующий код, который может быть изменен в будущем, мы можем расширить .seriousError с помощью .error

.seriousError {
  @extend .error;
  border-width: 3px;
}

Теперь мы не дублировали код в нашем sass файле, но получили правильные стили на странице.

Ознакомьтесь с справочным руководством для получения более/лучших примеров.

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

Вы и ваша команда должны прочитать это сообщение, что объясняет некоторые проблемы с aproach, которые вы принимаете здесь, вместо семантического кода. Не удалось найти улучшенную настройку.

Ответ 2

Вы ничего не пропустили, это просто раздутый код в плохом виде и отличный способ продлить классы.

Возможно, одна (плохая) причина, я могу себе представить, почему это будет использоваться. Если, например, .font-10 должен быть .7em вместо 10px, его можно легко изменить - , но, то вы просто победили точку именования класса "font10". Что-то вроде small-font будет иметь больше смысла в этом случае (и я не предлагаю вам это использовать).

Я не буду обсуждать достоинства семантических названий классов и глупость презентационных (особенно как литерал, как они есть), но я буду предлагать, что это очень узкое использование расширяющих классов. При сопоставлении 1:1 имени класса с свойством/значением вы практически победили цель @extend, которая должна заставить вас писать меньше CSS.

Лучший пример использования @extend для:

.media {
    padding:1em;
    border-color:blue;
    background-color:red;
    clear:left;
}

.my-media {
    @extend .media;
    background-color:green;
}

Ответ 3

Атомный CSS

Техника очень простых правил CSS имеет немного прецедента - на Yahoo! они называют это Atomic CSS. Тьерри Кобленц утверждает в эту статью Smashing Magazine для использования простых классов непосредственно в вашей разметке, аналогично встроенному стилю. Это может быть полезно при очень больших проектах через несколько веб-свойств, где стили несовместимы. Базовые стили для компонентов OOCSS нельзя использовать повторно в такой ситуации, заставляя вас писать еще много строк расширений или переопределений.

Недостатком, конечно же, является Уэсли, что гораздо сложнее внести изменения во все стили проекта, например, обновить размер текста специфический селектор.

Недавно я играл с вариантом этой техники в довольно большом проекте, где стили часто бывают разовыми. Стремясь избежать этого, я стараюсь избегать ввода жестких значений непосредственно в селекторах. Например, следующий css (пример скрипта):

_colors.scss

.text-white {
  color: $white;
}

.blue {
  @extend .text-white;
  background: $blue;
}

_effects.scss

.circle {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  text-align: center;
  line-height: 50px;
  font-size: 40px;
}

.matted {
  border: 4px solid $white;
}

.shadow {
  @include box-shadow(0 1px 4px 1px rgba($black, 0.25));
}

HTML:

<div class="blue matted circle shadow">?</div>

Проблемы с конкретностью

Последнее, что нужно иметь в виду, если вы решите использовать этот метод - это может вызвать проблемы с конкретностью, если вы расширяете классы базового уровня, которые используют одни и те же свойства CSS. Например, в следующем примере (fiddle), как бы появился ваш пограничный радиус? Вы хотели, чтобы верхняя часть была квадратной (без радиуса границы), но этого не происходит, потому что класс .circle находится ниже в вашем css и точно так же специфичен (один класс), как и другие эффекты. Это немного надуманный пример, но если вы повторно используете свойства CSS для своих атомных селекторов, это может быть реальной проблемой.

_colors.scss

.text-white {
  color: white;
}

.blue {
  @extend .text-white;
  background: royalblue;
}

_effects.scss

.squared-top {
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}

.rounded {
  border-radius: 10px;
}

.circle {
  width: 50px;
  height: 50px;
  border-radius: 50%;
}

HTML:

<span class="circle blue rounded squared-top"></span>

Ответ 4

Если вы это сделаете, вы также можете использовать его непосредственно в HTML-формате, так что похоже, что они взяли путь OOCSS и потому что он уже находится в CSS, теперь вы можете также расширить его. Очень гибкий, но он также может стать очень грязным.