[Перевод] Создаём отзывчивые письма для будущего без медиа-запросов
Создавая HTML код для email, приходится иметь дело с изрядным количеством больных вопросов. И вряд ли для кого то будет приемлемо, если нам к тому же ещё и придётся следить за новыми email-клиентами и размерами устройств, которые появляются каждую неделю. Поддержка media query как и сам CSS разнятся среди приложений, в следствии этого, каждый раз когда вы слышите что появилось новое восхитительное почтовое приложение, для которого тоже нужно провести тесты, вас неизбежно одолевает страх.Но что если бы вы могли создать шаблон, который был бы отзывчивым даже в окружениях с наименьшей поддержкой современного CSS? Что если каждый раз, услышав о каком-то очередном почтовом приложении, которое все испытывают, вместо того чтобы предаваться страху, можно было бы чувствовать себя спокойно и уверенно, зная что ваши email наверняка будут выглядеть хорошо?
Приведенный ниже метод, сторонником которого я являюсь, всецело ориентирован на создание положительного опыта взаимодействия при работе с email-клиентами, у которых вообще отсутствует поддержка media query.
Он называется fluid-hybrid method, иногда упоминается как spongy метод для email разработок. Часть fluid предполагает что мы используем изрядной количество процентных вычислений. Часть hybrid означает что мы также используем max-width дабы ограничить некоторые из наших элементов на экранах большего размера.
Шесть главных проблем, которые мы намерены решить1. Приложение Gmail для Android и iOS — головная больОно более популярно чем дефолтное мейл-приложение для Android, но Gmail не поддерживает media queries, на которые мы традиционно полагаемся при изменении размера и формата на малых экранах. Этот обучающий материал покажет вам как создавать отзывчивые email-сообщения даже в Gmail app.2. Регулярное появление новых почтовых приложенийТрудно уследить за всеми новыми email приложениями, которые продолжают появляться. Некоторые из них действительно «уделяют внимание» рендерингу сообщений и обладают хорошей поддержкой CSS и media query, но некоторые более сфокусированы на самом потоке обработки писем и вообще не поддерживают media queries. Этот обучающий материал покажет как создавать мейлы, которые всегда отзывчивы вне зависимости от степени поддержки CSS.
3. Количество возможных размеров экрана устройства практически неограниченноУ нас есть не только огромные десктопы и крошечные смартфоны, у нас также имеются огромные смартфоны и крошечные лаптопы. Только потому, что кто-то осуществляет доступ к своему Gmail на лаптопе, не означает что его экран достаточно велик для отображения мейла шириной в 700 пикс.; и люди, используя iPhone 6+ могут обработать двухстолбцовую разметку, однако испытывают проблемы с одностолбцовой. Этот обоучающий материал покажет вам, как создать разметку, которая меняет формат чтобы соответствовать доступному пространству, даже в webmail.
4. Создание отзывчивых мейлов на мобильных устройствах с помощью расположенных столбцом
5. Использование метода отзывчивой разработки aligned table приводит к тому, что ваши таблицы упираются влево или вправо в мобильных приложениях, которые не поддерживают media queriesМетод в данном обучающем материале использует другой подход, который гарантирует, что все ваши столбцы будут расположены друг над другом по центру на мобильном устройстве, даже в Gmail app (вы также без труда сможете выровнять их по левой или правой стороне по собственному усмотрению).
Таблицы, выровненные по левому или правому краю, остаются на своих местах в мобильных приложениях, не поддерживающих media queries. Вы не можете это изменить с помощью мобильного CSS (mobile-specific CSS) В этом обучающем материале вам будет показано как расположить свои столбцы друг над другом по центру, даже в приложениях, которые не поддерживают media queries6. Когда вы используете метод отзывчивой разработки aligned table, вы теряете возможность выровнять содержимое по вертикали в столбцах, расположенных рядомЭтот обучающий материал также покажет вам как выровнять два столбца, расположенных в одном ряду, вертикально по верху или по середине так же, как если бы они были ячейками таблицы одного и того же ряда, и которые используют атрибут valign.
С помощью этого обучающего материала вы освоите метод «fluid hybrid», который позволит вам вертикально выравнивать столбцы по верху, середине или низу1. Давайте приступим Начните с создания чистого файла, сохраните его как index.html, затем скопируйте и вставьте следующий код:
Вы увидите, что я использую внешнюю таблицу стилей в этом обучающем материале, но вы вольны выбирать подход по своему усмотрению. Продолжая, создайте документ с названием styles.css и сохраните его в той же директории где находится HTML файл. Вы конце мы выполним инлайнинг нашего CSS.
Далее, между у нас имеется условный CSS для Outlook, который принудительно выполнит коллапс границ для всех таблиц и предотвратит появление ненужных пустых мест. Это условное выражение ориентирвано на все версии Microsoft Outlook (mso) начиная с 9ой версии и выше (это, по сути, все версии, т. к. 9я и самая ранняя — это Outlook 2000), также как и на те версии, которые использую Interner Explorer для рендера (Outlook 2000–2003).
Сразу же после body у нас расположен тег
2. Начальные стили Далее, создайте чистый CSS файл с названием styles.css Вставьте следующее в только что созданный файл: /* Basics */ body { Margin: 0; padding: 0; min-width: 100%; background-color: #ffffff; } table { border-spacing: 0; font-family: sans-serif; color: #333333; } td { padding: 0; } img { border: 0; } .wrapper { width: 100%; table-layout: fixed; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } .webkit { max-width: 600 px; } /* Windows Phone Viewport Fix */ @-ms-viewport { width: device-width; } Здесь я обнуляю margin и padding для body, таблицы и табличных ячеек, а также обнуляю всякие границы, которые могут появиться вокруг изображений по ссылкам. Наши стили для тегов table и td нужны в качестве замены HTML атрибутов cellpadding и cellspacing. Вы вправе выбрать HTML атрибуты как альтернативу, если желаете; в прошлом я всегда поддерживал выбор HTML атрибутов вместо CSS свойств там где это было возможно, однако, по мере того как я работал над более и более масштабируемыми проектами, я обнаружил что могу достичь большей управляемости, размещая это в CSS, в особенности если вы, как правило, работаете в платформе, которая автоматически обрабатывает CSS инлайнинг.Также я обычно добавляю min-width со значением в 100% тегу
, дабы избежать всяких ситуаций когда контент не занимает полную ширину вьюпорта на мобильном устройстве, также всегда хорошей идеей будет задать цвет для background, даже если он абсолютно белый, дабы избежать цветовых глюков background в Outlook или Lotus Notes.У нас также имеются свои стили с несколькими свойствами для .wrapper, которые препятствуют странному изменению размера текста на Windows Phones и iOS, вместе с этим table-layout: fixed будет гарантировать, что наш отцентрированный контент также будет отцентрирован в Yahoo mail. Мы устанавливаем max-width шириной в 600 px для нашего .webkit div для ограничения содержимого в Apple Mail 6 (и ниже) и Outlook 2011.
И наконец, у нас имеется фикс для вьюпорта, который вместе с двумя нашими метатегами в заголовке, будет гарантировать беспроблемное отображение на Windows Phones.
3. Создание внешнего структурного контейнера Начнём с одного из ключевых строительных блоков в данном методе: условной таблицы (conditional table) для Outlook, которая является скрытой для всех остальных клиентов. Нам это необходимо, т. к. мы собираемся использовать свойство max-width, которое Outlook не поддерживает. Поэтому нам необходимо создать специальные Outlook-only таблицы с явно заданной пиксельной шириной, которые будут всё вмещать. Применяется наша условная таблица для Outlook, т. к. Outlook не поддерживает свойство max-widthИтак, давайте удалим заполнитель [content goes here] из нашего HTML файла и вставим следующий код. Я стараюсь выравнивать все теги условного кода (conditional code) по левому краю и соблюдать равный уровень отступа для читабельности, но вы можете выравнивать их по собственному усмотрению.
[content goes here] |
Часто необходимо удостоверится, что ширина всех изображений задана в 100%, даже если они у́же самого маленького мобильного вьюпорта, т. к. это даёт вам больше гибкости при добавлении прогрессивного улучшения в виде media query.
Моё практическое правило — всякое изображение должно выводиться в соответствующем по физическим пикселям размере, если только это не иконка шириной менее 100 px
Итак, принимая это всё во внимание, мы сохранили изображение с именем header.jpg, шириной именно в 600 px и разместили его в нашей директории images. Позаимствуйте его или сохраните своё собственное и теперь вы можете выполнить предпросмотр HTML файла и увидеть как изображение гибко меняет размер в зависимости от размера вьюпорта.
5. Добавление одностолбцового макета Добавьте ещё одну строку в таблицу .outer с помощью следующей разметки:
Lorem ipsum dolor sit amet Maecenas sed ante pellentesque, posuere leo id, eleifend dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Praesent laoreet malesuada cursus. Maecenas scelerisque congue eros eu posuere. Praesent in felis ut velit pretium lobortis rhoncus ut erat. |
и набор классов для их стилизации. Мне нравится применять абзацы для стилизации текста и вы можете легко ими управлять благодаря хаку с большой М в Margin, о котором я упоминал ранее. Я также применяю
вместо
, т. к. у Outlook.com есть кое-какие стили для h1, h2 и h3, которые всегда перекрывают ваши стили.Таким образом в указанном выше CSS мы установили 10 px padding для нашего столбца, сбросили margin для
, установили некоторые базовые стили для ссылок и моих классов .h1 и .h2, а затем обеспечили выравнивание по левому краю в стилизированных абзацах для нашего столбца.
Теперь перейдём к увлекательному этапу… множеству столбцов!
6. Добавление двухстолбцового макета* *который будет отцентрирован при вертикальном складывании Мы намерены создать двухстолбцовый макет для декстопа, который на мобильных устройствах расположится вертикально, образуя единый отцентрированный столбецСперва добавьте новую строку в таблицу .outer. Она содержит ячейку с классом .two-column, а внутри неё — условную таблицу для Outlook с двумя столбцами шириной в 50%:
[content goes here] |
/*Two column layout*/ .two-column { text-align: center; font-size: 0; } Теперь мы зададим стиль нашему инлайн-блочному div, который ведёт себя как столбец: .two-column .column { width: 100%; max-width: 300 px; display: inline-block; vertical-align: top; } Мы используем ширину в 100% с максимальной шириной до 300 px, таким образом, именно у этого столбца на вьюпортах с шириной менее 300 px, будет 100% ширина.Вы можете задать своему vertical-align что угодно: top, center или bottom. [примечание переводчика: здесь, очевидно, ошибка — разве у vertical-align существует свойство center?] Значение top для vertical-align задаёт поведение при котором каждый столбец ведёт себя сродни табличной ячейки с HTML-свойством valign=«top», соответственно middle даёт эффект подобный valign=«middle». Обратите внимание, что у вас может быть множество строк из этих div внутри одной ячейки и вертикальное выравнивание всегда будет следовать принципу ряда за рядом. Это замечательно! Также удостоверьтесь, что выбор, который вы совершили здесь, совпадает с valign, который вы установили для условной таблицы Outlook, т. к. Outlook не поддерживает vertical-align. Если у вас выравнивание в Outlook не соответствует ожидаемому, то распространённой причиной может быть отсутствие заданного значения valign для условной таблицы.
Далее мы добавим таблицу с двумя строками в каждый столбец. Это отвечает за изображения и соответствующий им снизу текст, когда всё располагается столбцом на мобильных устройствах.
Итак, давайте заменим наши два заполнителя [content goes here] следующим:
Maecenas sed ante pellentesque, posuere leo id, eleifend dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. |
.contents { width: 100%; } А затем давайте добавим наш стайлинг двухстолбцовому макету, чтобы задать размер нашего шрифта и выравнивание текста, обеспечить вывод изображений на 100% ширину и установить немного паддинга для нашего тексту снизу:
.two-column .contents { font-size: 14 px; text-align: left; } .two-column img { width: 100%; height: auto; } .two-column .text { padding-top: 10 px; } Теперь у вас должен быть двухстолбцовый макет, который складывается столбцом по вертикали, когда вы меняете размер своего браузера, и сжимается должным образом, когда вы сужаете вьюпорт до менее 300 px.7. Добавление трёхстолбцового макета И снова мы намерены создать расположенные рядом (бок о бок) столбцы, которые складываются вертикально на мобильном устройстве, с помощью комбинации text-align: center и display: inline-block.Мы собираемся использовать text-align: center чтобы наши столбцы складывались по центру, но вы также можете применить выравнивание по левому или правому краю. Вот пример того, как складываются элементы при выравнивании по центру и по левому краю:
пример того, как будут сложены 3 столбца при задании контейнеру text-align: center пример того, как будут сложены 3 столбца при задании контейнеру text-align: leftИтак, мы повторим двухстолбцовый процесс, с добавлением дополнительного. Добавьте данный новый ряд в таблицу .outer. (Я обычно предпочитаю использовать процентную ширину для ячеек в условных таблицах Outlook, но в данном случае будет проще задать для каждой ширину в 200).
|
Добавление трёхстолбцового макета с множеством рядов Если вам нужно добавить большее количество рядов в свои многостолбцовые макеты, то вы можете добавить столько инлайн-блочных элементов в отдельную контейнерную ячейку, сколько вам необходимо. Таким образом, если вьюпорт становится слишком узок чтобы вмещать все столбцы, они просто пересортируются в соответствии со свободным местом. И хотя вам нет нужды разделять ряды из divов для большинства клиентов, вам определённо необоходимо добавить дополнительные
Heading Class eleifend aptent taciti sociosqu ad litora torquent conubia |
Добавьте левую таблицу в первый столбец, который содержит нашу иконку:
Praesent laoreet malesuada cursus. Maecenas scelerisque congue eros eu posuere. Praesent in felis ut velit pretium lobortis rhoncus ut erat. Read on |
/* Left sidebar layout */ .left-sidebar { text-align: center; font-size: 0; } .left-sidebar .column { width: 100%; display: inline-block; vertical-align: middle; } .left-sidebar .left { max-width: 100 px; } .left-sidebar .right { max-width: 500 px; } И, наконец, давайте зададим стили текста и цвет ссылки: .left-sidebar .contents { font-size: 14 px; text-align: center; } .left-sidebar a { color: #85ab70; } Теперь у вас должен получиться макет с левой боковой панелью и, когда вы уменьшите размер браузера, иконка расположится сверху текста по середине.9. Добавление макета с обратным 'Sidebar' Теперь мы хотим скопировать макет с боковой панелью и в этот раз нам необходимо чтобы иконка была с правой стороны, дабы создать визуальную привлекательность на десктопе. Но мы хотим чтобы контент на мобильном устройстве складывался столбцом точно так же, как и в нашем предыдущем макете с боковой панелью, дабы иконка была поверх текста.Сначала мы намерены скопировать и вставить весь наш ряд с ячейкой .left-sidebar, и единственное что мы будем менять — это класс контейнерной ячейки, с .left-sidebar на .right-sidebar:
Maecenas sed ante pellentesque, posuere leo id, eleifend dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra. Per inceptos |
Наши элементы будут выводиться в обратном порядке, если для их контейнера установлен dir=«rtl«Сперва, вам необходимо добавить dir=«rtl» для контейнера (.right-sidebar). Это указывает, что наши плавающие таблицы нужно выводить справа налево. Таким образом, наш открывающий тег теперь должен принять следующий вид:
И, наконец, нам необходимо добавить dir=«ltr» к нашим таблицам .column-left и .column-right, поскольку внутри них находится контент и, поскольку он на английском, его необходимо направлять слева направо. Если мы не установим это значение для данных элементов, они унаследуют направление справа налево от своих родительских элементов.Наш .column-left теперь должен выглядеть следующим образом:
Maecenas sed ante pellentesque, posuere leo id, eleifend dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra. Per inceptos |
Maecenas sed ante pellentesque, posuere leo id, eleifend dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra. Per inceptos |
Итак, добавьте следующее в свой CSS файл:
/*Media Queries*/ @media screen and (max-width: 400 px) { .two-column .column, .three-column .column { max-width: 100% ! important; } .three-column img { max-width: 50% ! important; } } Затем, для ширины между 401 px и 600 px, мы добавим следующее, чтобы двух и трёхстолбцовые макеты выводились как на декстопе, но при этом сжимались до подходящего размера. @media screen and (min-width: 401 px) and (max-width: 620 px) { .three-column .column { max-width: 33% ! important; } .two-column .column { max-width: 50% ! important; } } Это — абсолютно произвольные изменения для демонстрации возможностей, вы можете играться и возиться с этим сколько угодно, чтобы добиться желаемого результата во всём разнообразии размеров устройств, которые поддерживают media queries.11. Инлайнинг вашего кода Наконец, если вам нужно выполнить инлайнинг вашег