Ответы пользователя по тегу HTML
  • Как принудительно заставить загружаться элемент на странице в самую первую очередь?

    @dmz9
    base64-кодирование картинки в инлайн, но размер вырастет.
    картинка станет неотъемлемой частью исходного кода страницы, однако увеличит его на 55-60 кб.
    я бы рассмотрел вариант приведения к цсс-анимации, это будет легче по объему.
    Ответ написан
    2 комментария
  • Какой есть бесплатный редактор для windows XP взамен Brackets?

    @dmz9
    sublime text 2 (3)
    notepad++, у нас тоже люди некоторые в нем работают и вполне-себе замена, даже по фтп редактировать можно если плагинов навернуть сверху
    Ответ написан
    Комментировать
  • Как сформировать список select с помощью Ajax запросив с БД MySQL?

    @dmz9
    брррррр...
    1. для шаблонизатора в пхп лучше делать так
    1.1 даже если шаблонизатор не поддерживает шорт-теги, а шаблон это тупо пхп/хтмл файл - всё же стоит выносить пхп код сборки элементов выше чем хтмл-темплейт сам по себе.
    1.2 множественное открытие/закрытие тегов тоже не особо кул. дело не в перфомансе а в читаемости.
    по сути выглядеть должно как то так
    <?php
    $optionsArray = array();
    if (is_array($organizationList)&&!empty($organizationList))
    {
    	foreach ($organizationList as $org)
    	{
    		$optionsArray[]='<option value="'.$org['idn'].'">'.$org['name'].'</option>';
    	}
    }
    ?><!DOCTYPE html>
    <html>
    ..............
    <select name="organization_id" id="getOrg">
        <option disabled selected>Укажите организацию...</option>
        <?=implode("",$optionsArray)?>
    </select>

    2. сборка селектов на джиквери
    2.1 трогать ДОМ много раз - вредно. семь раз create, один раз append.
    2.2 данные лучше присылать в виде "массива" - в пхп это числовой массив.
    элементами массива уже могут быть объекты - в пхп это ассоциативный массив.
    var data = [{
        idn: 3,
        name: 'first'
    }, {
        idn: 4,
        name: 'second'
    }, {
        idn: 5,
        name: 'third'
    }];
    var $select = $('<select/>', {
        class: 'form-control',
        html: $.map(data, function(org) {
            return $('<option/>', {
                value: org.idn,
                text: org.name
            })
        })
    }).on('change', function() {
        console.log($(this).val());
    }).trigger('change');
    $('.container').append($select)

    можно пойти дальше и $select вообще не заводить а сразу внутри инструкции аппенда написать весь конструктор селекта
    ----------------------------
    собственно - после каждого изменения (внутри change колбека) запрашиваешь данные еще раз (можно кешировать), перерисовываешь селекты. лучше иметь какое то отдельное хранилище - объект js. после сохранения в него данных, запускаешь метод сборки. это 2 отдельные функции.
    можно вынести конструктор селекта в обычную функцию, в которую просто передаешь данные, и возвращается jquery-объект, который в success:function аппендит его в нужное место (а лучше сначала почистить контейнер от старых селектов - $('.container').empty().append($select) ).
    ----------------------------
    для отладки используй хром, открой инструменты разработчика, там есть вкладка network, конкретно должно интересовать тебя - фильтр по XHR, и делай запросы, увидишь что возвращается - json или ошибки от пхп.
    Ответ написан
    4 комментария
  • Переход на главную страницу из дочерней?

    @dmz9
    для главной
    <ul id="menu-topen-1" class="menu">
      <li class="menu-item"><a href="#solutions">Solutions</a></li>
      <li class="menu-item"><a href="#team">Team</a></li>
      <li class="menu-item"><a href="#blog">Blog</a></li>
      <li class="menu-item"><a href="#contact">Contact</a></li>
    </ul>

    не для главной
    <ul id="menu-topen-1" class="menu">
      <li class="menu-item"><a href="/#solutions">Solutions</a></li>
      <li class="menu-item"><a href="/#team">Team</a></li>
      <li class="menu-item"><a href="/#blog">Blog</a></li>
      <li class="menu-item"><a href="/#contact">Contact</a></li>
    </ul>
    Ответ написан
  • Про transform: rotate(). Как правильно крутить?

    @dmz9
    1. лучше сделать добавление-удаление класса, вместо накручивания инлайн-стилей.
    в цсс проще пихать вендорные префиксы. а у элемента будет меняться класс, добавляющий ему вращение через цсс.
    2. https://github.com/Modernizr/Modernizr/wiki/HTML5-... -> imsky.github.io/cssFx
    полифилл это скрипт поддержки (js) который поможет тем браузерам где нет реализации каких то вещей.
    3. если нужны кастомные повороты то тут вот что
    3.1 теоретически через несколько тысячелетий появится поддержка attr() внутри любого цсс свойства. пока что поддерживается только content: attr(какой-то-атрибут), т.е. псевдоэлемент. вобщем, когда то можно будет заюзать что то вроде
    <div ang="10"></div>
    div{
      transform:rotate(attr(ang, deg));
    }

    но пока увы это не работает. скрипт менял бы только атрибут ang и все.
    3.2 раз уж там что то у тебя похожее на джиквери то вот
    www.richardfawcett.net/demos/jquery_1.8.0_testing.html
    после 1.8 джиквери сам добавляет вендорные префиксы.
    однако чтобы это юзать надо использовать не выборку дом-элемента, а именно джиквери объект
    var angle=12.5;
    $(marker._icon).css({
      transform:"rotate("+angle+"deg)"
    })

    джиквери сам проставит префиксы. и да, .css метод на джиквери объекте, вместо style на дом-элементе.
    Ответ написан
    Комментировать
  • (Визуальный редактор медиа-выражений и работа с 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 комментарий
  • Путь к файлу, где ошибка?

    @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 комментарий