SCSS — уменьшите код стиля на 50%

SCSS
Sass — это расширение языка CSS3, оно может помочь вам писать лучшие таблицы стилей с меньшими трудностями, освободить вас от повторяющейся работы и сделать вашу работу более творческой. Поскольку вы можете быстрее принять изменения, вы также решитесь на инновации в дизайне. Вы пишете таблицы стилей, которые могут обрабатывать изменение цветов или тегов HTML, и компилируете стандартный код CSS для различных производственных сред. Синтаксис Sass относительно прост, но сложность заключается в том, как применить Sass к реальным проектам, чтобы решить болевые точки CSS, тем самым повысив нашу эффективность. После изучения реальных проектов, следующие 14 практических опытов обобщаются и делятся ими, надеясь помочь каждому расширить свое мышление и лучше применять Sass к реальным проектам. В проекте мы используем поддержку традиционного CSS-подобного синтаксиса — Scss, поэтому в следующем обзоре опыта проекта в качестве примера используется Scss.

1. Использование переменной $

Мы можем повторно использовать значения атрибутов через переменные, такие как цвет, размер границы, путь к изображению и т. д., чтобы мы могли изменить одно место, чтобы внести глобальные изменения, чтобы добиться функции «скининга».
Пример 1: Наша библиотека компонентов использует переменную конфигурацию для равномерного изменения цвета, размера шрифта и т. д. компонентов (скиннинг):

$color-primary: #3ecacb;
$color-success: #4fc48d;
$color-warning: #f3d93f;
$color-danger: #f6588e;
$color-info: #27c6fa;
Пример 2. Конфигурация образа и глобальный импорт
Использование изображений в Scss может иметь следующие две проблемы:
(1) Если файл стиля и файл vue, использующий файл стиля, не находятся в одном каталоге, изображение не будет найдено.
(2) Если переменная конфигурации пути к изображению написана в стиле vue-файла, но такое написание приводит к разделению образа и стиля
Мы можем записать путь к изображению в качестве файла конфигурации, а затем импортировать его по всему миру, так что путь изображения может быть изменен равномерно (и этот метод будет загружен только при использовании соответствующего изображения, и не приведет к дополнительным проблемам производительности):

$common-path: './primary/assets/img/';
$icon-see: $common-path+'icon-see.png';
$icon-play: $common-path+'icon-play.png';
$icon-comment: $common-path+'icon-comment.png';
$icon-checkbox: $common-path+'icon-checkbox.png';

2, @ Импорт файла Импорт SCSS

(1) Правило @import в Css, которое позволяет импортировать другие файлы css в один файл css. Однако следствием этого является то, что браузер будет загружать другие файлы css только при выполнении @import, что приводит к очень медленной загрузке страницы.
(2) Правило @import в Scss, разница в том, что правило @import в scss импортирует соответствующие файлы при создании файла css. Это означает, что все связанные стили группируются в один и тот же файл css без инициирования дополнительного запроса на загрузку.
Пример 1. Импортируйте файл стиля компонента в index.sccs единообразно в библиотеке компонентов., а затем, если в проекте есть место, где библиотека компонентов используется, вам нужно только импортировать файл index.scss при входе в проект и импортировать файлы стилей каждого компонента в файл index.scss как следует:

@import "./base.scss";
@import "./webupload.scss";
@import "./message-hint.scss";

3. Использование локального именования файлов

Имя частичного файла scss начинается с подчеркивания. Таким образом, scss не будет компилировать этот файл отдельно для вывода css во время компиляции, а будет использовать этот файл только как импорт. При использовании scss миксины микшера являются наиболее подходящим вариантом использования, потому что микшеру не нужно отдельно компилировать выходные файлы css.
Пример 1: Запишите имя микшера как локальный метод именования файлов, как показано на следующем рисунке.

4. Вложенные функции Scss и идентификаторы родительского селектора

Мы можем использовать вложенные функции и идентификатор родительского селектора, чтобы уменьшить повторяющийся код, особенно если вы используете соглашение об именах БЭМ для классов CSS, именование классов стилей имеет проблемы с многословием. Использование этой функции позволяет решить проблему длинного БЭМ-именования, а стиль становится более читабельным.
Пример 1: Вложенные функции и идентификаторы родительского селектора и решение многословия БЭМ:

.tea-assignhw { 
 &__top {  
  margin: 0;  
} 
 &__content { 
   padding-left: 45px; 
 }  
&__gradeselect { 
   width: 158px;  
 }
}
Пример 2:Использование дочерних селекторов, родственных селекторов и селекторов псевдоклассов во вложенности
(1) Подселектор

&__hint {
  margin: 20px;  
  font-size: 14px;  
  > p:first-child { 
     font-weight: bold;  
 }
}
(2) Выбор брата

&__input { 
 width: 220px; 
 & + span {   
   margin-left: 10px;  
 }
}
(3) Селектор псевдокласса

&__browse {
  background: url($btn-search) no-repeat;  
&:hover {   
  background: url($btn-search) -80px 0 no-repeat;  
}  
&:visited {  
  background: url($btn-search) -160px 0 no-repeat; 
 }
}

5. Использование директив @mixin и @extend

Переменные позволяют повторно использовать значения свойств, но что, если вы хотите повторно использовать часть правил? Традиционный подход заключается в том, что если в таблице стилей
Если будут обнаружены дубликаты, общие правила будут извлечены и помещены в новые классы CSS.
Директивы наследования микшера @mixin и @extend можно использовать в Scss для решения упомянутого выше сценария повторного использования большого блока правил. Но в чем разница между двумя сценариями использования?
(1) Основное преимущество @mixin в том, что он может принимать параметры. Если вы хотите передать параметры, вы, естественно, выберете @mixin вместо @extend, потому что @extend не может принимать параметры.
(2) Поскольку правила микшера смешаны с другими классами, невозможно полностью избежать повторения в выходной таблице стилей. Наследование селекторов означает, что селектор может повторно использовать все стили другого селектора, но не выводить повторно эти атрибуты стиля; то есть используйте @extend для генерацииDRY CSSСтилизованный код (не повторяйтесь)
Подводя итог, если вам нужно передать параметры, вы можете использовать только микшер @mixin, в противном случае лучше использовать наследование @extend.
Пример 1: Использование микшера @mixin

@mixin paneactive($image, $level, $vertical) { 
  background: url($image) no-repeat $level $vertical;  
  height: 100px;  
  width: 30px; 
  position: relative;  
  top: 50%;
}
&--left-active {  
  @include paneactive($btn-flip, 0, 0);
}
&--right-active { 
  @include paneactive($btn-flip, 0, -105px);
}
Пример 2: Использование наследования @extend

.common-mod {  
  height: 250px;  
  width: 50%;  
  background-color: #fff;  
  text-align: center;
}
&-mod { 
  @extend .common-mod;  
  float: right;
}
&-mod2 { 
  @extend .common-mod;
}

6. Использование значений параметров по умолчанию для микшеров @mixin

Нет необходимости передавать все параметры при @include микшере, мы можем указать значение по умолчанию для параметра, если передаваемый параметр является значением по умолчанию, то параметр можно опустить при @include; если параметр должен быть передано не значение по умолчанию, новые параметры передаются при использовании @include.
Пример 1: Использование значений параметров микшера @mixin по умолчанию

@mixin pane($dir: left) {  
  width: 35px; 
  display: block;  
  float: $dir;  
  background-color: #f1f1f1;
}
&__paneleft { 
  @include pane;
}
&__paneright {
  @include pane(right);
}

7. Использование интерполяции #{}

Переменные можно использовать в селекторах или именах свойств с помощью оператора интерполяции #{}. Когда есть две страницы с похожими стилями, мы будем извлекать похожие стили в микшеры страниц, но имена двух разных стилей страниц не могут быть одинаковыми в соответствии с соглашением об именах БЭМ, в этом случае мы можем использовать интерполяцию для динамического именования.
Пример 1. Имя класса в микшере уровня страницы задается динамически с использованием интерполяции #{}

@mixin home-content($class) { 
 .#{$class} {   
   position: relative;    
   background-color: #fff;    
   overflow-x: hidden;    
   overflow-y: hidden;    
 &--left {     
    margin-left: 160px;  
 }    
 &--noleft {  
    margin-left: 0;  
 } 
 }
}

8. Использование операций

SassScript поддерживает такие операции, как сложение, вычитание, умножение и деление чисел (+, -, *, /, %).
Пример 1: Компонент ввода устанавливает левое и правое заполнение в соответствии с высотой поля ввода следующим образом:

.ps-input { 
   display: block;  
   &__inner {   
    -webkit-appearance: none;  
     padding-left: #{$--input-height + 10
   };    
     padding-right: #{$--input-height + 10
   };    
  }
}

9. Применение связанных функций scss

scss поставляется с некоторыми функциями, такими как hsl, функция микширования и т. д.
Пример 1: Цвет щелчка компонента кнопки должен смешивать несколько цветов вместе в соответствии с определенным соотношением для создания другого цвета.Следующим образом:

&:focus { 
  color: mix($--color-white, $--color-primary, $--button-hover-tint-percent);  
  border-color: transparent;  
  background-color: transparent;}
&:active {  
  color: mix($--color-black, $--color-primary, $--button-active-shade-percent); 
  border-color: transparent;  background-color: transparent;
}

10. Применение связанных функций scss

Инструкция @for может повторять шаблон вывода в ограниченном диапазоне и каждый раз изменять результат вывода в соответствии со значением переменной.
Пример 1: Например, в проекте вам нужно установить стиль дочерних узлов div со 2-го по 8-й в классе hwicon.,Следующим образом:

@for $i from 2 through 8 {  
.com-hwicon {    
 > div:nth-child(#{$i}) {   
   position: relative;    
   float: right;   
  }  
 }
}

11, каждый обход, тип данных карты, микшер @mixin/@include, комбинированное использование интерполяции #{}

Различные классы селекторов могут быть созданы путем объединения каждого обхода, типа данных карты, микшера @mixin/@include, интерполяции #{}, а фоновое изображение в каждом классе селектора отличается, как показано ниже:

$img-list: (  
 (accessimg, $papers-access),   
 (folderimg, $papers-folder),  
 (bmpimg, $papers-bmp),   
 (xlsimg, $papers-excel),   
 (xlsximg, $papers-excel),   
 (gifimg, $papers-gif),  
 (jpgimg, $papers-jpg),   
 (unknownimg, $papers-unknown)
);

@each $label, $value in $img-list { 
 .com-hwicon__#{$label} {
    @include commonImg($value); 
 }
}

12. Проверка и проверка кода стиля — плагин stylelint

CSS нельзя рассматривать как язык программирования в строгом смысле этого слова, но нельзя недооценивать его в интерфейсной системе. CSS — это таблица стилей, основанная на описании.Если описание запутанно и не содержит правил, оно должно быть бомбой замедленного действия для других разработчиков, особенно для людей с обсессивно-компульсивным расстройством. CSS может показаться простым, но написать красивый CSS довольно сложно. Поэтому действия по проверке правил CSS неизбежны. stylelint — это мощная современная программа проверки CSS, которая позволяет разработчикам следовать согласованным соглашениям и избегать ошибок в таблицах стилей.
(1) Вам необходимо установить gulp, stylelint, gulp-postscss, postcss-reporter, stylelint-config-standard,Команда установки:

npm install gulp stylelint gulp-postscss  postcss-reporter 
stylelint-config-standard--save-dev
(2) После завершения установки в корневом каталоге проекта будет создан файл gulpfile.js.Файл gulpfile.js настроен как:

var reporter = require('postcss-reporter');
var stylelint = require('stylelint');
var stylelintConfig = {  
  'extends': 'stylelint-config-standard',  
  'rules': {    
  'at-rule-no-unknown': [
     true, {      
     'ignoreAtRules': [   
     'extend',        
     'include',        
     'mixin',       
     'for'      
     ]    
    }
   ]
  }
};
gulp.task('scss-lint', function() { 
   var processors = [    
   stylelint(stylelintConfig),    
   reporter({      
     clearMessages: true,      
     throwError: true    
   })  
   ];  
 return gulp.src(  
   ['src/style/*.scss']// 需要工具检查的scss文件 
  ).pipe(postcss(processors));});
 gulp.task('default', ['scss-lint']);
(3) правила проверки stylelint-config-standard
stylelint-config-standard — стандартное правило проверки, официально рекомендованное stylelint. Конкретные правила проверки можно найти на официальном сайте.

(4) Запустите команду для проверки стиля,Как показано ниже


13. Плагин автоматического восстановления стилей - плагин stylefmt

stylefmt — это инструмент для исправления кода, основанный на stylelint.Его можно настроить на основе соглашений спецификации кода stylelint, а форматированный вывод можно изменить.
(1) Файл конфигурации gulp.js выглядит следующим образом:

var stylefmt = require('gulp-stylefmt'); // css格式自动调整工具
gulp.task('stylefmt', function() {
  return gulp.src(   
  ['src/style/student/index.scss' // 需要工具检查的scss文件    
  ]).pipe(stylefmt(stylelintConfig))
    .pipe(gulp.dest('src/style/dest/student'));});
 gulp.task('fix', ['stylefmt']);
(2) Запустите команду для восстановления стиля, как показано на следующем рисунке.


14. Скомпилируйте синтаксис scss в синтаксис css — плагин gulp-sass

При написании кода scss в первый раз из-за незнания синтаксиса и т. д. эффект страницы, получаемый написанным кодом scss, не тот, что нам нужен. В настоящее время мы можем использовать плагин gulp-sass для мониторинга кода scss и генерации кода css в режиме реального времени, чтобы мы могли судить о правильности написанного кода scss, просматривая код css.
(1) Файл конфигурации gulp.js выглядит следующим образом:

var gulpsass = require('gulp-sass');
gulp.task('gulpsass', function() { 
  return gulp.src('src/style/components/hwIcon.scss')    
  .pipe(gulpsass().on('error', gulpsass.logError))   
  .pipe(gulp.dest('src/style/dest'));});
  gulp.task('watch', function() {  
  gulp.watch('src/style/components/hwIcon.scss', ['gulpsass']);
});
(2) Запустите команду для мониторинга файла scss и динамически скомпилируйте код scss для создания файла кода css, как показано на следующем рисунке.


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