Отзывчивый стол в таблице - HTML email - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь создать отзывчивую электронную почту в HTML, но мне нужно поместить очень длинную таблицу в таблицу, которая является структурой. Это не проблема, чтобы сделать таблицу адаптивной с помощью overflow-x: auto, но сложно (для меня) сделать адаптивную таблицу в таблице.

Вот код ручки: https://codepen.io/Aventadorrre/pen/NWPeWdd Когда вы удаляете весь div table-wrapper , он отлично работает с небольшими устройствами. Когда у меня есть эта таблица в таблице, она только ругается.

<!doctype html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Simple Transactional Email</title>
    <style>
      /* -------------------------------------
          GLOBAL RESETS
      ------------------------------------- */

      /*All the styling goes here*/

      img {
        border: none;
        -ms-interpolation-mode: bicubic;
        max-width: 100%; 
      }

      body {
        background-color: #f6f6f6;
        font-family: sans-serif;
        -webkit-font-smoothing: antialiased;
        font-size: 14px;
        line-height: 1.4;
        margin: 0;
        padding: 0;
        -ms-text-size-adjust: 100%;
        -webkit-text-size-adjust: 100%; 
      }

      table {
        border-collapse: separate;
        mso-table-lspace: 0pt;
        mso-table-rspace: 0pt;
        width: 100%; }
        table td {
          font-family: sans-serif;
          font-size: 14px;
          vertical-align: top; 
      }

      /* -------------------------------------
          BODY & CONTAINER
      ------------------------------------- */

      .body {
        background-color: #f6f6f6;
        width: 100%; 
      }

      /* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
      .container {
        display: block;
        margin: 0 auto !important;
        /* makes it centered */
        max-width: 991px;
        padding: 10px;
        width: 991px; 
      }

      /* This should also be a block element, so that it will fill 100% of the .container */
      .content {
        box-sizing: border-box;
        display: block;
        margin: 0 auto;
        max-width: 991px;
        padding: 10px; 
      }

      /* -------------------------------------
          HEADER, FOOTER, MAIN
      ------------------------------------- */
      .locals {
        border-collapse: collapse;
        border-spacing: 0;
        width: 100%;
        border: 1px solid #ddd;
      }
      .locals td {
        text-align: center;
        padding: 8px;
      }

      .locals th {
        text-align: center;
        padding: 8px;
      }

      .table-title {
        margin-top: 35px;
      }

      .table-wrapper {
        margin-bottom: 30px;
      }

      .about-wrapper p {
        margin-bottom: 15px;
      }

      .main {
        background: #ffffff;
        border-radius: 3px;
        width: 100%; 
      }

      .wrapper {
        box-sizing: border-box;
        padding: 20px; 
      }

      .content-block {
        padding-bottom: 10px;
        padding-top: 10px;
      }

      .footer {
        clear: both;
        margin-top: 10px;
        text-align: center;
        width: 100%; 
      }
        .footer td,
        .footer p,
        .footer span,
        .footer a {
          color: #999999;
          font-size: 12px;
          text-align: center; 
      }

      /* -------------------------------------
          TYPOGRAPHY
      ------------------------------------- */
      h1,
      h2,
      h3,
      h4 {
        color: #000000;
        font-family: sans-serif;
        font-weight: 400;
        line-height: 1.4;
        margin: 0;
        margin-bottom: 30px; 
      }

      h1 {
        font-size: 35px;
        font-weight: 300;
        text-align: center;
        text-transform: capitalize; 
      }

      p,
      ul,
      ol {
        font-family: sans-serif;
        font-size: 14px;
        font-weight: normal;
        margin: 0;
        margin-bottom: 15px; 
      }
        p li,
        ul li,
        ol li {
          list-style-position: inside;
          margin-left: 5px; 
      }

      a {
        color: #3498db;
        text-decoration: underline; 
      }

      /* -------------------------------------
          BUTTONS
      ------------------------------------- */
      .btn {
        box-sizing: border-box;
        width: 100%; }
        .btn > tbody > tr > td {
          padding-bottom: 15px; }
        .btn table {
          width: auto; 
      }
        .btn table td {
          background-color: #ffffff;
          border-radius: 5px;
          text-align: center; 
      }
        .btn a {
          background-color: #ffffff;
          border: solid 1px #3498db;
          border-radius: 5px;
          box-sizing: border-box;
          color: #3498db;
          cursor: pointer;
          display: inline-block;
          font-size: 14px;
          font-weight: bold;
          margin: 0;
          padding: 12px 25px;
          text-decoration: none;
          text-transform: capitalize; 
      }

      .btn-primary table td {
        background-color: #3498db; 
      }

      .btn-primary a {
        background-color: #3498db;
        border-color: #3498db;
        color: #ffffff; 
      }

      /* -------------------------------------
          OTHER STYLES THAT MIGHT BE USEFUL
      ------------------------------------- */
      .last {
        margin-bottom: 0; 
      }

      .first {
        margin-top: 0; 
      }

      .align-center {
        text-align: center; 
      }

      .align-right {
        text-align: right; 
      }

      .align-left {
        text-align: left; 
      }

      .clear {
        clear: both; 
      }

      .mt0 {
        margin-top: 0; 
      }

      .mb0 {
        margin-bottom: 0; 
      }

      .preheader {
        color: transparent;
        display: none;
        height: 0;
        max-height: 0;
        max-width: 0;
        opacity: 0;
        overflow: hidden;
        mso-hide: all;
        visibility: hidden;
        width: 0; 
      }

      .powered-by a {
        text-decoration: none; 
      }

      hr {
        border: 0;
        border-bottom: 1px solid #f6f6f6;
        margin: 20px 0; 
      }

      /* -------------------------------------
          RESPONSIVE AND MOBILE FRIENDLY STYLES
      ------------------------------------- */
      @media only screen and (max-width: 768px) {
        table[class=body] h1 {
          font-size: 28px !important;
          margin-bottom: 10px !important; 
        }
        table[class=body] p,
        table[class=body] ul,
        table[class=body] ol,
        table[class=body] td,
        table[class=body] span,
        table[class=body] a {
          font-size: 16px !important; 
        }
        table[class=body] .wrapper,
        table[class=body] .article {
          padding: 10px !important; 
        }
        table[class=body] .content {
          padding: 0 !important; 
        }
        table[class=body] .container {
          padding: 0 !important;
          width: 100% !important; 
        }
        table[class=body] .main {
          border-left-width: 0 !important;
          border-radius: 0 !important;
          border-right-width: 0 !important; 
        }
        table[class=body] .btn table {
          width: 100% !important; 
        }
        table[class=body] .btn a {
          width: 100% !important; 
        }
        table[class=body] .img-responsive {
          height: auto !important;
          max-width: 100% !important;
          width: auto !important; 
        }
      }

      /* -------------------------------------
          PRESERVE THESE STYLES IN THE HEAD
      ------------------------------------- */
      @media all {
        .ExternalClass {
          width: 100%; 
        }
        .ExternalClass,
        .ExternalClass p,
        .ExternalClass span,
        .ExternalClass font,
        .ExternalClass td,
        .ExternalClass div {
          line-height: 100%; 
        }
        .apple-link a {
          color: inherit !important;
          font-family: inherit !important;
          font-size: inherit !important;
          font-weight: inherit !important;
          line-height: inherit !important;
          text-decoration: none !important; 
        }
        #MessageViewBody a {
          color: inherit;
          text-decoration: none;
          font-size: inherit;
          font-family: inherit;
          font-weight: inherit;
          line-height: inherit;
        }
        .btn-primary table td:hover {
          background-color: #34495e !important; 
        }
        .btn-primary a:hover {
          background-color: #34495e !important;
          border-color: #34495e !important; 
        } 
      }

    </style>
  </head>
  <body class="">
    <span class="preheader">This is preheader text. Some clients will show this text as a preview.</span>
    <table role="presentation" border="0" cellpadding="0" cellspacing="0" class="body">
      <tr>
        <td>&nbsp;</td>
        <td class="container">
          <div class="content">

            <!-- START CENTERED WHITE CONTAINER -->
            <table role="presentation" class="main">

              <!-- START MAIN CONTENT AREA -->
              <tr>
                <td class="wrapper">
                  <table role="presentation" border="0" cellpadding="0" cellspacing="0">
                    <tr>
                      <td>
                        <p>Szanowni Państwo,</p>
                        <p>Dziękuję serdecznie za zainteresowanie inwestycją Rezydencja Gubałówka. <br><br>W odpowiedzi na zapytanie, załączam kilka informacji dotyczących inwestycji.</p>
                        <p>Nasza oferta to:</p>
                        <ul>
                          <li>Rentowność do 7% w skali roku od wartości zainwestowanej kwoty</li>
                          <li>W cenie apartamentu wykończenie pod klucz w bardzo wysokim standardzie</li>
                          <li>Do 2 tygodni pobytu właścicielskiego w roku</li>
                          <li>200 m od górnej stacji Polany Szymoszkowej </li>
                          <li>Umowa najmu na 10 lat</li>
                          <li>Pierwsza wpłata 20% kolejne wraz z realizacją inwestycji</li>
                          <li>Planowany termin oddania II kwartał 2022 r.</li>
                          <li>Możliwość rozliczenia podatku VAT (w tym celu zalecamy kontakt z właściwym Urzędem Skarbowym).</li>
                        </ul>
                        <p class="table-title"><strong>Poniżej znajduje się przykładowa oferta lokali od 12 do 39 m.kw.</strong></p>
                        <div class="table-wrapper" style="overflow-x: auto;">
                          <table class="locals">
                              <tr>
                                <th>Budynek</th>
                                <th>Kondygnacja</th>
                                <th>Nr lokalu</th>
                                <th>Powierzchnia po podłodze [m²]</th>
                                <th>Pokój [m²]</th>
                                <th>Łazienka [m²]</th>
                                <th>Balkon [m²]</th>
                                <th>Antresola [m²]</th>
                                <th>Cena m² netto</th>
                                <th>Cena netto</th>
                              </tr>
                              <tr>
                                <td class="align-center">5</td>
                                <td class="align-center">-1</td>
                                <td class="align-center">5A-07</td>
                                <td class="align-center">12,63</td>
                                <td class="align-center">10,43</td>
                                <td class="align-center">2,20</td>
                                <td class="align-center">-</td>
                                <td class="align-center">-</td>
                                <td class="align-center">21 900 zł</td>
                                <td class="align-center">276 597 zł</td>
                              </tr>
                              <tr>
                                <td class="align-center">5</td>
                                <td class="align-center">-1</td>
                                <td class="align-center">5A-07</td>
                                <td class="align-center">12,63</td>
                                <td class="align-center">10,43</td>
                                <td class="align-center">2,20</td>
                                <td class="align-center">-</td>
                                <td class="align-center">-</td>
                                <td class="align-center">21 900 zł</td>
                                <td class="align-center">276 597 zł</td>
                              </tr>
                          </table>
                        </div>
                        <div class="about-wrapper">
                          <p>Do każdego lokalu istnieje możliwość zakupu miejsca postojowego w garażu podziemnym w cenie 50.000 zł netto. Kwota ta zalicza się do kwoty zainwestowanej od której naliczany jest czynsz.</p>
                          <p>Rezydencja Gubałówka to unikalny na skalę polską obiekt położony w Kościelisku na szczycie góry Gubałówka. Dzięki swojej unikalnej lokalizacji, Rezydencja Gubałówka zyskała szerokie grono klientów ceniących Zakopane za shopping i życie nocne (10 min. od Krupówek), wspaniałą naturę (Rezydencję otaczają łąki i lasy) oraz luksus (w obiekcie znajdą Państwo basen, spa, nagradzaną restaurację oraz bardzo wysoki standard wykończenia). Zapierające wdech w piersiach widoki powodują, że Rezydencję odwiedza coraz więcej turystów ceniących piękno natury i aktywną turystykę bez kompromisu.</p>
                          <p>Obiekt funkcjonuje od 2017 roku o stale rosnącej popularności (<strong>średnia ocena na <a href="#">domain.com</a> to 9,2</strong>). </p>
                          <p>Zapraszam do odwiedzenia strony naszego obiektu <a href="#">www.domain.com/</a>, <br> oraz strony naszej inwestycji <a href="#">domain.com</a></p>
                        </div>
                      </td>
                    </tr>
                  </table>
                </td>
              </tr>

            <!-- END MAIN CONTENT AREA -->
            </table>
            <!-- END CENTERED WHITE CONTAINER -->

            <!-- START FOOTER -->
            <div class="footer">
              <table role="presentation" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td class="content-block">
                    <span class="apple-link">Dział Sprzedaży Rezydencja Gubałówka</span>
                  </td>
                </tr>
              </table>
            </div>
            <!-- END FOOTER -->

          </div>
        </td>
        <td>&nbsp;</td>
      </tr>
    </table>
  </body>
</html>

1 Ответ

0 голосов
/ 17 февраля 2020

Существует три основных способа решения адаптивных таблиц в HTML электронных письмах. Overflow-x не будет работать на всех почтовых клиентах, поэтому это не решение.

Гибридный подход к столбцам

То, что у вас есть:

[ head1] [head2] [head3]

[data1] [data2] [data3]

[data4] [data5] [data6]

Но то, что вам нужно для мобильного реагирования используется вертикальная таблица:

[head1] [data1]

[head2] [data2]

[head3] [data3]

Со второй строкой в ​​качестве другой таблицы:

[head1] [data4]

[head2] [data5]

[head3] [data6]

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

См. Полную запись с примером кода для 4 столбцов здесь: https://medium.com/@nathankeenmelb / bulletproof -responsive-datatables-in- html -emails-64248b9e18f5

Таблица как изображение

Вы можете сохранить всю таблицу как изображение; таким образом вы включаете масштабирование и прокрутку для всех почтовых клиентов.

Тем не менее, он имеет большой недостаток в том, что данные недоступны и требуют от пользователя обширного взаимодействия для чтения (масштабирование, постоянное перемещение влево / вправо). и вверх / вниз).

Карты

Должно ли быть выполнено в виде таблицы? Возможно, лучше подходить для группировки данных в «карточку», позволяя вам использовать несколько строк (плюс они читаются намного лучше!).

Example of changing a table into a card

См. Мою запись здесь: https://medium.com/@nathankeenmelb / отзывчивый-datatables-card-ui-design-for-email-aca6f3c395a2

...