• Как сделать slick слайдер в fancybox?

    @dmz9
    1. не то событие
    2. пересохраняешь window.slider 2 раза. зачем? сделай для них разные переменные и вообще желательно внутри document.ready а не в глобале
    <a href="#modal" id="fancybox">Показать слайдер в окне</a>
    <div class="modal" id="modal">
        <div class="slider">
            <div id="slick">
                <div class="slider__item">
                    <div>1</div>
                </div>
                <div class="slider__item">
                    <div>2</div>
                </div>
                <div class="slider__item">
                    <div>3</div>
                </div>
                <div class="slider__item">
                    <div>4</div>
                </div>
                <div class="slider__item">
                    <div>5</div>
                </div>
                <div class="slider__item">
                    <div>6</div>
                </div>
                <div class="slider__item">
                    <div>7</div>
                </div>
            </div>
        </div>
        <div class="slider">
            <div id="slick2">
                <div class="slider__item">
                    <div>11</div>
                </div>
                <div class="slider__item">
                    <div>22</div>
                </div>
                <div class="slider__item">
                    <div>33</div>
                </div>
                <div class="slider__item">
                    <div>44</div>
                </div>
                <div class="slider__item">
                    <div>55</div>
                </div>
                <div class="slider__item">
                    <div>66</div>
                </div>
                <div class="slider__item">
                    <div>77</div>
                </div>
            </div>
        </div>
    </div>

    $(document).ready(function() {
        $('#fancybox').fancybox({
            autoSize: true,
            afterShow: function() {
                var main = '#slick';
                var support = '#slick2';
                $(main).slick({
                    slidesToShow: 1,
                    slidesToScroll: 1,
                    arrows: false,
                    fade: true,
                    asNavFor: support,
                    dots: false,
                    responsive: true
                });
                $(support).slick({
                    slidesToShow: 3,
                    slidesToScroll: 1,
                    asNavFor: main,
                    dots: true,
                    centerMode: true,
                    variableWidth: true,
                    focusOnSelect: true
                });
            }
        });
    
    })
    Ответ написан
    Комментировать
  • Какие микро js/css библиотеки/фреймворки посоветуете для изучения?

    @dmz9
    есть концептуальные, есть инструментальные (утилитарные).

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

    инструментальные или утилитарные фреймворки - это скорее набор отверток, пассатиж и напильников. не нужно "как то по-особому" ими пользоваться. единственная цель их существования - обеспечить однообразное выполнение определенных простых действий либо сделать "шорткаты" (сокращения) длинно-кодов в короткие понятные команды. самый простой пример - jquery. просто набор полезных утилитарных функций, хорошо делающих своё дело, и предоставляющих однообразный интерфейс.

    поэтому зачастую основной концептуальных (сложных) фреймворков становятся более простые, инструментальные фреймворки.
    Ответ написан
    Комментировать
  • Как настроить Typescript tsconfig.json чтобы автоматически создавались .js файлы?

    @dmz9
    за файлами должен кто то смотреть, watcher. вотчер обычно это часть сборщика.
    например сборщик gulp.
    поэтому чтобы он стал смотреть за файлами и выполнять конвертацию в .js после изменения файлов (т.е. после сохранения) надо его запустить из консоли в той папке где лежит файл gulpfile.js (если используется gulp).
    бывает так что среда разработки (IDE) сама умеет запускать сборщик после изменений файлов, но для этого надо в нее интегрировать gulp, указать его исполняемый файл. в каждой по своему.
    так что никакой магии нет - если сборщик не запустился то он и файлы не перекомпилировал.
    Ответ написан
  • (Визуальный редактор медиа-выражений и работа с psd прямо в редакторе/онлайн) Response and extract for brackets - альтернативы есть?

    @dmz9
    текстовый редактор - для текста, графический - для графики и макетов.
    пихать всё в одно это бред.
    я обычно для верстки использую пхпшторм, фотошоп для макетов, хром для результатов.
    ---------------------------------
    tl:dr
    в фотошопе юзай хоткеи, спрайты собирай сборщиком (не онлайн), мелкие картинки с макета экспортируй скриптом (есть встроеный сценарий), юзай гугл-фонтс или белку, адаптивные макеты одной и той же вьюшки лучше скидывать в одно рабочее поле
    в редакторе - юзай эммет (если есть), юзай лайвтемплейты (если редактор поддерживает), юзай автокомплит (если редактор поддерживает). юзай сборщики файлов (более системный совет). юзай другой редактор (если он нифига не поддерживает), например phpstorm / webstorm, грамотно организуй структуру проекта (логически), работай на основе какого нибудь адаптивного фреймворка (например бутстрап 4), юзай scss
    ---------------------------------
    longread
    в фотошопе можно ускориться так
    1. юзать хоткеи. по факту верстальщику надо знать от силы 15 хоткеев
    например вот такие (неполный список конечно же)
    • скопировать слой в новый файл.
    • тримминг пустых пикселей
    • сохранить в формате для веб (типа сохранение картинок) - их всеравно потом лучше бы пережать так как ФШ добавляет много лишнего мусора внутрь (этот хоткей есть так то)
    • вкл-выкл режим показа границ слоёв. мегаполезная фишка.
    • вкл-выкл направляющие.

    2. спрайты - мелкие фотки со всех макетов скидываешь в один новый файл, потом переименовываешь каждый слой по смыслу (в т.ч. ховер-слои) так чтобы названия не повторялись. далее запускаешь скрипт - импорт слоёв в файлы. он быстро всё триммингует, сохраняет в пнг и выплевывает в папку. название слоёв становится названием файла. однако скрипт достаточно "противный" и дописывает свои индексы в начале файла. исправляется единоразовой правкой самого скрипта (уже не помню где лежит, делал года 2 назад).
    далее, если ты действительно верстаешь а не пишешь голый цсс - у тебя есть сборщик. например я юзаю бутстрап 4 (который наверно уже не альфа) и грунт. в грунт прикрутил команду grunt sprite которая берет все пнг из папки (которые фотошоп туда положил) и собирает из них
    • файл спрайта
    • парциал сцсс для использования каждого спрайта по отдельности в коде других парциалов

    сборщик это примерно такой
    "grunt-spritesmith": "^6.3.1"
    код примерно такой
    sprite:{
          all: {
            src: './sprite/*.png',
            dest: './../images/sprite.png',
            destCss: './scss_custom/_sprite.scss',
            imgPath: '../../../images/sprite.png',
            padding: 3,
            algorithm: 'left-right',
            cssVarMap: function (sprite) {
              sprite.name = 'sprite-' + sprite.name.replace(/\s|\(|\)/g, '_');
            },
            cssTemplate: 'css.sprite.template'
          }
        },

    спрайт темплейт примерно такой
    {{#spritesheet}}
    @mixin sprite(){
    	display:inline-block;
    	overflow:hidden;
    	background-image: url({{{image}}});
    	background-repeat: no-repeat;
    }
    .sprite{
    	display:inline-block;
    	overflow:hidden;
    	background-image: url({{{image}}});
    	background-repeat: no-repeat;
    }
    {{/spritesheet}}
    {{#sprites}}
    .{{name}}{
      background-position: {{px.offset_x}} {{y}};
      width: {{px.width}};
      height: {{px.height}};
    }
    @mixin {{name}}(){
      background-position: {{px.offset_x}} {{y}};
      width: {{px.width}};
      height: {{px.height}};
    }
    {{/sprites}}

    генерирует не только сам класс но еще и миксин (который можно юзать во всяких ховер-эффектах!)
    вобщем, тут сборщик очень сильно упрощает и автоматизирует сборку спрайтов. с ужасом вспоминаю дни когда руками их собирал в онлайн сервисе.
    если юзаешь что то другое (компас, гулп или что там еще за звери наплодились) - красава, разберешься наверно как прикрутить.
    3. вытаскивать фотки и сохранять - в фотошопе занимает около 4 секунд (по одной, руками).
    там даже мышкой не надо тыкать (при условии что слой уже выбран).
    алго примерно такой
    • хоткей - скопировать на новый документ, ок, ты перешел в новый таб
    • хоткей - тримминг пустых пикселей - фотка обрезана по размеру
    • хоткей - сохранить для веб - и вот ты уже выбираешь место сохранения.

    4. иногда дизайнеры ленятся и не обрезают фотки - на помощь приходит выделение нужного куска макета и "скопировать совмещенные данные". сразу же делаешь новый файл, энтер, ctrl+v, сохранить.
    5. юзай линейку, заставляй дизайнеров соблюдать одинаковые отступы, проси шрифты которые юзали в макетах (хотя бы в одном формате), храни наборы конверченых для пуленепробиваемого font-face у себя где нибудь на складе - часто могут пригодиться. подключение уже готовой пачки шрифтов на все вкусы браузеров - что может быть приятнее (и быстрее) ? ммм, наверно только гоогле-фонтс.
    6. адаптивные макеты я обычно скидываю все в один файл (один вид = 4-5 макетов, напр. карточка товара). так проще смотреть что куда уплывает и куда перемещается.
    -----------------------
    ускорение в редакторе
    юзаю phpstorm. в его состав входит webstorm поэтому этот варик чуть менее чем абсолютный эпик вин. в него интегрируется вообще что угодно, в т.ч. можно настроить собственные вотчеры файлов (сасс, лесс) (без грунта/гульпа итп). алсо - автоподсказки кода (и тех миксинов спрайтов тоже), лайв-темплейты очень удобная штука, а еще встроеный эммет - совсем красота.
    в шторме есть лайв-релоад. если имеешь хотя бы 2 монитора - можно заценить. на одном браузер, на другом верстаешь - тут же видишь результат (вотчер компилирует цсс, лайв релоад его перечитывает и обновляет)

    всё делается на парциалах (т.е. файлы-кусочки в терминологии сасс "partials"). парциалы прикольны тем что вотчер не станет компилировать новый парциал в готовый код, пока ты его никуда не подключил. а если писать без подчеркивания - станет (т.к. это уже не парциал). т.о. создание таких файлов не ломает промежуточные результаты работы.

    для адаптивной верстки выглядит примерно так
    /* /includes/header/_header.scss */
    header{
    	@include media-breakpoint-up(md){
    		margin-bottom: .5rem;
    	}
    	.top{
    		border-bottom: 1px solid #ccc;
    		height: (42rem/16); // нужно было 42 пикселя, а рем = 16. приходится изворачиваться
    		font-size: (14rem/16);
    		margin-bottom: (28rem/16);
    		@include media-breakpoint-up(md){
    			margin-bottom: 3rem;
    		}
    		@include media-breakpoint-up(lg){
    			border-bottom: 0;
    		}
    	}
    }

    для справки -
    $grid-breakpoints: (
    		xs: 0,
    		sm: 480px,
    		md: 768px,
    		lg: 960px
    );

    media-breakpoint-up - миксин бутстрапа 4, просто сразу говорит о том что "для экрана больше чем md будет вот так то". само собой есть и -down, -between.
    причем вся конструкция для миксина тоже не пишется руками - для этого есть лайв темплейт
    поэтому я пишу (tab - это раскрытие эммета или лайв-темплейта)
    bp (tab) md (tab) mb.5rem (tab)
    это раскрывается в
    @include media-breakpoint-up(md){
      margin-bottom: .5rem;
    }

    и компилируется в
    @media (min-width: 768px) {
      header {
        margin-bottom: .5rem;
      }
    }

    не призываю юзать бутстрап прям везде и всюду - призываю лишь юзать "наработки" которые позволяют забыть о написании медиа-запросов руками. даже если от бутстрапа юзается одна сетка - да или хоть вообще одни миксины - это того стоит.
    Ответ написан
    2 комментария
  • Горизонтальная прокрутка таблицы по клику на кнопку?

    @dmz9
    было дело, приходилось такое мутить.
    есть какой то плагин но можно на js накидать своё, не найду свои сорсы.
    далее с джиквери
    вобщем, по document.ready берем каждую такую таблицу, оборачиваем в обёртку от конфеты.
    обёртка должна быть с прокруткой горизонтальной (overflow-x).
    после того как конфетка завёрнута append после обёртки кнопку. либо, если кнопка уже должна существовать - надо каждый раз проверять - а находится ли обёртка рядом с кнопкой, чтобы, при клике на кнопку прокручивалась именно ближайшая обёртка а не все подряд. если же кнопку создаем под каждую таблицу - просто вешаем хендлер .click(function(){}) а внутри каждый раз меняем прокрутку обёртки.
    по сути, прокрутка вбок - это всего лишь scrollLeft у контейнера-обёртки. сама таблица как была так и есть.
    этот скролл может иметь фиксированый размер в пикселях либо можно снимать ширину с родителя и типа скролить "на всю ширшину родительского контейнера". это достаточно универсально, можно еще чуть меньше сделать, чтобы следующий "слайд" всегда "продолжался" на 15-20 пикселей и было ощущение реальной прокрутки.
    также, через джиквери этот самый scrollLeft можно еще и анимировать, добавляя например эффект "swing". тогда всё будет работать еще более badass!
    плюс, так как это ж майфун, можно навешать на обёртку touch - ивенты, чтобы на лапание пальцами экрана прокрутка тоже отрабатывала.
    ---------------------
    карусель (слайдер) тут не поможет - таблицу на слайды нельзя разбить.
    ---------------------
    если таблицы совсем простые - без смердженых ячеек - есть плагин responsiveTables или типа того. тупо делает из широкой таблицу более узкую но меняет местами вертикальные-горизонтальные строки. читабельно. но если есть ячейки с colspan/rowspan - косячит
    Ответ написан
    1 комментарий
  • Что это за glitch эффект?

    @dmz9
    canvas
    а точнее их там 3 штуки.
    и уточка.
    Ответ написан
    Комментировать
  • Путь к файлу, где ошибка?

    @dmz9
    попробуй указывать в путях "текущую папку" где лежит файл
    "./my-icons.html"
    точка - это текущая папка.
    ./my-icons.html эквивалентный my-icons.html но может сработать
    Ответ написан
    Комментировать
  • Как без костылей сделать так, чтобы footer сайта всегда был внизу?

    @dmz9
    не бойся добавить обертку к разметке, от этого никто еще не умер.
    есть всего 2 случая:
    1. высота футера заранее известна и жестко можно её указать. в этом случае обычно использую вот такое
    <html>
    <head>
    <style type="text/css">
    * {
        /* обычно все нормальные адекватные верстальщики юзают css-reset поэтому 
        тут просто масло-масляное. такие правила в нем всегда есть, но они необходимы на самом деле.*/
        padding: 0;
        margin: 0;
        box-sizing: border-box;
    }
    
    body,
    html {
    	background-color: orange;
        height: 100%;
        /* растягиваем корневой элемент и боди на всю высоту окна браузера. 
        да, даже если контента 10 страниц - эти элементы будут именно по размеру окна */
    }
    
    .wrapper {
        min-height: 100%;
        /* обертка должна быть не-меньше чем всё окно целиком. это растягивает враппер 
    на всю высоту окна браузера (как минимум). если контента больше чем одна страница - 
    правило будет просто опускаться, и враппер будет заниматься столько, сколько нужно  */
        padding-bottom: 80px;
        /* вообще, указывать надо чуть больше, либо добавлять main отдельный нижний маржин. 
    если этого не делать футер будет очень близко к main поэтому нужен отступ. 
    обычно 15-16 пикселей (спейсер) */
    }
    
    footer {
    	background-color: green;
        height: 80px;
        /* мы знаем высоту футера и указываем ее */
        margin-top: -80px;
        /* основная суть всего способа - отрицательный верхний маржин затягивает футер наверх на всю 
    собственную высоту футера. соль в том что враппер, идущей по потоку документа перед футером уже занял 
    всю высоту окна. и если мы этого не сделаем то футер всегда будет ниже нижней границы окна 
    даже когда контента не будет, плюс, появится полоса прокрутки. отрицательный маржин 
    нивелирует этот эффект и футер оказывается "прибит" к полу */
    }
    </style>
    </head>
    <body>
        <div class="wrapper">
            <header></header>
            <main>я майн</main>
        </div>
        <footer>пыщщ пыщщ</footer>
    </body>
    </html>

    если используется less/sass то еще проще - заводим переменную (типа $footer_height) и юзаем ее и в паддинге (padding-bottom:$footer_height+15px) и в стилях футера (height:$footer_height; margin-top:-1*$footer_height;). замена высоты футера будет в одном месте (dry!)
    2. второй вариант - высота может меняться - в основном у адаптивных сайтов.
    расскажу как обойтись без флексбокс но нужно немного JS.
    за высотой футера следит скрипт, и при каждом ресайзе страницы обновляет высОты и маржины/паддинги. использовать jquery проще всего, плюс, он почти всегда есть почти везде.
    выглядит примерно так.
    <html>
    <head>
        <style type="text/css">
        * {
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        }
        
        body,
        html {
            background-color: orange;
            height: 100%;
        }
        
        .wrapper {
            min-height: 100%;
            /* теперь паддинг не нужен */
            /* погорячился - все таки нужен )) */
           padding-bottom:80px;
        }
        
        footer {
            background-color: green;
            min-height: 80px;
            /* чтобы футер не схлапывался в нулевую высоту когда в нем пусто */
            height: 80px;
            margin-top: -80px;
            /* можно не убирать, чтобы оставить совместимость с чем то без JS */
        }
        </style>
    </head>
    <body>
        <div class="wrapper">
            <header></header>
            <main>я майн</main>
        </div>
        <footer>а я футер! ололо</footer>
        <script src="http://code.jquery.com/jquery-2.2.4.min.js" type="text/javascript"></script>
        <script type="text/javascript">
        $(document).ready(function() {
            // сначала подождем загрузки
            // объявим переменные, чтобы заново не выбирать каждый раз те же ноды
            var footerHeight, $footer = $('footer'),
                $main = $('main');
            $(window).resize(function() {
                // вешаем обработчик на изменение размеров страницы - т.е. если меняется ширина страницы, 
                // или высота, даже если в футер кто то потом аяксом что то подгрузит - 
                // сработает ресайз и все сам поменяет
                footerHeight = $footer.height('auto').height();
                // важный момент - чтобы "снять" правильную высоту элемента - надо чтобы поток документа сам 
                // назначил верную высоту футеру. а для этого сделаем её "auto". даже если забыли/не захотели убрать 
                // из стилей жестко прописаную высоту - инлайн стиль перебивает весом, и поэтому высота 
                // будет такая "как надо". потом снимаем мерку, и юзаем её
                $main.css({
                    'paddingBottom': (footerHeight + 15)
                });
                // не забываем кемел-кейс для значений-через-дефис
                $footer.css({
                    'height': footerHeight,
                    'marginTop': (footerHeight * -1)
                })
            }).trigger('resize'); // после навешивания обработчиков насильно запускаем первый ресайз
        })
        </script>
    </body>
    </html>

    ------------------------------
    варианты с позиционированием крайне не люблю - дело не в том что я не умею с ним обращаться. я то как раз таки умею, а вот многие другие делают из этого лютые костыли, которые потом заколебешься переделывать. так что лучше не используйте позиционирование там, где оно не нужно (в прибитии футера к полу например).
    то что бутстрап использует позиционирование в своём прибитом футере не значит что это супер-правильно или это best-practices. просто они решили сделать так а не как то иначе.
    Ответ написан
    1 комментарий
  • Как настроить рабочую среду ruby (ror) + vagrant + rubymine @ win7x64?

    @dmz9 Автор вопроса
    Папка с кодом шарится с помощью synced folder (https://www.vagrantup.com/docs/synced-folders/). В качестве Synced Folder на всех платформах предлагаю использовать nfs. В частности, для Windows есть плагин vagrant-winnfsd (https://github.com/winnfsd/vagrant-winnfsd). В общем-то все)

    вагрант по умолчанию делает одна расшареную папку между хост- и гость-машинами, /vagrant = папка в которой был vagrant init. в чем между ними разница вкратце, если можно? можно ведь весь код в ней располагать и собсно пункт 1/ про это и был - если открыть рубимайном эту папку, она станет папкой проекта
    --------------------
    насчет подключения удаленного интерпретатора руби из вагранта - нашел туториалы
    --------------------
    еще не читал, однако, в заголовках пока не вижу - как подключать data-source - т.е. мускул-базы? все же проброс доп. портов в vagrantfile ?
    Ответ написан
  • Менеджмент проектов на bootstrap 4 + npm - как избежать замусоривания файловой системы папками node-modules?

    @dmz9 Автор вопроса
    небольшой апдейт
    по поводу симлинков - появились в консоли записи при npm update из папки проекта с симлинком node_modules
    примерно такое
    ...
    npm WARN skippingAction Module is inside a symlinked module: not running move readable-stream@2.0.5 node_modules\node-sass\node_modules\readable-stream
    npm WARN skippingAction Module is inside a symlinked module: not running add bl@1.0.0 node_modules\node-sass\node_modules\request\node_modules\bl
    npm WARN skippingAction Module is inside a symlinked module: not running add strip-ansi@3.0.0 node_modules\node-sass\node_modules\strip-ansi
    ...
    npm WARN skippingAction Module is inside a symlinked module: not running remove readable-stream@2.0.5 node_modules\tar-stream\node_modules\readable-stre
    am
    ...
    Ответ написан
    Комментировать