Как разместить фоновые изображения в электронных письмах HTML с динамической высотой из строки таблицы?

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

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

https://www.emailonacid.com/blog/article/email-development/html-background-images-in-email/ http://www.emaildesignreview.com/email-code/html-bulletproof-background-images-in-email-3850/ https://backgrounds.cm/ https://buttons.cm/

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

Я уже пробовал VML, и он помещает фон поверх фона и портит ширину таблицы.

Пока я захожу так далеко с таким макетом:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<!--[if mso]><xml><o:OfficeDocumentSettings><o:AllowPNG/><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings></xml><![endif]-->
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<meta content="width=device-width" name="viewport"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
</head>
<body id="body">
<div style="display: block; width: 100%;">      
<table role="presentation" align="center" width="600" style="border-collapse: collapse; table-layout: fixed;mso-table-lspace: 0pt; mso-table-rspace: 0pt; table-layout:fixed; width: 600px;">
<tr cellpadding="0" cellspacing="0" background="img.jpg" style="background-image: url(img.jpg); background-size: cover; background-repeat: no-repeat; background-position: center;">

<!--[if mso]>
<v:rect fill="true" stroke="false" style="width: 600px;">
<v:fill type="frame" src="img.jpg"/>';
<v:textbox style="mso-fit-shape-to-text:true" inset="0,0,0,0">
</v:rect>
<![endif]-->

<td colspan="3">
<p style="text-align: center;">Heading</p>
</td>
</tr>
<tr>
<td width="50%" height="100px"><p>Lorem ipsum dolor sit amet, <a href="#">consectetuer</a> adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, <a href="#">justo</a>. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,</p></td>
<td width="50%" height="100px"><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,</p></td>
</tr>
</table>
</div>
</body>
</html>

И я экспериментировал со встроенными стилями с mso-width-percent, mso-height-percent, width, height. Все еще не соответствует указанным 600px. Я бы хотел, чтобы фон был похож на этот CSS:

background-repeat: no-repeat;
background-position: center;
background-size: cover;

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

С клиентами, поддерживающими CSS, он работает так, как ожидалось, и намного проще, но не работает с Outlook.


person Shaun    schedule 15.02.2021    source источник


Ответы (1)


Оказывается, я недавно писал о свойствах фона в VML. Вот эквиваленты в VML для элемента <v:fill> упомянутых вами свойств CSS:

  • type="frame" эквивалентно background-repeat: no-repeat;
  • origin="0,0" position="0,0" эквивалентно background-position: center; (это также значение по умолчанию для <v:fill>, поэтому мы можем просто его опустить)
  • aspect="atleast" эквивалентно background-size: cover;

Также несколько замечаний по коду, который вы разместили:

  • В конце вашего элемента <v:fill> есть дополнительная кавычка и точка с запятой (<v:fill type="frame" src="img.jpg"/>';)
  • В VML </v:textbox> и </v:rect> должны быть закрыты после содержимого, которое вы хотите поверх фона.
  • Применение фона CSS к <tr> кажется мне немного схематичным. Хотя это может быть просто личным предпочтением, я бы предпочел использовать здесь <div>.
  • В настоящее время HTML background действительно не нужен. свойство фона CSS теперь довольно хорошо поддерживается.

Вот полный пример кода, который я переписал:

<!DOCTYPE html>
<html lang="en" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Background</title>
    <!--[if mso]>
    <xml>
        <o:OfficeDocumentSettings>
            <o:PixelsPerInch>96</o:PixelsPerInch>
        </o:OfficeDocumentSettings>
    </xml>
    <![endif]-->
</head>
<body>
    <table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:600px; margin:0 auto;">
        <tr>
            <td>
                <div style="background:0 0/cover; background-image:url(https://i.imgur.com/d4mw7CC.jpg); background-size:cover; background-repeat:no-repeat; background-position:center;">
                    <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
                        <tr>
                            <td>
                                <!--[if mso]>
                                <v:rect filled="true" stroked="false" style="width:600px;">
                                    <v:fill aspect="atleast" type="frame" src="https://i.imgur.com/d4mw7CC.jpg" />
                                    <v:textbox style="mso-fit-shape-to-text:true" inset="0,0,0,0">
                                <![endif]-->
                                <p style="text-align: center;">Heading</p>
                                <!--[if mso]>
                                    </v:textbox>
                                </v:rect>
                                <![endif]-->
                            </td>
                        </tr>
                    </table>
                </div>
                <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
                    <tr>
                        <td width="50%" height="100px"><p>Lorem ipsum dolor sit amet, <a href="#">consectetuer</a> adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, <a href="#">justo</a>. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,</p></td>
                        <td width="50%" height="100px"><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,</p></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
</body>
</html>

А здесь вы можете увидеть скриншоты тестов в Email на Acid.

person HTeuMeuLeu    schedule 16.02.2021
comment
Я последовал вашему совету и получил изображение на месте, однако текст отсутствует, что я использовал HTML, что я вставил такие элементы, как div и table, ничего не отображается в виде текста над изображением в Outlook. Но в браузере работает нормально. Изменение, которое я сделал в своем электронном письме, заключается в том, что на этот раз я указал высоту строки таблицы, чтобы также поместить ее с VML в прямоугольное поле. - person Shaun; 16.02.2021
comment
Ой, мой плохой! На самом деле я пропустил закрывающую косую черту в элементе <v:fill>. Добавление решает проблему. Я отредактировал код выше. Вот рендеринг для Outlook в Windows: app.emailonacid.com/app/acidtest/< /а> - person HTeuMeuLeu; 16.02.2021
comment
Макет теперь работает как задумано. - person Shaun; 16.02.2021