Можно ли использовать display: block на td в HTML-письме электронной почты, чтобы добиться гибкого дизайна таблицы?

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

Теперь я пытаюсь применить ту же технику к html-сообщениям электронной почты, но display:block просто не будет работать в html-письмах.

Чтобы воспроизвести проблему:

  • Сохраните следующий код в виде HTML-страницы:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
    <head>
        <meta charset="utf-8">
        <style type="text/css">
            @media only screen and (max-width: 760px), screen and (max-device-width: 480px)  {
                /* Force table to not be like tables anymore */
                table, td, tbody, tr{
                        display: block;
                        width:100%;
                        padding:0;
                        clear:both;
                }
                td {
                        /* Behave  like a "row" */
                        position: relative !important;
                }
            }
        </style>
    </head>
    <body>
        <table style="width:100%;">
            <tr>
                <td style="border:1px solid red;">1/1</td>
                <td style="border:1px solid red;">1/2</td>
                <td style="border:1px solid red;">1/3</td>
            </tr>
            <tr>
                <td style="border:1px solid red;">2/1</td>
                <td style="border:1px solid red;">2/2</td>
                <td style="border:1px solid red;">2/3</td>
            </tr>
        </table>
    </body>
    </html>
    
  • Откройте страницу в Safari

  • Измените размер окна, чтобы отметить, как меняется таблица с меньшим размером окна

  • Нажмите CMD + i или File->Mail Содержимое этой страницы, чтобы создать HTML-адрес электронной почты

  • Измените размер окна электронной почты, чтобы узнать, как таблица по-прежнему правильно изменяется.

  • Отправьте электронное письмо себе и откройте его.

  • Теперь обратите внимание на то, как письмо действительно отвечает на мультимедийный запрос, но безуспешно рестайлинг таблицы.

Мне еще нужно найти почтовый клиент, который фактически отображает таблицу правильно. Это тупик или у вас есть идеи обходных решений?

Ответ 1

Принятый ответ дает отличную информацию, но он не затрагивает вопрос напрямую. Я экспериментировал с отзывчивыми электронными письмами в последнее время и придумал некоторые хорошие решения, которые другие могут найти полезными. Здесь мы идем...

Чтобы ответить на вопрос, вы можете использовать display:block;, чтобы столбцы таблицы отображались как строки на некоторых мобильных устройствах (Android, iOS и Kindle).

Вот пример, показывающий, как сделать 2-х столбцовый стек (слева столбцы в верхней части правой колонки) на мобильных устройствах.

HTML

<table class="deviceWidth" width="100%" cellpadding="0" cellspacing="0" border="0" style="border-collapse: collapse; mso-table-lspace:0pt; mso-table-rspace:0pt; ">
  <tr>
    <td width="50%" align="right" class="full">
      <p style="mso-table-lspace:0;mso-table-rspace:0; padding:0; margin:0;">
        <a href="#"><img src="http://placehold.it/440x440&text=LEFT" alt="" border="0" style="display: block; width:100%; height:auto;" /></a>  
      </p>                  
    </td>
    <td width="50%" align="left" class="full">
        <a href="#"><img src="http://placehold.it/440x440&text=RIGHT" alt="" border="0" style="display: block; width:100%; height:auto;" /></a>                     
    </td>
  </tr>
</table>

CSS

@media only screen and (max-width: 640px)  {
    body[yahoo] .deviceWidth {width:440px!important; }  T 

    body[yahoo] .full {
        display:block;
        width:100%;
    }
}

Примечание. Селектор body[yahoo] не позволяет Yahoo передавать медиа-запросы. Элемент body моего сообщения имеет атрибут yahoo="fix".

В приведенном выше CSS говорится, что если ширина экрана меньше 640 пикселей по ширине, то td с классом full должен display:block с width:100%.

Теперь давайте немного поучаствуем. Иногда вам нужно, чтобы столбец слева стекал НИЖЕ столбец справа. Для этого мы можем использовать dir="rtl" для содержащего table для перевода порядка столбцов. CSS остается прежним, здесь новый HTML:

HTML

<table class="deviceWidth" dir="rtl"  width="100%" cellpadding="0" cellspacing="0" border="0" style="border-collapse: collapse; mso-table-lspace:0pt; mso-table-rspace:0pt; ">
  <tr>
    <td width="50%" dir="ltr" align="right" class="full">
      <p style="mso-table-lspace:0;mso-table-rspace:0; padding:0; margin:0;">
        <a href="#"><img src="http://placehold.it/440x440&text=RIGHT" alt="" border="0" style="display: block; width:100%; height:auto;" /></a> 
      </p>                  
    </td>
    <td width="50%" dir="ltr" align="left" class="full">
        <a href="#"><img src="http://placehold.it/440x440&text=LEFT" alt="" border="0" style="display: block; width:100%; height:auto;" /></a>                      
    </td>
  </tr>
</table>

Добавив dir="rtl", мы говорим об этом, чтобы изменить порядок столбцов. Первый столбец (в потоке HTML) отображается справа, второй столбец (в HTML) слева. Для экранов размером менее 640 пикселей сначала отображается первый столбец (столбец справа), а второй столбец (столбец слева).

Здесь полный HTML и CSS и скриншоты из Gmail и iOS 5 прилагаются.

GmailiOS 5Android 4

Ответ 2

Я предлагаю вам обратиться к этому: http://www.campaignmonitor.com/css/

Несмотря на то, что это не очень актуально, это отличный ресурс с точки зрения поддержки электронной почты css. К сожалению при создании шаблонов электронной почты вам необходимо учитывать не только браузеры, но и разные клиенты, например. Перспективы и поддержка css, которые они предлагают, заведомо бедны.

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

Ответ 3

Я смог заставить его работать, вот результат: https://litmus.com/pub/d9ac198

Вот код, который я использую, чтобы заставить td вести себя как строки:

table[class="magic"],
table[class="magic"] tbody,
table[class="magic"] tr,
table[class="magic"] td {
    display: block !important;
    width: 100%;
}

Ответ 4

Другой подход - работать с двумя проектами в одном электронном письме: один для настольных компьютеров и один для мобильных читателей, как здесь.

Ответ 5

У меня такая же проблема! Я думал, что это будет работать только на Mail на устройствах iOS, но это происходит именно так, как вы говорите, - это работает, пока вы его не отправите.

@Luca, мы знаем, что поддержка невелика, но медиа-запросы игнорируются большинством, поэтому приятно добавить, если вы хотите, чтобы письмо выглядело немного лучше на современных почтовых клиентах. Outlook и другие все равно получат "нормальный" HTML-адрес электронной почты без медиа-запросов/отвечающих таблиц.

Ответ 6

Я обнаружил, что использование медиа-запросов для стека элементов td для мобильных устройств, таких как

td[class="stack-content"] {display:block !important}

похоже, работает для большинства устройств, за исключением Windows 7, который, по-видимому, не поддерживает отображение: свойство block.