Страницы

Поиск по вопросам

Показаны сообщения с ярлыком scss. Показать все сообщения
Показаны сообщения с ярлыком scss. Показать все сообщения

пятница, 14 февраля 2020 г.

Логика работы SASS SCSS и LESS?

#sass #scss #less


Хочу понять в теории, как работают css препроцессоры SASS SCSS и LESS.


Браузер не читает напрямую данные из .sass (например) файла, нужно вначале скомпилировать
.sass > .css?
Т.е. получается, что .sass файлы являются что-то вроде 'базовой' библиотеки стилей,
из которой потом 'лепится' уже готовый набор .css файлов?

    


Ответы

Ответ 1



Браузер не читает напрямую данные из .sass (например) файла, нужно вначале скомпилировать .sass > .css? Браузер может работать только с CSS и для этого sass компилируется в CSS Т.е. получается, что .sass файлы являются что-то вроде 'базовой' библиотеки стилей, из которой потом 'лепится' уже готовый набор .css файлов? sass это не "базовая библиотека" она сама по себе не содержит никаких стилей, sass это другой формат стилей и после компиляции получается обычный css который уже используется браузером. sass даёт большие возможностей, часто облегчает вёрстку и делает стили лучше читаемыми для разработчика. Примерно такая же ситуация и с LESS.

воскресенье, 26 января 2020 г.

Как в scss/sass импортировать не весь файл, а один стиль запретить?

#css #bootstrap #sass #scss


В bootstrap есть стиль для ссылок и кнопок, выделение точками вокруг элемента + цвет
+ подчеркивание на событии :focus, выглядит это так:

a {
  color: $link-color;
  text-decoration: none;

  &:hover,
  &:focus {
    color: $link-hover-color;
    text-decoration: $link-hover-decoration;
  }

  &:focus {
    @include tab-focus;
  }


и

@mixin tab-focus() {
  // Default
  outline: thin dotted;
  // WebKit
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}


Если outline: none; еще можно сделать после импорта .scss в своем файле, но что делать
с цветом и подчеркиванием, если нужно, чтобы цвет и подчеркивание сохранялись те, что
и были, то есть если была синяя ссылка с подчеркиванием, то при клике она должна оставаться
такой же. Если же прописать конкретный цвет и подчеркивание, то для другой, например
красной ссылки без подчеркивания, она будет изменяться, а не оставаться собой.

То есть, нужно вообще не импортировать эти стили или как то удалить их после импорта.
Ведь редактировать исходники .scss неправильно? Тогда как удалить все :focus ы? 
    


Ответы

Ответ 1



В данном случае необходимо писать свой миксин наподобие @mixin tab-focus(), только с указанием параметров, которые вы сможете указывать для конкретных классов. получается @mixin tab-focus($outline_dotted, $outline_offset, $outline_size ) { outline: $outline_dotted; // WebKit outline: $outline_size ; outline-offset: $outline_offset } a{ &:focus { @include tab-focus('none', '-2px', '5px'); } }

пятница, 24 января 2020 г.

Автоматическое создание style guide для сайта

#javascript #scss #style_guide


Мудрые люди подскажите пожалуйста, что лучше использовать для автоматизированного
создания style guide из комментариев в scss

Буду очень признательна

UPD 

Пример комментариев:

// A button suitable for giving a star to someone. 
// :hover - Subtle hover highlight. 
// .star-given - A highlight indicating you've already given a star. 
// .star-given:hover - Subtle hover highlight on top of star-given styling. 
// .disabled - Dims the button to indicate it cannot be used.

    


Ответы

Ответ 1



Предполагаю, что отличным вариантом станет инструмент KSS, пример комментариев вы сами и привели, и который работает с SCSS. Собственно, пример комментариев с кодом: // A button suitable for giving stars to someone. // // :hover - Subtle hover highlight. // .stars-given - A highlight indicating you’ve already given a star. // .stars-given:hover - Subtle hover highlight on top of stars-given styling. // .disabled - Dims the button to indicate it cannot be used. // // Styleguide 2.1.3. a.button.star{ … &.star-given{ … } &.disabled{ … } } И пример генерируемой доки - http://primercss.io/buttons/ P.S. Все примеры с оффсайта.

среда, 22 января 2020 г.

Почему scss так компилирует переменные?

#css #css3 #scss #шрифты


Этот вопрос касается Icomoon в целом.

Не могу разобраться почему scss так компилит символы, но они работают, если в пути
к шрифту указан не только шрифт, но и кэш шрифта.

Связанный вопрос: что это за кэш?



$icomoon-font-path: "fonts" !default;
$icon-bell: "\e900";
$icon-like: "\e901";
$icon-paceholder: "\e902";
$icon-search: "\e903";
$icon-star: "\e904";
$icon-vision: "\e905";
$icon-vision-off: "\e906";
$icon-angle-left: "\e907";
$icon-angle-right: "\e908";
$icon-arrow-right: "\e909";
$icon-angle-bottom: "\e90a";
$icon-chat-angle-bottom: "\e90b";
$icon-chat-angle-top: "\e90c";






@import "variables";

@font-face {
  font-family: 'Icomoon';
  src:  url('#{$icomoon-font-path}/Icomoon.eot?r3waic');
  src:  url('#{$icomoon-font-path}/Icomoon.eot?r3waic#iefix') format('embedded-opentype'),
    url('#{$icomoon-font-path}/Icomoon.ttf?r3waic') format('truetype'),
    url('#{$icomoon-font-path}/Icomoon.woff?r3waic') format('woff'),
    url('#{$icomoon-font-path}/Icomoon.svg?r3waic#Icomoon') format('svg');
  font-weight: normal;
  font-style: normal;
}

[class^="icon-"], [class*=" icon-"] {
  /* use !important to prevent issues with browser extensions that change fonts */
  font-family: 'Icomoon' !important;
  speak: none;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  text-transform: none;
  line-height: 1;

  /* Better Font Rendering =========== */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.icon-bell {
  &:before {
    content: $icon-bell;
  }
}
.icon-like {
  &:before {
    content: $icon-like;
  }
}
.icon-paceholder {
  &:before {
    content: $icon-paceholder;
  }
}
.icon-search {
  &:before {
    content: $icon-search;
  }
}
.icon-star {
  &:before {
    content: $icon-star;
  }
}
.icon-vision {
  &:before {
    content: $icon-vision;
  }
}
.icon-vision-off {
  &:before {
    content: $icon-vision-off;
  }
}
.icon-angle-left {
  &:before {
    content: $icon-angle-left;
  }
}
.icon-angle-right {
  &:before {
    content: $icon-angle-right;
  }
}
.icon-arrow-right {
  &:before {
    content: $icon-arrow-right;
  }
}
.icon-angle-bottom {
  &:before {
    content: $icon-angle-bottom;
  }
}
.icon-chat-angle-bottom {
  &:before {
    content: $icon-chat-angle-bottom;
  }
}
.icon-chat-angle-top {
  &:before {
    content: $icon-chat-angle-top;
  }
}





    


Ответы

Ответ 1



Sass при компиляции utf-8 юникод файлов - переводит подобные вашим последовательности в юникод-символы. Почему вы видите квадраты вместо символов в редакторе? Потому что в вашем моноширинном шрифте эти символы не отрисованы. Но они отрисованы в шрифте Icomoon, который подключается на сайте, и там в итоге символы корректно отображаются. Резюмируя: Это нормальное поведение, и по поводу скомпилированных символов беспокоиться не стоит. Однако, если вдруг ваши файлы хранятся в ASCII-кодировке - Sass все равно будет компилировать символы в них, хотя по логике - не должен. На гитхабе уже 3 года висит открытый тикет по теме. Можно почитать, но разумный способ решения - перевести свои стили в utf-8-кодировку.

Ответ 2



Это известная бага, можно экранировать, например так: $icon-like: "e901"; @function unicode($str) { @return unquote("\"")+unquote(str-insert($str, "\\", 1))+unquote("\""); } .icon-like { &:before { content: unicode($icon-like); } } А ещё достаточно компактно и изящно получается, если использовать списки, а не отдельные переменные: $icons: ( bell: "e900", like: "e901", paceholder: "e902", search: "e903", star: "e904", vision: "e905", vision-off: "e906", angle-left: "e907", angle-right: "e908" ); @each $name, $str in $icons { .icon-#{$name}:before { content: unquote("\"")+unquote(str-insert($str, "\\", 1))+unquote("\""); } }

суббота, 11 января 2020 г.

Конвертация SCSS в SASS

#вёрстка #sass #scss #map #препроцессор


Большой проект, написан на SASS и использованием синтаксиса SASS, а не SCSS. Поэтому
изменить файл на SCSS не вариант, так как их очень много. 

Нужно использовать ассоциативные массив(map) подобного вида:

$primary-colors: (
  "red":   "#ff0000",
  "green": "#00ff00",
  "blue":  "#0000ff"
);


Это синтаксис SCSS, а мне нужен SASS. На конструкцию такого вида компилятор ругается:


  Error: unclosed parenthesis
  
  on line 394 of style/_intro-val.sass
  
  $primary-colors: ( {    ----------------^


Как исправить написание? Кто-нибудь сталкивался с такой проблемой? Может быть заменить
скобку на какой-то другой символ или отступ определенный должен быть?
    


Ответы

Ответ 1



Нашла решение! Синтаксис SASS не поддерживает многострочность, это конечно портит простоту отладки кода и наглядность, однако проблема была решена вот так: $primary-colors: ("red": "#ff0000", "green": "#00ff00", "blue": "#0000ff"); Возможно кому-то пригодится.

четверг, 9 января 2020 г.

Ссылка на первого родителя SCSS

#css #scss


В SCCS есть  ссылка на родителя

Как сделать сссылку на первого ближайшего родителя

SCSS

.checkbox {
    input[type="checkbox"] {
        display: none;
    }

    .checkbox-label {
        display: inline-block;
        vertical-align: middle;
        font-size: 12px;

        &:before {
            content: "";
            display: inline-block;
            vertical-align: middle;
            width: 12px;
            height: 12px;
            border: 1px solid #CCC;
            margin-right: 5px;
        }

        input[type="checkbox"]:checked + & {

            &:before {
                background-color: #0066cc;
            }
        }
    }
}


На выходе получается CSS

 .checkbox input[type="checkbox"] {
  display: none;
 }

 .checkbox .checkbox-label {
      display: inline-block;
      vertical-align: middle;
      font-size: 12px;
 }

 .checkbox .checkbox-label:before {
        content: "";
        display: inline-block;
        vertical-align: middle;
        width: 12px;
        height: 12px;
        border: 1px solid #CCC;
        margin-right: 5px;
 }

 input[type="checkbox"]:checked + .checkbox .checkbox-label:before {
        background-color: #0066cc;
 }


Почему не применятся нужный стиль или как сделать &  как ссылка на первого ближайшего
родителя?

но стоит сделать строчку 

input[type="checkbox"]:checked + .checkbox-label:before {
        background-color: #0066cc;
 }


и стиль начинает работать

пример JSFIDDLE 
    


Ответы

Ответ 1



А может всё-таки немного БЭМа? .checkbox { &__input { display: none; } /* формируем БЭМ-элементы при помощи & получаем .checkbox__input */ &__label { display: inline-block; vertical-align: middle; font-size: 12px; /* получаем .checkbox__label и т. д. */ &:before { content: ""; display: inline-block; vertical-align: middle; width: 12px; height: 12px; border: 1px solid #CCC; margin-right: 5px; .checkbox__input:checked + & { background-color: #0066cc; } } } } Пример на кодпене.

Ответ 2



Или вот есть рабочий метод, но делать так я не рекомендую никому. .checkbox { input[type="checkbox"] { display: none; } .checkbox-label { display: inline-block; vertical-align: middle; font-size: 12px; &:before { content: ''; position: relative; display: inline-block; vertical-align: middle; width: 12px; height: 12px; border: 1px solid #CCC; margin-right: 5px; $a: str-insert(#{&}, " +", 10); /* добавляем в селектор & ' +' и записываем это в переменную $a. получаем селектор .checkbox + .checkbox-label:before */ $b: selector-replace(#{$a}, '.checkbox', 'input[type=checkbox]:checked'); /* заменяем при помощи функции selector-replace ".checkbox" на "input[type=checkbox]:checked" получаем селектор input[type=checkbox]:checked + .checkbox-label:before */ @at-root #{$b}:before { background-color: #0066cc; } /* чтобы избежать наследования селекторов используем @at-root и помещаем туда наш получившийся селектор */ } } } Пример на кодпене.

Конвертировать строку в число SCSS

#scss


Есть строка "14рх", как привести ее к числу в SCSS?
К примеру для строкового представления значения есть функция inspect($value), для
того, что бы узнать единицы связанные с числом есть unit($number).
Но как быть если type-of(14рх) возвращает string, а нужно namber.
Поясняю: 
есть такой код, который смотрит есть ли у значения списка единицы измерения и если
нет, то дописывает    

@function chekList($list) {
    $tmp: ();
    @each $key in $list {
        @if(unitless($key)) {
            $key: inspect($key);
            $key: str-insert($key, "px", str-length($key) + 1);
        }
        $tmp: append($tmp, $key);  
    }
    @return $tmp; 
}


Теперь бы еще конвертнуть полученные строковые значения в числовые....
Или посоветуйте как дописать единицы к числу, если их нет?    

P.S. Ниже я дал ответ как можно добавить единицы измерения, если их нет. Но все же
интересует как можно конвертировать строку в число.
Допустим 10 + "px" на выходе даст строку "10рх", а нужно, что бы это было число.
    


Ответы

Ответ 1



Вдруг кому-то пригодиться. Я не нашел функции преобразования строки в число, но что-бы добавить единицы измерения к числу, если их нет, можно просто умножить это число на единицу с нужными единицами измерения. @if(unitless($key)) { $key: $key * 1px; }

Ответ 2



Прочитав статью, ссылку на которую дал soledar10 я не стал дублировать полностью функцию предоставленную там, для моих целей она нужна не полностью, а лишь та часть, где к числу добавляются единицы измерения. Немного модифицировав код из предыдущего ответа получилось вот что: @function chekUnit($list) { $strings: 'px' 'cm' 'mm' '%' 'ch' 'pica' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax'; $units: 1px 1cm 1mm 1% 1ch 1pica 1in 1em 1rem 1pt 1pc 1ex 1vw 1vh 1vmin 1vmax; $tmp: (); @each $key in $list { @if(unitless($key)) { $index: index($strings, $list-unit); @if not $index { @error "Unknown unit `#{$list-unit}`."; } $key: $key * nth($units, $index); } $tmp: append($tmp, $key); } @return $tmp; } Где $list-unit - это переменная с задаваемыми единицами в настройках проекта.

Как подключать шрифты при сборке scss на webpack?

#шрифты #webpack #scss


Пользуясь гайдами, пытаюсь собрать все свои стили в одну сборку на Webpack.
Имеется главный файл, в него импортируется другой, в котором несколько правил @font-face
с путями к файлам шрифтов. При сборке Webpack выдаёт ошибку по этим путям, говорит:
нужен специальный загрузчик:


  ERROR in ./fonts/a_coppergothcaps-bold.ttf Module parse failed:
  Unexpected character ' ' (1:0) You may need an appropriate loader to
  handle this file type. (Source code omitted for this binary file)


Но мне не то чтобы нужно (или нужно?) добавлять эти файлы в сборку. Мне достаточно,
если в сборке останутся эти правила, и браузер сам подключит шрифты по ссылкам в них.
Как сказать Webpack, чтобы не пытался обрабатывать эти пути, но просто вставлял их,
как есть? 
Или я неправильно вижу решение проблемы? Может, я шрифтами неправильно распоряжаюсь?

Вот такие правила в конфиге: 

module: {
        rules: [
            {
                test: /\.scss$/,
                use: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: ['css-loader', 'sass-loader']
                })
            }
        ]
    },

    


Ответы

Ответ 1



Ссылка на полный конфиг Вот мой способ подключения шрифтов для SCSS: { test: /\.(eot|svg|ttf|woff|woff2)$/, use: [ { loader: 'file-loader?name=./assets/fonts/webfonts/[name].[ext]' }, { loader: 'file-loader?name=./assets/fonts/Roboto/[name].[ext]' } ] } Что бы это заработало нужно установить file-loader После этого нужно загрузить шрифты в SCSS: @font-face { font-family: 'Roboto Black'; src: url("/fonts/Roboto/Roboto-Black.ttf"); } Настройки webpack-dev-server: devServer: { contentBase: [path.resolve(__dirname, "build"), path.resolve(__dirname, "assets")], compress: true, port: 4200, historyApiFallback: true, noInfo:true } UPDATE 1 У меня описания шрифтов находятся в файле src/fonts.scss и файл src/variable.scss для хранения переменных размеров, цветов и т.п. В variable.scss импортируется fonts.scss -> @import "/fonts.scss"; и после этого в любом другом файле стилей можно импортировать variable.scss. В определении шрифтор должен указываться не относительный путь до файла, а url. Можно протестировать корректность вводимого адреса в браузере, например http://localhost:4200/fonts/Roboto/Roboto-Black.ttf, если было предложено сохранить файл значит все правильно.

Ответ 2



module: { rules: [ { test: /\.(svg|png|gif|jpg)$/, exclude: /fonts/, loader: 'file-loader', options: { name: '[name].[ext]' } }, { test: /\.(ttf|eot|woff|svg|woff2)$/, use: { loader: "file-loader", options: { name: `${PATHS.assets}css/fonts/[name].[ext]`, } } },plugins: [ new CopyWebpackPlugin([{ from: `${PATHS.source}/img`, to: `${PATHS.assets}img` }, { from: `${PATHS.source}/static`, to: '' }]) ]} Дабы избежать конфликта, я сделал так, благодарю что подняли этот вопрос, а также за данные на него ответы.

Последовательная задержка на Sass для дочерних элементов?

#html #css #sass #scss


Всем привет! Как с помощью Sass создать из этого более изящное решение для последовательного
увеличения transition-delay у дочерних элементов?

Вот, чтобы как в примере ZOE - последовательно показывались иконки соц.сетей.
Пример - пункт Zoe.

.myClass {
  &:nth-child(1) {
    transition: all 1s ease-out 0.5s;
  }
  &:nth-child(2) {
    transition: all 1s ease-out 0.7s;
  }
  &:nth-child(3) {
    transition: all 1s ease-out 0.9s;
  }
  &:nth-child(4) {
    transition: all 1s ease-out 1.1s;
  }
  &:nth-child(5) {
    transition: all 1s ease-out 1.3s;
  }
}

    


Ответы

Ответ 1



В Sass существует директива управления - @for. Её можно использовать для таких задач. (Рабочий пример на Codepen.io). Sass: //Создаём переменные для управления значениями $items: 4 $transition: 500ms //Каждому элементу будет прибавлять по 0.060s @for $i from 0 through $items &:nth-child(#{$i + 1}) transition-delay: $transition+(60ms*($i)) Компилированная версия: * { margin: 0; padding: 0; } .wrapper { width: 100%; display: flex; justify-content: center; align-items: center; } .wrapper:hover .item { transform: translateY(50px); background-color: crimson; } .item { width: 100px; height: 100px; background-color: tomato; transition: 500ms; } .item:nth-child(1) { transition-delay: 500ms; } .item:nth-child(2) { transition-delay: 560ms; } .item:nth-child(3) { transition-delay: 620ms; } .item:nth-child(4) { transition-delay: 680ms; } .item:nth-child(5) { transition-delay: 740ms; }


воскресенье, 5 января 2020 г.

Анимация блока из раскладывающихся плиток

#javascript #css #html5 #scss #jsx


Учусь работать с анимациями в css3 и возникла мысль, реализовать следующее решение.



Есть кнопка данного вида (первое изображение на скриншоте).
 Необходимо, чтобы при переходе на страницу данная кнопка разворачивалась, как на
втором изображении на скриншоте.
 То есть, сперва появляется первая секция (нумерация на втором изображении), затем,
как будто перелистывается лист и появляется вторая секция, потом снова перелистывание
только вниз и проявляется третья секция, перелистывание влево и проявляется четвёртая
секция, итогом становится полная кнопка.
 Реально ли такое реализовать, и если да, то как? 
 Готовых или похожих примеров найти не получилось.
 Буду очень благодарен за подсказки или хотя бы схематичное решение.
    


Ответы

Ответ 1



.c-weird-btn { position: relative; width: 10rem; height: 10rem; perspective: 600px; } .c-weird-btn .o-tile { position: absolute; width: 50%; height: 50%; background: no-repeat radial-gradient(circle at 100% 100%, #0dd, #0dd 33%, transparent 33%) #a7e; } .c-weird-btn .o-tile:nth-of-type(2) { transform-origin: right center; animation: wb-t-tr 0.5s ease-out 0.1s forwards; } .c-weird-btn .o-tile:nth-of-type(3) { transform-origin: left center; animation: wb-t-bl 0.5s ease-out 0.9s forwards; } .c-weird-btn .o-tile:nth-of-type(4) { transform-origin: center bottom; animation: wb-t-br 0.5s ease-out 0.5s forwards; } @keyframes wb-t-tr { 50% { filter: brightness(75%); } 100% { transform: rotateY(180deg); } } @keyframes wb-t-bl { 0% { bottom: 0; right: 0; background-image: radial-gradient(circle at 0 0, #0dd, #0dd 33%, transparent 33%); } 50% { filter: brightness(75%); } 100% { bottom: 0; right: 0; background-image: radial-gradient(circle at 0 0, #0dd, #0dd 33%, transparent 33%); transform: rotateY(-180deg); } } @keyframes wb-t-br { 0% { right: 0; background-image: radial-gradient(circle at 0 100%, #0dd, #0dd 33%, transparent 33%); } 50% { filter: brightness(75%); } 100% { right: 0; background-image: radial-gradient(circle at 0 100%, #0dd, #0dd 33%, transparent 33%); transform: rotateX(-180deg); } }
Поместить изображения на тайлы можно не только через background-image самого тайла (как в примере), но и добавив каждому из них вложенные элементы лицевой и оборотной сторон. Во втором случае, видимость сторон надо будет переключать в кадрах анимации (на 50%, что соответствует положению "на ребре").

понедельник, 23 декабря 2019 г.

Как увеличить сочность цвета (scss)?

#html #css #sass #scss


Допустим имеется цвет #ff7fa1, как средствами scss:


Увеличить его сочность до максимального уровня #ff0044?
Уменьшить его сочность до минимального уровня #ffffff?







    


Ответы

Ответ 1



Можно обратиться к цветовой схемеhsl При этом максимальная сочность цвета будет при значении 50% для l компоненты и минимальная (белый цвет) - при значении 100%. В SASS есть функция получения l компоненты: lightness($color) А также функции для изменения этой компоненты: lighten($color, $amount) darken($color, $amount) Таким образом для решения пункта два, нужно дополнить значение компоненты до 100, а для решения первого пункта в случае если текущее значение больше 50 - уменьшить, в противном случае - увеличить до 50. Пример использования: .c1{ color: lighten($color, 100-(lightness($color))); } .c2{ $l : lightness($color); color: if($l > 50, darken($color, ($l)-50), lighten($color, 50-($l))); } При $color: #ff7fa1 преобразуется в следующее: .c1 { color: white; } .c2 { color: #ff0044; } используется функция if

воскресенье, 22 декабря 2019 г.

Вёрстка блока с 2-мя треугольниками

#css #css3 #html5 #scss


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

Заранее спасибо
    


Ответы

Ответ 1



Без вставки картинок, но с парой лишних блоков и псевдоэлементов: .d1 { height: 300px; width: 300px; margin: 35px 20px 0 0; background: green; position: relative; } .d1:before { content: ""; height: 0; width: 0; position: absolute; top: 0; right: -100px; border-left: 100px solid green; border-top: 150px solid transparent; border-bottom: 150px solid transparent; } .d2 { height: 0; width: 0; background: red; position: relative; } .d2:before { content: ""; height: 0; width: 0; position: absolute; top: 0; left: 280px; border-left: 100px solid red; border-top: 150px solid transparent; border-bottom: 150px solid transparent; } .d2:after { content: ""; height: 0; width: 0; position: absolute; top: 0; left: 260px; border-left: 100px solid green; border-top: 150px solid transparent; border-bottom: 150px solid transparent; } .d3:before { content: ""; height: 30px; width: 100px; position: absolute; top: 0; left: 200px; background: green; } .d3:after{ content: ""; height: 30px; width: 100px; position: absolute; bottom: 0; left: 200px; background: green; }


вторник, 17 декабря 2019 г.

failed to @extend “.class”. The selector “.class” was not found

#ruby_on_rails #sass #scss


Application.css

*= require palette
*= require global
*= require_tree .
*= require_self


vendor/assets/stylesheet/pallete.scss

.grey {
  background-color: #9e9e9e;
}


global.scss

html {
  body {
    header {
      @extend .grey;
    }
  }
}


Выдаёт ошибку: 


  "html body header" failed to @extend ".grey".
  The selector ".grey" was not found.
  Use "@extend .grey !optional" if the extend should be able
  to fail.


Если класс .grey прописать в файле global.scss и в том же файле экстендить - то всё
работает нормально, из любых других файлов не экстендит.

Пробовал перемещать файл palette из vendor в app, менять местами порядок в application.css,
убирал *= require_tree ., обновлял гемы, перегружал сервер, компьютер - результат тот же.

rake assets:clean
rake assets:precompile


Тоже ничего не изменили.

В пустом приложении с нуля такая же проблема.

Версии руби и гемов:


ruby 2.2.0p0
Rails 4.2.5
sass (3.4.21)
sass-rails (5.0.4)

    


Ответы

Ответ 1



Всё правильно, SCSS-файлы компилируются Sass'ом поодиночке, а потом Sprockets (система сборки ассетов в Rails) сшивает из них итоговые стили (используя директивы require в комментариях). Таким образом, когда собирается global.scss, о содержимом palette.scss Sass ничего не знает. Чтобы узнал, нужно соответствующий файл импортировать: @import 'palette.scss' ...да, это очень похоже на CSS-овый @import, Sass его синтаксически расширяет, аккуратно отлавливая случаи, когда его нужно оставить "как есть". Фактически это включает содержимое указанного файла на место этой директивы. То есть, импорт можно делать даже внутри блока правил, и всё будет загружено внутрь него. В гайде по ссылке выше расписаны детали. Обращаю внимание, что идиоматичный Sass-импорт обычно происходит с файлами, имеющими _ в начале имени файла (т. н. partial), вроде _palette.scss, а импортируют так: @import 'palette' Нужно также понимать, что употребление во включаемых файлах кода, который рендерится в непустой CSS, приведёт к тому, что в результате эти блоки будут встречаться несколько раз, если в результате этот файл импортирован несколько раз. Чтобы этого избежать, можно использовать селектор-заглушку: %grey { background-color: #9e9e9e; } Если отрендерить эту конструкцию в CSS, получится пустой файл. Но при этом можно делать @extend %grey, получая желаемый эффект.

воскресенье, 15 декабря 2019 г.

Что это за кэш?

#css #css3 #scss #шрифты


На сайте Icomoon сделать иконочный шрифт и в исходниках в пути к шрифту было это
"?r3waic".

Подскажите пожалуйста что это за кэш? Что будет если без него использовать шрифт
и вообще как правильно поступить в верстке.



@font-face {
  font-family: 'Icomoon';
  src:  url('#{$icomoon-font-path}/Icomoon.eot?r3waic');
  src:  url('#{$icomoon-font-path}/Icomoon.eot?r3waic#iefix') format('embedded-opentype'),
    url('#{$icomoon-font-path}/Icomoon.ttf?r3waic') format('truetype'),
    url('#{$icomoon-font-path}/Icomoon.woff?r3waic') format('woff'),
    url('#{$icomoon-font-path}/Icomoon.svg?r3waic#Icomoon') format('svg');
  font-weight: normal;
  font-style: normal;
}

[class^="icon-"], [class*=" icon-"] {
  /* use !important to prevent issues with browser extensions that change fonts */
  font-family: 'Icomoon' !important;
  speak: none;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  text-transform: none;
  line-height: 1;

  /* Better Font Rendering =========== */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}




Итог: Мне нужно понять как использовать этот кэш.
    


Ответы

Ответ 1



Все из-за того, как в браузерах работает кеш. Icomoon - генерируемый шрифт с иконками. Представьте ситуацию, когда в уже используемый у себя на сайте пак вы добавляете пару иконок. Добавили, сгенерировали файлы шрифтов, обновили их на хостинге. Но названия файлов остались те же (Icomoon.ttf и т.д.). Что же будет, если в стилях будут прямые ссылки на файлы? @font-face { font-family: 'Icomoon'; src: url('#{$icomoon-font-path}/Icomoon.eot'); src: url('#{$icomoon-font-path}/Icomoon.eot#iefix') format('embedded-opentype'), url('#{$icomoon-font-path}/Icomoon.ttf') format('truetype'), url('#{$icomoon-font-path}/Icomoon.woff') format('woff'), url('#{$icomoon-font-path}/Icomoon.svg#Icomoon') format('svg'); font-weight: normal; font-style: normal; } Браузер скачает Icomoon.ttf и закеширует. После добавления пары иконок файлы вы обновили, но название файла не изменилось. И ссылки на них не изменились. Браузер это видит - и использует старые кешированные версии файлов. Как дать браузеру понять, что файлы изменились? Варианта два: Менять имена файлов (так, например, работают ассеты в Ruby on Rails); Добавлять к ссылкам случайный параметр, который менять вместе с файлами. У вас - второй случай. Параметр r3waic - случайно сгенерированная строка. При перегенерации шрифтов сайт Icomoon должен выдать вам новые стили с новым псевдослучайно сгенерированным параметром, например с vf41cd. В итоге ссылки на файлы "изменятся", и браузер скачает новые версии файлов, вместо того, чтобы взять старые из кеша.

Компиляция sass документа при перезагрузке страницы

#sass #scss


Я создал функцию, которая генерирует случайный цвет. Но возникла проблема - она не
работает при перезагрузке страницы. Как мне сделать так, чтобы scss файл компилировался
каждую перезагрузку? Можно на любой технологии.
    


Ответы

Ответ 1



P.S. Изменения ответа за 23.10.2017 Я тут расхваливал webpack и даже за конкурсный вопрос 100 балов получил, но есть проблема, в той конструкции которую я привел, less отказывается читать background-image: url(путь к картинке) ; путь должен быть обязательно в одинарных кавычках, но используя новый приведенный пример файла webpack.config.js, там все исправлено. В комментах есть объяснения что к чему. Предлагаю webpack, ниже привожу полную структуру. Не обязательно что-бы сервер был именно nodejs, но именно для webpack, nodejs должен присутствовать... Файл в корне webpack.config.js. в примере ниже используется less, но нет абсолютно ни какой разницы, просто замените less на sass и естественно пакеты установки не less, а sass. Работоспособность проверена полностью, один минус, не показывает ошибки, надо быть внимательнее, когда пишите код на sass компилирует даже с ошибками. Можно просто создавать сотню файлов sass и все они будут прописываться в один css файл, лично для меня это удобно, подключаешь один css и все работает. Куда какие файлы прописать увидите в комментариях в файле webpack.config.js И еще забыл добавить, для того чтобы все файлы sass или less компилировались надо их импортировать в главный less или sass !!! var path = require('path'); const ExtractTextPlugin = require("extract-text-webpack-plugin"); module.exports = { entry: "./less/main.less", // путь откуда берет less node: { fs: 'empty', net: 'empty' }, output: { path: __dirname + "/public/css", // путь куда вставлять компилированный css filename: "bundle.js" }, module: { rules: [{ test: /\.less$/, use: ExtractTextPlugin.extract({ fallback: "style-loader", use: ["css-loader", "less-loader"] }) }, { test: /\.(png|jpg|jpeg|svg|gif)$/, include: [ path.resolve(__dirname, './img/') // а тут надо прописать имя папки откуда будет брать все картинки ], use: [{ loader: 'file-loader', options: { name: './public/img/[hash].[ext]', } }] }, { test: /\.(ttf|eot|woff|woff2|png|jpg|jpeg|svg|gif)$/, loader: 'url-loader' }, ] }, plugins: [ new ExtractTextPlugin({ filename: 'main.css' // а тут надо прописать имя css которое вы хотите }) ] }; Далее привожу пример файл package.json там найдете команды запуска именно webpack, и увидите, что установить { "name": "********", "version": "1.0.0", "description": "***********************", "main": "serv.js", "scripts": { "start": "node serv", "watch": "webpack -w --config webpack.config.js"/*команда запуска webpack npm rum watch*/ }, "repository": { "type": "git", "url": "**********************************" }, "keywords": [ "short", "advertising", "site" ], "author": "***************", "license": "ISC", "homepage": "*******************", "dependencies": { "body-parser": "^1.18.2", "css-loader": "^0.28.7", "express": "^4.16.1", "fs": "0.0.1-security", "mongoose": "^4.12.1", "style-loader": "^0.19.0", "url-loader": "^0.6.2" }, "devDependencies": { "extract-text-webpack-plugin": "^3.0.1", "file-loader": "^1.1.5", "less": "^2.7.2", "less-loader": "^4.0.5", "webpack": "^3.6.0" } }

Ответ 2



Вместо того, чтобы компилировать scss в статический css, надо выполнять компиляцию либо сервером, отдающим css-файл, либо непосредвственно на клиенте.

Ответ 3



Можете использовать browser-sync. В одной консоли запускаете сборщик sass в режиме watch: sass -w В другой запускаете browser-sync: browser-sync start --server --files "*.css" В этом случае каждый раз после сборки готового css он будет отдаваться сразу без перезагрузки страницы.

Ответ 4



Как мне сделать так, чтобы scss файл компилировался каждую перезагрузку? В подобных вопросах я совсем новичок. Похожим вопросом я занялся буквально пару дней назад. Бегло посмотрел инструментарий в сети. Нашел для себя хорошее решение - Koala. Собственно его и рекомендую. Программа работает с Sass, Less и CoffeeScript. Имеет собственный самодостаточный инструментарий, хотя и позволяет подключать внешние компиляторы. На ваш выбор. Может работать в режиме активного мониторинга - запускает перекомпиляцию как только обнаружит изменение scss-файла. Бесплатна. Использовать крайне просто. Как пример. Создаем каталог проекта. В нем создаем два подкаталога css и sass. В подкаталоге sass создаем файл styles.scss и каталог проекта добавляем в Koala, в настройках включаем активный мониторинг (по умолчанию он вроде включен). Результирующий файл styles.css будет лежать в подкаталоге css. При каждой перезаписи styles.scss будет происходить его фоновая перекомпиляция. Одно важное предупреждение На момент написания данного ответа последняя версия данной программы - 2.2.0. И ее не следует использовать! На фоне множества улучшений имеет существенный неисправленный баг при работе с UTF-8. Поэтому нужно использовать предыдущую версию 2.1.4, ссылку можно найти на этой страничке. По поводу использования в продакшене В этом случае я бы не использовал описанную выше программу на сервере, а использовал бы обычный sass-компилятор. В случае нагрузки, параллельных запросов, думаю, имеет смысл создать и свой параллелизм обработки. Некий процесс должен поддерживать "пул" сгенерированных стилей (пополнять новыми, удалять уже отданные). А основной процесс должен мочь с этим "пулом" работать. Дабы не нарваться на кэширование, основной процесс должен отдавать странички с указанием версии файла стилей. Как-то так.

воскресенье, 8 декабря 2019 г.

Зачем ставят _ перед именем файла с расширением scss?

#css #css3 #sass #scss


Зачем ставят _ перед именем файла с расширением  scss?
    


Ответы

Ответ 1



_ пишется перед именем частичных файлов, которые не должны отдельно компилироваться в css, а вложены в какой-то другой scss файл

Ответ 2



Это стандартное соглашение по именованию файлов-составляющих - они служат частями других файлов. Обычно в них хранят общие mixin'ы, функции, константы и прочее. SASS не позволяет независимо компилировать их - при попытке этого, он просто выдаст ошибку.

четверг, 5 декабря 2019 г.

Сложный polygon на препроцессорах

#svg #sass #scss #less #clip_path


Необходим специфический clip-path: polygon() по точкам.
Какой-никакой пример в коде ниже.



.wrapper {
  width: 960px;
  height: 720px;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto;
  background-image: url(http://beerhold.it/960/722);
  background-repeat: no-repeat;
  backgorund-position: center center;
  position: relative;
}

.key {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 10em;
  height: 10em;
  border: 2em solid rgba(255, 255, 255, .3);
  border-radius: 10em;
}

.block1,
.block2 {
  position: absolute;
  top: 0;
  width: 480px;
  height: 720px;
}

.block1 {
  left: 0;
  background-color: rgba(255, 0, 0, .2);
}

.block2 {
  right: 0;
}
.block3 {
  top: 0;
  width: 100%;
  height: calc(50% - 7em);
  background: rgba(0, 0, 0, 0.7);
  
}
.block4 {
  top: calc(50% - 7em);
  background: rgba(0, 0, 0, 0.7);
  width: 100%;
  height: 14em;
  clip-path: polygon(1% 0%, 100% 0%, 100% 100%, 0% 100%, 8% 94%, 15% 88%, 22% 78%,
29% 69%, 34% 60%, 34% 48%, 33% 36%, 30% 22%, 23% 14%, 12% 7%);
}
.block5 {
  bottom: 0;
  height: calc(50% - 7em);
  width: 100%;
  background: rgba(0, 0, 0, 0.7);
}
Как заметно, на данный момент это просто кривая, вогнутая в фигуру. Задача нарисовать полуокружность(или максимально приблизить к ней), вогнутую в фигуру. В моём понимании для этого нужны less, sass и прочее. А также sin, cos. Плохо понимаю с чего и как начать, не сталкивался с этим. Спасибо @AndreyFedorov за кусок его кода использованный здесь (!) согласен и на любые другие варианты, дающие такой же результат.


Ответы

Ответ 1



Необходимые координаты в path: 120 — радиус круга; если надо уменьшить, то уменьшать обе координаты 240 — высота блока 1000 — длина блока При необходимости повернуть вырез, воспользуйтесь атрибутом transform="rotate()" * { margin: 0; padding: 0; } .btn { position: absolute; width: 240px; height: 240px; border-radius: 50%; border: 10px solid rgba(255,255,255,0.4); top: 130px; left: -120px; background: transparent; box-sizing: border-box; } .btn:hover { border-color: rgba(255,255,255,0.7); } .image { background-image: url(https://s3.amazonaws.com/finely/resources/test.jpg); background-size: cover; background-position: center; width:100%; height:500px; } .image__right { position: absolute; width:50%; right: 0; top: 0; } .placeholder { height:130px; background: rgba(0,0,0,0.5); } .border-mask { height: 240px; background: rgba(0,0,0,0.5); -webkit-clip-path: url(#circleClip); clip-path: url(#circleClip); }


суббота, 13 июля 2019 г.

Как объединить медиа-запросы SASS?

Есть 4 медиа-запроса для ширины экранов. Допустим я хочу применить к определенному размеру экрана определенное свойство SASS к определенному селектору. Как сделать так, чтобы в конечном CSS оставалось 4 медиа-запроса, а не "спагетти" из медиа-запросов?
SASS файл:
@mixin xs-width($num){ @media screen and ( min-width: 320px) { width: calc(100%*($num/12)); } }
@mixin sm-width($num){ @media screen and ( min-width: 480px) { width: calc(100%*($num/12)); } }
@mixin md-width($num){ @media screen and ( min-width: 768px) { width: calc(100%*($num/12)); } }
@mixin lg-width($num){ @media screen and ( min-width: 1024px) { width: calc(100%*($num/12)); } }
.test { @include xs-width (12); @include sm-width (6); @include md-width (4); @include lg-width (3); }
.test-2 { @include xs-width (12); @include sm-width (6); @include md-width (4); @include lg-width (3); }
Конечный CSS:
@media screen and (min-width: 320px) { .test { width: calc(100%*($num/12)); } } @media screen and (min-width: 480px) { .test { width: calc(100%*($num/12)); } } @media screen and (min-width: 768px) { .test { width: calc(100%*($num/12)); } } @media screen and (min-width: 1024px) { .test { width: calc(100%*($num/12)); } }
@media screen and (min-width: 320px) { .test-2 { width: calc(100%*($num/12)); } } @media screen and (min-width: 480px) { .test-2 { width: calc(100%*($num/12)); } } @media screen and (min-width: 768px) { .test-2 { width: calc(100%*($num/12)); } } @media screen and (min-width: 1024px) { .test-2 { width: calc(100%*($num/12)); } }
А надо вот так (под каждый экран):
@media screen and (min-width: 320px) { .test { width: calc(100%*($num/12)); } .test-2 { width: calc(100%*($num/12)); } }


Ответ

Нашел решение от aaronjensen. Библиотека собирает кучу медиа-запросов в один при компиляции.

четверг, 11 июля 2019 г.

Какую роль include играет в sass файле?

Вот есть файл, и в нем интересует строка @include output((box-sizing: $_box));. Какую роль это строка играет в нижеприведенном коде? По идеи она должна вызывать миксин, но в этом коде , миксина с таким названием нету, так какую функцию она тогда выполняет?
// Container Syntax // ================
// Container [mixin] // ----------------- // Set a container element // - [$layout] : @mixin container( $layout: $susy ) { $inspect : $layout; $layout : parse-grid($layout);
$_width : get-container-width($layout); $_justify : parse-container-position(susy-get(container-position, $layout)); $_property : if(susy-get(math, $layout) == static, width, max-width);
$_box : susy-get(box-sizing, $layout);
@if $_box { @include output((box-sizing: $_box)); }
@include susy-inspect(container, $inspect); @include float-container($_width, $_justify, $_property); @include show-grid($layout); }
// Container [function] // -------------------- // Return container width // - [$layout] : @function container( $layout: $susy ) { $layout: parse-grid($layout); @return get-container-width($layout); }
// Get Container Width // ------------------- // Calculate the container width // - [$layout]: @function get-container-width( $layout: $susy ) { $layout : parse-grid($layout); $_width : susy-get(container, $layout); $_column-width : susy-get(column-width, $layout); $_math : susy-get(math, $layout);
@if not($_width) or $_width == auto { @if valid-column-math($_math, $_column-width) { $_columns : susy-get(columns, $layout); $_gutters : susy-get(gutters, $layout); $_spread : if(is-split($layout), wide, narrow); $_width : susy-sum($_columns, $_gutters, $_spread) * $_column-width; } @else { $_width: 100%; } }
@return $_width; }
// Parse Container Position // ------------------------ // Parse the $container-position into margin values. // - [$justify] : left | center | right | [] @function parse-container-position( $justify: map-get($susy-defaults, container-position) ) { $_return: if($justify == left, 0, auto) if($justify == right, 0, auto);
@if not(index(left right center, $justify)) { $_return: nth($justify, 1); $_return: $_return if(length($justify) > 1, nth($justify, 2), $_return); }
@return $_return; }


Ответ

Включает в определение стиля результат выполнения Mixin'а output(который видимо определен в другом файле), передавая ему в качестве значения первого аргумента (box-sizing: $_box)

Зачем нужна @function в sass, когда есть @mixin?

Зачем нужна @function в sass, когда есть @mixin?


Ответ

Разница больше чисто идеологическая.
Mixin'ы - для определения кусков стилей, которые будут включатся в другие определения.
Функции - для вычисления и возврата какого-то одиночного значения, которое будет использоватся, скажем, в качестве значения свойства или как часть других вычислений.
Хотя на деле, в SASS/SCSS они взаимозаменяемы.