Как сделать HTML-таблицу отзывчивой для шаблона электронной почты, если использование внешнего файла CSS невозможно

Я создал шаблон электронной почты, в котором используется макет из двух столбцов. Это был мой подход:

<table>
    <tr>
      <td colspan="2" align="center">
          <h1>Header of my email template</h1>
      </td>
    </tr>
    <tr>
        <td>
            <img src="image1.jpg" alt="Image 1" />
        </td>
        <td>
            <img src="image2.jpg" alt="Image 2" />
        </td>
    </tr>
    <tr>
      <td colspan="2" align="center">
          <p>Footer of my email template</p>
      </td>
    </tr>
</table>

На десктопе работает отлично! У меня есть макет с двумя столбцами именно так, как я хотел. Проблема в телефонах, потому что экраны слишком малы для двухколоночного макета. Мне нужно одно изображение в строке, а не два, для мобильных устройств. Что я мог бы сделать, так это использовать float:left;width:100% для элементов <td>, содержащих изображения, чтобы у меня был один макет столбца, который мне нужен. Однако этот float:left;width:100% должен применяться только тогда, когда, например, @media screen and (max-width:450px). Но нет возможности использовать @media screen and (max-width:450px) с помощью встроенного CSS. Помните, что это для шаблона электронной почты. Поэтому я не могу вызывать внешние файлы CSS или добавлять CSS в <head> страницы, потому что это код, который будет отправлен для шаблона электронной почты.

Я нашел на https://kb.benchmarkemail.com/using-css-in-html-emails/ этот совет, но это не решение для адаптивных таблиц:

Список задач

Используйте таблицы для оформления. Таблицы поддерживаются более последовательно. Мы рекомендуем размещать код CSS прямо в вашем контенте. Это должно выглядеть примерно так: Ваше содержимое здесь.... Объявите ширину, отступы и интервалы между ячейками для всех таблиц и ячеек таблицы. Это приведет к фиксированной ширине шаблона. Используйте атрибуты тегов hspace и vspace, чтобы добавить пробелы вокруг изображения. Встроенные стили полей и отступов поддерживаются большинством, но не всеми почтовыми клиентами.

Любые идеи? Спасибо.


person Jaime Montoya    schedule 02.04.2020    source источник
comment
Какое приложение вы используете в мобильном телефоне? Gmail поддерживает @media: developers.google.com/gmail/design/css   -  person A. Meshu    schedule 03.04.2020
comment
@A.Meshu Я вижу, что developers.google.com/gmail/design/css предоставляет пример, где <style> находится внутри <head>. Проблема в том, что шаблон электронной почты, который я пишу, отправляет только <table>, предполагая, что он пойдет прямо к <body> электронной почты. Я ничего не вставляю в <head>. Должен ли мой шаблон электронной почты быть <html><head></head><body><table>..........</table></body></html>, а не только <table>..........</table>, который я отправляю?   -  person Jaime Montoya    schedule 03.04.2020
comment
На самом деле вам не нужен <head>, просто добавьте его к элементу <style> перед <table›. (modarn) Браузеры автоматически отображают правильное дерево.   -  person A. Meshu    schedule 03.04.2020
comment
@A.Мешу Вау! Это звучит потрясающе. То есть вместо <table>..........</table> мне нужно просто <style>..........</style><table>..........</table> и все?   -  person Jaime Montoya    schedule 03.04.2020
comment
ЖДАТЬ! Вам все равно нужно будет использовать встроенный стиль для Outlook, но для Gmail он должен работать...   -  person A. Meshu    schedule 03.04.2020
comment
@A.Meshu Я знаю. Конечно у меня будет вот это: <style>.class and/or #id elements for responsive table</style><table>My table invokes the corresponding id or class properties that I defined in the <style> area...</table>. Это правильно?   -  person Jaime Montoya    schedule 03.04.2020
comment
На самом деле вы не можете переопределить встроенные свойства стиля из элемента style. !important не работает все время. то есть, если вы установите: #demo {width: 100px;} из style, а затем используете встроенный стиль, то есть: <div id="demo" style="width: 150px;"> этот элемент, вероятно, будет занимать 150 пикселей.   -  person A. Meshu    schedule 03.04.2020
comment
@A.Meshu Я даже не планирую ничего переопределять. Если <style>.....</style><table>.....</table> работает, то весь мой CSS будет в <style>.....</style>, а в <table>.....</table> я буду вызывать только CSS, написанный на <style>.....</style>, а не писать встроенный CSS вообще, если на самом деле стили могут быть написаны на <style>.....</style>, как вы предложили. Не могли бы вы подтвердить это?   -  person Jaime Montoya    schedule 03.04.2020
comment
Я могу подтвердить 99%, что это будет работать в приложении Gmail. не на рабочем столе!   -  person A. Meshu    schedule 03.04.2020
comment
@A.Meshu Удивительно! Я протестирую его в ближайшие несколько минут/часов, и как только я подтвержу, что он работает, я вернусь, чтобы сообщить вам и посмотреть, можете ли вы официально написать это как ответ, чтобы пометить его как принятый, так что, надеюсь, это может быть полезно для другие люди :) Спасибо.   -  person Jaime Montoya    schedule 03.04.2020
comment
Давайте продолжим обсуждение в чате.   -  person Jaime Montoya    schedule 03.04.2020
comment
@A.Meshu Это не работает. Я использовал <style> @media screen and (max-width:450px) { .responsive { float:left!important; width:100%!important } } </style><table><tr><td class="responsive">.........</td></tr>.........</table>. Но это не работает. Я на 100% уверен, что мой CSS хорош, потому что, когда я использую встроенный код CSS float:left!important;width:100%!important, мой адаптивный дизайн работает. Так что это просто <style></style>, который не распознается. Работает ли это для вас? Вы были на 99% уверены, что это будет работать в приложении Gmail. Я использую приложение Gmail. Как заставить это работать?   -  person Jaime Montoya    schedule 03.04.2020
comment
Я был на 99% уверен, что это сработает, так как я сам скопировал и вставил пример @media из ссылки, которую я вам предоставил, и это сработало...   -  person A. Meshu    schedule 03.04.2020
comment
@A.Meshu Очень странно. Как это может работать для вас, но не для меня? Я изучу, что сообщество говорит об этом.   -  person Jaime Montoya    schedule 03.04.2020
comment
@A.Meshu Мне пришлось использовать <html><head><style type="text/css">..........</style></head><body>...........</body></html>, как я уже упоминал в своем ответе на свой вопрос. Только <style> @media screen and (max-width:450px) { .responsive { float:left!important; width:100%!important } } </style><table><tr><td class="responsive">.........</td></tr>.........</table> в моем случае не сработало. Мне пришлось начать с <html> и добавить <styles> в элемент <head>, как это обычно делается в любом HTML-документе. Спасибо, что помогли мне разобраться в этом!   -  person Jaime Montoya    schedule 03.04.2020


Ответы (2)


Google предлагает поддержку CSS: https://developers.google.com/gmail/design/css как указал А. Мешу в своем комментарии к моему вопросу.

Я нашел на https://templates.mailchimp.com/development/responsive-email/ что они говорят это:

«Вы можете оставить стили медиа-запросов в <head> вашего электронного письма, поскольку клиенты, поддерживающие медиа-запросы, не удаляют области <head> или <style>».

Это заставило меня подумать, что я должен отправить полный <HTML> документ, поэтому я даже включил <html><head><style type="text/css">..........</style></head><body>...........</body></html>.

Для других моих шаблонов электронной почты я просто отправляю код для <body>. Я запускаю шаблон с <div> и все работает. Но для этого шаблона сейчас я использую эту структуру:

<html>
<head>
<style type="text/css">
@media screen and (max-width:450px) {
    .responsive {
        float:left!important;
        width:100%!important
    }
}
</style>
</head>
<body>
..........
</body>
</html>

Спасибо А. Мешу за очень важные подсказки в своих комментариях к моему вопросу, чтобы разобраться.

person Jaime Montoya    schedule 03.04.2020

Поскольку элементы table являются блочными, я бы сказал, чтобы заменить эти td на вложенные table, как в 1999 году, а затем float первый оставшийся:

<table>
    <tr>
      <td colspan="2" align="center">
          <h1>Header of my email template</h1>
      </td>
    </tr>
    <tr>
        <td>
            <table style="float:left;">
                <tr>
                    <td>
                        <img src="image1.jpg" alt="Image 1" />
                    </td>
                </tr>
            </table>
            <table>
                <tr>
                    <td>
                    <img src="image2.jpg" alt="Image 2" />
                    </td>
                </tr>
            </table>
        </td>
    </tr>
    <tr>
      <td colspan="2" align="center">
          <p>Footer of my email template</p>
      </td>
    </tr>
</table>
person R Greenstreet    schedule 02.04.2020