Редакция от Февраля 2018

Общие требования и рекомендации по верстке

0. Общие положения

  • Адаптивная верстка типовых страниц интернет-ресурса в формате языка гипертекстовой разметки (HTML), включая каскадные таблицы стилей (CSS) и базовый функционал манипуляций объектной модели документа (DOM) средствами JavaScript (JS). Определение базового функционала - см. пункт 13
  • Верстка должна соответствовать макетам. При этом верстка не выполняется методом Pixel Perfect (если не обсуждается отдельно) и при наложении прозрачного слоя возможны отличия с относительной погрешностью до 5% (размеры элементов, рендеринг шрифтов и межстрочных/межбуквенных расстояний, а также внутренних и внешних отступов). Например в дизайне отступ от секции 100px, в верстке ставим 100px как измерялось в макетах, а на практике получилось 105px из-за того что сыграл line-height заголовка
  • Все текстовые элементы макетов должны верстаться текстом, за исключением случаев, где подобная реализация невозможна технически
  • Все изменения :hover состояний, и :focus эффекты полей вида input сопровождаются микро анимациями и transition эффектами

1. Перед стартом / проверка макетов

  • Если макеты в PSD, Проверьте настройки вашего рабочего профиля. Должен быть установлен sRGB. Если по какой то причине дизайнер прислал файлы в другом профиле, все равно открывайте его в рабочем sRGB. как установить профиль
  • Заранее проверьте макеты на предмет возможности экспорта векторных файлов, режимов наложения и технический возможности реализации задумок дизайнера.
  • Проверяйте скрытые слои если таковые присутствуют
  • В процессе работы проверяйте стили текстов в плане line-height, letter-spacing и др. Часто это упускается из виду
  • Проверьте сетку макета и спланируйте работы. Иногда сетки имеют gutter space в 20px или 50px, а не стандартные 30px. Это поможет избежать необходимости в костылях в дальнейшем
  • Пробегитесь по этому списку (гайд для дизайнеров по верстке, но полезно и в обратном направлении)

2. Поддержка браузеров

  • HTML-шаблоны должны корректно отображаться в следующих версиях браузеров
  • Internet Explorer версии 10 и выше, платформа — операционные системы семейства Windows;
  • Mozilla Firefox версии 28 и выше — Windows версии XP и выше и Mac OS X версии 10.8 и выше;  
  • Safari версии 6.1 и выше — Mac OS X версии 10.8 и выше;
  • Google Chrome версии 21 и выше — Windows версии XP и выше и Mac OS X версии 10.8 и выше;
  • Opera версии 15 и выше — Windows версии XP и выше и Mac OS X версии 10.8 и выше;  
  • Браузеры мобильных устройств iOS 7 и выше
  • Браузеры мобильных устройств Android 5 и выше, за исключением UC Browser
  • При верстке учитываются особенности браузеров, их ограничения внешнего вида и поведения объектов. Для обеспечения правильного отображения элементов в разных браузерах может применяться грациозная деградация.

3. Стиль программирования

  • Табуляция кода через двойной пробел. Можно использовать плагины в котором tab превращается в двойной пробел (так например делает редактор atom по умолчанию). Требование связано с единостью стиля чтобы компиляция не падала на ошибках вложенности
  • Обязательно комментирование крупных смысловых блоков в целях читаемости
  • Верстка может быть невалидной по валидатору W3C
  • Осмысленное наименование классов по BEM методологии (классический стиль block__element--modifier). Обязательно загляните сюда 

4. Сборка

  • Новый проект нужно начинать на основе этой Gulp.js сборки (доработанная версия сборки Артюха). Есть индексная страница, все препроцессоры, результат собирается в dist который игнорируется в git и не конфликтует при пуше. Удобно настроена работа с svg и png спрайтами. По умолчанию установлены все необходимые js плагины и barba.js
  • Зависимости которые собираются в js и css продакшен-кода должны быть установлены через bower

5. Адаптивность

  • Под адаптивной версткой подразумевается отзывчивая (англ. - “responsive”) верстка, при которой содержимое страницы подстраивается под фактические размеры окна браузера, без рывков по ширине глобальных контейнеров на ключевых точках (“брейкпойнтах”). Другими словами, глобальные контейнеры всегда должны быть 100% ширины
  • При размерах более 320px не должно возникать горизонтальной прокрутки страницы (за исключением отдельных блоков верстки, где подобная реализация предусмотрена дизайн-макетами).
  • Допускается использование desktop first методов в подходе
  • Ключевыми “брейкпойнтами” принято считать - 1920(hd+), 1440 (hd), 1200px (wide), 992px (desktop), 768px (tablet), 568px(mobile), 414px(mobile-s). Применяются для адекватного, пропорционального изменение отступов и размеров шрифтов. Либо, при наличии макетов мобильной версии, соответствии таковым
  • Допускается использование других брейкпойнтов при необходимости с произвольным интервалом @media выражений

6. Каскадные стили таблиц (CSS)

  • Для создания CSS должны использоваться пре/пост процессоры. В порядке приоритетности, исполнитель в праве выбрать: sass, postcss, less, stylus
  • Крайне желательно использование  “сахарного” синтаксиса, без ; и {} (прим. sass против scss). Либо исполнитель может разрабатывать промежуточные версии в scss синтаксисе и конвертировать в sass при готовности компонента
  • Обязательное использование autoprefixer и flexbugs. При желании любые другие postcss плагины
  • Недопустимо использование миксинов (@include) и экстендов(@extend) в целях общего понимания происходящего, пожалуйста без головоломок. Разработчики которые будут поддерживать проект не поймут что вы имеете ввиду под +cr, +bf, +padb, +flexjcsb
  • Нельзя использовать вендорные префиксы в препроцессорах которые могут быть добавлены автопрефиксером. Исключениями могут быть -webkit-appearance, -webkit-overflow-scrolling и прочие подобные
  • Предпочтительно использование собственной сетки на базе flexbox. В отдельных случаях допускается bootstrap 4 (обсуждается отдельно)
  • Не рекомендуется использование !important без крайней необходимости. Исключениями могут быть перебивание стилей от вендорных библиотек (например .slick-slide - display: flex !important }
  • Использовать normalize.css или reset.css

7. Плагины

  • Предпочтительно, но не обязательно, использование следующих js/css плагинов (в случае необходимости использования их функционала)
  • Карусели - slick, swiper (поддержка flex и очень гибкая настройка), owl.carousel
  • Модальные окна - magnific popup, fancybox
  • Валидация форм - jQuery Validate Plugin.
  • Валидация “маской” (прим. - поля ввода телефон) - jQuery Mask Plugin
  • Календарь air-datepicker 
  • svg4everybody (поддережка svg для IE10), viewport-units-buggyfill (фикс для вьюпорта мобильных устройств с учетом адрес-бара. особенно актуально для iOS)
  • scrollMonitor.js - в сборке настроено для эмуляции wow.js, только с гибкой настройкой и задержкой выполнения события. либо AOS
  • anime.js / пакет GSAP - для сложных анимаций
  • rellax.js - для parallax анимаций (плавность за счет использования requestAnimationFrame)
  • barba.js - опциональный плагин. В существенной мере усложняет разработку JS из-за необходимости байдинга от $(document) и переинициализации всех скриптов при загрузке новой страницы
  • Lazy загрузка изображений, тоже опционально

8. Javascript

  • Подробное комментирование в javascript коде, если функции имеют запутанный, нестандартный подход
  • Функции должны группироваться смысловыми блоками (прим. сначала - общие функции, затем все карусели, затем все модальные окна и так далее). Простое дописывание кода в конец файла в ходе верстки крайне не рекомендуется
  • При использовании ES6 синтаксиса, обязательна компиляция через babel в пределах /src
  • Хорошей практикой считается использование в JS байдингах атрибутов либо классов с префиксом js- . В наименовании использовать синтаксис camelCase. Необходимо для разграничения разметки, чтобы при интеграции разработчику было понятно в каких элементов привязан функционал. Например _document.on(‘click’, ‘[js-openTab]’, func.. ).
  • Классы на изменения состояния должны быть с префиксами .is- . Например .is-opened, .is-active, .is-hovered и т.д. Но не модификаторами --active
  • Кеширование jQuery объектов если используется более 2х раз внутри функции
  • Использование debounce/throttle функций на .scroll, .resize и прочие ресурсоемкие задачи (есть в сборке)
  • Округление рассчитываемых css значений через Math.floor() или Math.round (трансформы, размеры, марджины и т.д)

9. Иконки и маленькие изображения

  • Первый приоритет - использование svg спрайтов.
  • Второй приоритет - png спрайты через элемент <i>, <span>
  • Третий приоритет - html теги img
  • Все иконки должны быть оптимизированы для retina экранов. Экспорты слоев из photoshop/sketch происходит в разрешении 1x и 2x (1x без постфикса, 2x - filename@2x.png)
  • Допускается использование только 2x изображений по умолчанию

10. Изображения

  • Все изображения должны быть оптимизированы через сервис tinypng в целях уменьшения суммарного веса картинок. Стандартные gulp оптимизаторы не проявили достаточной эффективности
  • При использовании inline png в css, картинка должна быть оптимизирована До перевода в base64
  • Обязательно использование srcset параметров в случае если макеты позволяют экспортировать изображения в большем размере для 2x экранов с высокой плотностью пикселей src=’img/name.png srcset=’img/name@2x.png 2x
  • Непрозрачные картинки необходимо экспортировать в .jpg в целях экономии размера файла

11. Шрифты

  • Шрифты, доступные через сервис google fonts должны подключаться с CDN google.fonts
  • В случае, если шрифты не находятся в бесплатном публичном доступе, исполнитель имеет право:
  • Запросить шрифт у заказчика
  • Использовать любой другой шрифт на свое усмотрение
  • Используются колбеки типа шрифтов sans-serif, serif, monospace и т.д.
  • Шрифты необходимо подключать в форматах  eot, svg, ttf, woff, woff2. Используйте https://transfonter.org 
  • При подключении шрифтов одного семейства, перепишите font-weight в @font-face правиле чтобы в css можно было управлять жирностью и стилем через font-weight: 300 вместо font-family: ‘SuperFont-Light’, sans-serif

12. Верстка элементов

  • Верстка должна проходить тесты на переполнения и незаполнения. То есть также быть отзывчивой по высоте элементов. В большинстве случаев недопустимы фиксированные значения height. Используйте min-height вместо него, чтобы при наличии больших текстовых блоков текст не вылезал из блоков или обрезался
  • Текстовые блоки статей и user generated content (UGC) должны верстаться чистой разметкой пренебрегая правилами БЭМ. например блок с контентом новости/статьи или комментария пользователя который будет выводиться из админки должен содержать чистые теги p, ul, li, blockquote, а не p.article-text__paragraph (наследование от родителя .article-content или .comment__body)
  • Избегайте наследования от глобального класса-модификатора от body, .global-wrapper и подобных для индивидуальных страниц. Для этого есть модификторы. Такая разметка неудобна при интеграции и конфликтует с barba.js
  • Приоритетом динамичного изменения DOM являются css методы реализации. Например добавление класса .is-active с opacity: 0 -> opacity: 1 вместо .hide() и .show()
  • Используйте pointer-events: none для объектов скрытых подобным образом чтобы не было ghost кликов по невидимкам

13. Базовый функционал

  • Под базовым функционал манипуляций объектной модели документа (DOM) средствами JavaScript (JS) принять следующий перечень функций:
  • Тогглеры состояний. Кнопки показать еще, скрыть должны раскрыть контент
  • Открытие панелей мобильного меню по иконке-гамбургеру
  • Показ/скрытие любых элементов, предусмотренных и отрисованных в макетах
  • Поля отмеченные как иконка-календарь должна содержать интерактивный компоненты выбора даты (datepicker). Выбор компонента (плагина) осуществляется исполнителем, или в соответствии с заказчиком по предварительной договоренности
  • Поля вида input могут иметь маски ввода, например телефон может иметь маску +7 999 999-99-99
  • Валидация форм на базовые параметры (email, телефон, заполненность имя)
  • Интеграция API решений заказчика и реальный функционал готового сайта не входит в понятие базового функционала верстки и обсуждается отдельно

14. Минификация кода

  • Перед сдачей должен иметь версию минифицированного кода css/js.
  • Допустимо, но не обязательно, использование минифицированного кода в каждой итерации
  • Допустимо использование мастер-файла (bundle). Проект имеет один общий js файл и общий .css. Другими словами, если проект имеет 20 типовых шаблонов, не создается 20 отдельных файлов .min.js и .min.css, уникальных для каждой страницы

15. Структура проекта

  • При использовании сборщиков, должны быть глобальные папки /src и /dist
  • css файлы лежат в поддиректории /css
  • javascript файлы лежат в поддиректории /js
  • Файлы препроцессоров css должны быть разбиты на компоненты
  • Приветствуется разбитие на pug компоненты элементов которые повторяются более 2х раз на разных страницах. Но не нужно переусердствовать с разбитем чтобы не держать одновременно 20 файлов перед глазами чтобы понять что происходит на странице
  • media выражения должны лежать в том же файле компонента. Недопустимо использование общего _media.sass файла в котором содержатся все @media

16. Организационные моменты:

  • Хорошей практикой является предоставление ежедневной отчетности и информирование о ходе работ.
  • Допускаются перерывы в работе до 2х дней. Работа в выходные дни и государственные праздники остается на усмотрение исполнителя
  • Работа ограничена 3мя итерациями - основная и 2 правок. В первой исполнитель делает как считает нужным, но допускает незначительное вмешивание заказчика в рамках корректировки глобальных моментов на которые нужно обратить внимание, чтобы потом не переделывать двойную работу. Далее собирается пакет правок и отправляется на исправление. После этого может быть еще одна такая итерация правок.
  • Обязательно ведение git реопзитория и домена на surge.sh

17. Примеры проектов

Хмелевской Сергей

https://t.me/khmelevskoy_s 

https://khmelevskoy.co