• Можно ли менять размер SVG если он находится в спрайте?

    @faragly
    В svg спрайте изменять размер определенного куска не получится, если не менять background-size для спрайта и width и height для отдельного взятого svg. Есть прекрасная статья, материалы которой я использовал у себя. На этой неделе решил собирать svg-спрайты папками (раньше папками собирались только png), иконок было много, дизайнер нарисовал размеры больше чем нужно, менять размер каждой иконки слишком рутинно. Реализовал миксины (mixin svg-sprite это mixin sprite из вышеуказанной статьи):
    // svg из папки генерируют scss файлы {название_папки}.scss
    @import '../sprites/svg.scss',
            '../sprites/ne-svg.scss';
    
    // список спрайтов помещаем в массив
    $svg-sprites: (svg: $svg-icons, ne-svg: $ne-svg-icons);
    
    $svg-sprite: map-get($svg-icons, sprite) !default;
    $ne-svg-sprite: map-get($ne-svg-icons, sprite) !default;
    
    // Gets an attribute from the sass map
    @function sprite-attr($icon, $attr, $sprite) {
        $newIcon: map-get($sprite, $icon);
        @if $newIcon == null {
            @warn "Can't find an icon with the name #{$icon}";
        }
        @return map-get($newIcon, $attr);
    }
    
    @function icon-attr($icon, $sprite) {
        $sprite: map-get($svg-sprites, $sprite);
        $attr: (
            width: sprite-attr($icon, width, $sprite),
            height: sprite-attr($icon, height, $sprite),
            x: sprite-attr($icon, backgroundX, $sprite),
            y: sprite-attr($icon, backgroundY, $sprite)
        );
    
        @return $attr;
    }
    
    %svg-sprite {
        display: inline-block;
        background-image: url(map-get($svg-sprite, svgPath));
        background-size: map-get($svg-sprite, width) map-get($svg-sprite, height);
    }
    
    %ne-svg-sprite {
        display: inline-block;
        background-image: url(map-get($ne-svg-sprite, svgPath));
        background-size: map-get($ne-svg-sprite, width) map-get($ne-svg-sprite, height);
    }
    
    @mixin ne-svg-bg-size($percent: 100) {
        $bg-size-x: map-get($ne-svg-sprite, width);
        $bg-size-y: map-get($ne-svg-sprite, height);
        background-size: round($bg-size-x * $percent / 100) round($bg-size-y * $percent / 100);
    }
    
    @mixin svg-sprite($icon, $type: all, $sprite: svg) {
        @if $type == all {
            // Shares the backgrounds
            @extend %#{$sprite}-sprite;
        }
    
        $iconMap: icon-attr($icon, $sprite);
    
        // Outputs dimensions in em
        @if $type == all or $type == size {
            width: map-get($iconMap, width);
            height: map-get($iconMap, height);
        }
    
        // Outputs background position in px
        @if $type == all or $type == bg {
            background-position: map-get($iconMap, x) map-get($iconMap, y);
        }
    }
    
    @mixin svg-sprite-percent($icon, $type: all, $sprite: svg, $percent: 100) {
        @if $percent == 100 {
            @include svg-sprite-percent($icon, $type, $sprite);
        } @else {
            @if $type == all {
                // Shares the backgrounds
                @extend %#{$sprite}-sprite;
                @include ne-svg-bg-size($percent);
            }
    
            $iconMap: icon-attr($icon, $sprite);
    
            @if $type == all or $type == size {
                width: round(map-get($iconMap, width) * $percent / 100);
                height: round(map-get($iconMap, height) * $percent / 100);
            }
    
            @if $type == all or $type == bg {
                background-position: round(map-get($iconMap, x) * $percent / 100) round(map-get($iconMap, y) * $percent / 100);
            }
        }
    }

    Использую такой шаблон для генерации файла scss, (параметр common: folderName указывается в сборке gulp-svg-sprite)
    // {{date}}
    
    ${{common}}-icons: (
        sprite: (width: {{spriteWidth}}px, height: {{spriteHeight}}px, pngPath: '/source/i/{{common}}-sprite.png', svgPath: '/source/i/{{common}}-sprite.svg'),
    {{#shapes}}
        {{base}}: (width: {{width.inner}}px, height: {{height.inner}}px, backgroundX: {{position.absolute.x}}px, backgroundY: {{position.absolute.y}}px),
    {{/shapes}});


    А использую это примерно так (в папке ne-svg находятся файлы file-gray.svg, help-gray.svg, hand-icon.svg):
    $icons: (file: file-gray, help: help-gray, touch: hand-icon);
    @each $i, $icon in $icons {
        .icon--#{$i} {
            @extend %ne-svg-sprite;
            @include svg-sprite-percent($icon, all, ne-svg, 66);
        }
    }


    Возможно написал избыточную информацию, но мне кажется мой опыт будет полезным еще кому-то, хотя не претендую на звание изящного решения. По любым вопросам готов помочь.
    Ответ написан
    Комментировать
  • Как приостановить прослушку (watching) файлов на время выполнения функции в GulpJS?

    @faragly Автор вопроса
    Проблема решена. Чтобы останавливать прослушку нужно использовать абсолютный путь до файла, а не относительный, то есть
    var w = watch('./source/js/**/*.js', {verbose: true, events: ['change']});
        w.on('data', function (vinyl) {
            w.unwatch(vinyl.path);
            // тут операция и в on end добавляем прослушку обратно
        });

    Но при редактировании файл будет обработан несколько раз, так как сначала вызовется событие change, затем addи чтобы этого не было, я оставил событие только events: ['change'] в параметрах watch
    Ответ написан
    Комментировать
  • Отличие responsive дизайна от adoptive?

    @faragly
    Есть хорошая статья по этой теме.
    Ответ написан
    Комментировать
  • Gulp: генерация нескольких спрайтов?

    @faragly
    А как насчет того, чтобы узнать все папки внутри images с помощью globby и и для каждой папки создать поток, затем объединить их с помощью event-stream.merge?
    var globby = require('globby'),
        es = require('event-stream');
    .....
    gulp.task('sprites', function () {
        var imgDirs = globby.sync('src/images/*');
        imgDirs.map(function (dir) {
            return gulp.src(dir)
                    .pipe(...); // здесь вся обработка и сохранение
        });
        return es.merge(imgDirs);
    });
    Ответ написан
    Комментировать
  • Как собирать карту исходников (sourcemaps) для sass в один выходной файл?

    @faragly Автор вопроса
    Ответ на мой вопрос следующий: нужно в первом таске (например компиляция sass файлов) в таске пишем .pipe(sourcemaps.init()), а вот в следующих тасках, нужно инициализировать карты с помощью параметра loadMaps: true
    .pipe(sourcemaps.init({loadMaps: true})).
    Ответ написан
    Комментировать
  • Как заставить gulp-sourcemap работать корректно?

    @faragly
    У меня те же проблемы, решить пока не удается. Единственное что понял так это то что надо между sourcemaps.init() и sourcemaps.write() отключать по одному потоки и смотреть карты, я таким образом нашел 1 поток, который все портит, после его отключения названия и строки стали показываться верно, но не решилась другая проблема - при переходе на файл (он не в другом файле, а внутри css) отображается пустой файл. Проблема в путях если карта содержит подпапки, то путь получает /source/scss/blocks/blocks/main.scss - явно лишний /blocks/ от которого непонятно как избавляться.
    Ответ написан
    Комментировать
  • Как называется такой вызов функции?

    @faragly
    Сейчас реализовываю подобный читаемый код для класса, хотел реализовать текучий интерфейс, избавиться от объявления new ClassName; и нашел подобный код и собрал у себя в классе:
    class MyClass {
        private $data = [];
        private static $instance;
    
        public function __construct(array $config = []) {}
    
        public static function init(array $config = [])
        {
            if(!isset(self::$instance)) { 
                $c = __CLASS__;
                self::$instance = new $c($config); 
            } 
            return self::$instance; 
        }
    
        public function get()
        {
            return $this;
        }
    
        public function toJson()
        {
            echo json_encode($this->data);
        }
    }

    и далее я могу вызывать класс с опциями так:
    $myclass = new MyClass(['id' => 123]);
    $myclass->get()->toJson();

    или одной строчкой
    MyClass::init(['id' => 123])->get()->toJson();
    Ответ написан
  • Как правильно воспользоваться "сеткой" bootstrap?

    @faragly
    Так не пойдет?
    <div class="row">
      <div class="col-md-8">
        <div class="row">
          <div class="col-md-6">Projects</div>
          <div class="col-md-6">Fondue</div>
        </div>
        <div class="row">
          <div class="col-md-4">Louis XX</div>
          <div class="col-md-8">View project</div>
        </div>
      </div>
      <div class="col-md-4">
        <div class="col-md-12">Potter</div>
        <div class="col-md-12">Tabano</div>
        <div class="col-md-12">Fiji</div>
      </div>
    </div>
    Ответ написан
    7 комментариев
  • Gulp+PHP локальный сервер+wordpress?

    @faragly
    Может быть это поможет - gulp-connect-php. Хотя он не решит ваши ожидания, он всего лишь сделает возможным работу с php.
    Ответ написан
    Комментировать
  • Как фильтровать множественное свойства типа список через оператор ИЛИ в 1С Битрикс?

    @faragly
    А если так?
    $series = implode(',', $_POST['series']);
    $variants = implode(',', $_POST['thnologys']);
    
    $arFilter = Array(
    	"IBLOCK_ID" => 13,
    	"ACTIVE" => "Y",
    	"SECTION_ID" => array($arCat)
    );
    $arFilter[] = Array(
    	'LOGIC' => 'AND',
    	"=PROPERTY_SERIES_VALUE" => array($series),
    	"PROPERTY_VARIANTS_VALUE" => array($variants),
    );
    Ответ написан
  • Как не заплыть жиром, работая удаленно программистом?

    @faragly
    Занимайтесь в спортзале, это хорошее занятие поверьте, таким образом вы будете компенсировать нагрузки и сидячий образ жизни, который, как мы знаем, до добра не доводит. Будучи спортивным, вы будете уверены в себе и не будете воспринимать компьютер как вредное изобретение человечества, а просто как средство заработка. Это две крайности компьютер и спорт создает баланс в вашей жизни. Найдите фитнес-центр недалеко от дома, ходите 3 раза в неделю, по 2 часа (полтора часа занятие и полчаса туда-обратно), вы будете удивлены насколько изменится ваше восприятие.
    Ответ написан
    4 комментария
  • Как просчитать рентабельность редизайна сайта по показателям?

    @faragly
    Я не спец в этом, но предположу, что вам нужно сделать тест-группу (так крупные интернет-компании делают) и включить для них новый дизайн, далее в метрике (google или yandex) провести анализ показателей для старого и нового дизайна - время на сайте, клики, количество посетителей/заказы, средняя сумма заказа и прочие. Далее если вы видите что новый дизайн более показательный, заказов стало больше, средний чек больше и тому подобное, высчитывается среднее увеличение доходности в месяц. Зная сумму инвестиций и среднее увеличение доходности, высчитываем окупаемость. А дальше думаю найдете применение этим цифрам :)
    Ответ написан
    Комментировать
  • Как сделать липкий блок останавливающийся на футоре?

    @faragly
    Ответ написан
    Комментировать
  • Календарь с событием на сайт?

    @faragly
    Посмотрите это - то что нужно. Если надо проще, то можно самому сверстать любой макет календаря (например, отсюда) и прикрутить любой tooltip (например, jBox)
    Ответ написан
    5 комментариев
  • Существует ли API времени?

    @faragly
    Сам не пользовался, но можно посмотреть этот функционал в Google Maps Time Zone API или timeanddate.com.
    Ответ написан
    Комментировать
  • Получение root прав для Samsung S5 SM-G900F(без перепрошивки)?

    @faragly
    Скорее всего у вас, как и у меня, уже произведено обновление до версии андроид 5.0. Есть такой прекрасный форум по нашим устройствам, там есть все данные. В спойлере Root и кастомные рекавери есть инструкции для получения root. На устройствах с версией 4.4.х получить root без прошивки можно только на прошивках не старше NG2. Но так как версия у вас 99% уже пятая, то без минимальной прошивки не получится. Я тоже далек от прошивок, но у меня получилось следуя инструкциям не убить свой телефон :)
    Ответ написан
  • Как узнать адрес ajax-запроса или получить его данные?

    @faragly
    Попробуйте посмотреть в исходной странице откуда берутся эти параметры, если это значения каких то hidden полей, то придется сначала получать страницу, затем искать эти переменные значения и делать ajax запрос.
    Ответ написан
    Комментировать
  • Показать все даты, в интервале, как сделать?

    @faragly
    Вам поможет это.
    Ответ написан
    Комментировать
  • Как применить селектор к Селектору в jQuery?

    @faragly
    Описание не совсем понятное, но предположу что вам что то подобное.
    var hiddens_1 = $("div[title=\"текст по русски\"]");
    hiddens_1.parent().parent().parent().parent().siblings('div').hide(); // или remove()

    Вы пишите код внутри селектора, не надо так, выносите все в цепочку.
    Ответ написан
    Комментировать