Técnicas para codificar um e-mail - parte 3

No segundo post da série, aprendemos a lidar com espaçamento nos e-mails. Neste, iremos abordar como criar conteúdo em colunas e como deixá-las responsivas.

Finalmente chegamos ao conteúdo! Para começar, vamos criar uma nova tabela. É possível usar a mesma tabela do container e alterar o bgcolor para mudar a cor da célula em vez da tabela. Mas aconselho a criar uma nova para evitar problemas com o colspan e rowspan, porque essas propriedades causam problemas para manter a estrutura correta à medida que são criadas novas células.

Para montar o conteúdo, vamos usar as mesmas técnicas citadas nos posts anteriores:

E-mail com o conteúdo

<table bgcolor="#ffffff" width="100%" cellpadding="0" cellspacing="0" style="padding-left: 15px; padding-right: 15px">
    <tr>
        <td>
            <h2 style="padding: 0; margin: 0.5em 0; font-size: 1.5em; font-family: arial, sans-serif; color: #788895">Novidades do tech blog!</h2>
            <img src="http://placehold.it/570x150" alt="Imagem" width="570" height="150">
            <p>Lorem ipsum  [...]</p>
            <p>Phasellus vulputate [...]</p>
        </td>
    </tr>
</table>

Mas temos um problema: com essa modificação, o e-mail deixou de ser responsivo por causa da imagem com largura fixa que expande o tamanho de seu container, fazendo com que os outros elementos ocupem uma área maior:

Problema da largura fixa nos dispositivos móveis

Para torná-lo responsivo, basta adicionar uma largura na imagem para que ocupe o maior espaço possível do container sem expandi-lo, ou seja, width: 100%. O problema dessa técnica é que a altura definida acaba deixando a imagem desproporcional em telas menores.

Adicionando largura 100% para os dispositivos móveis

Uma solução é remover a altura fixa, mas caso a imagem esteja carregando ou não possa ser carregada (por URL inválida ou inacessível ou até mesmo o cliente de e-mail impedir a sua exibição, por exemplo), o nosso navegador não consegue definir a altura e usará um valor proporcional à largura:

Template do e-mail quebra quando a imagem demora para carregar

A solução que acredito ser a melhor é fazer uma mescla de width="100%" e limitar o tamanho da imagem com o max-width e o max-height.

Imagem com altura máxima definida

<table bgcolor="#ffffff" width="100%" cellpadding="0" cellspacing="0" style="padding-left: 15px; padding-right: 15px">
    <tr>
        <td>
            <h2 style="padding: 0; margin: 0.5em 0; font-size: 1.5em; font-family: arial, sans-serif; color: #788895">Novidades do tech blog!</h2>
            <img src="http://placehold.it/570x150" alt="Imagem" width="100%" style="max-width: 570px; max-height: 150px;">
            <p>Lorem ipsum  [...]</p>
            <p>Phasellus vulputate [...]</p>
        </td>
    </tr>
</table>

Colunas responsivas

Para as colunas, vamos criar duas tabelas com uma largura de 270px: uma com a imagem e a outra com o título do texto e a descrição:

<table cellpadding="0" cellspacing="0" width="270">
    <tr>
        <td>
            <img src="http://placehold.it/270x150" width="100%" style="max-width: 270px; height: 150px;" alt="Imagem veja mais">
        </td>
    </tr>
</table>

<table cellpadding="0" cellspacing="0" width="270">
    <tr>
        <td>
            <h2 style="margin: 0; font-size: 1.5em; font-family: 'Lobster', sans-serif; color: #788895">Veja mais!</h2>
            <p>Sed congue purus lorem, nec luctus nibh fermentum non. Ut fermentum aliquet nunc, tempus placerat turpis tristique sed.</p>
        </td>
    </tr>
</table>

Para alinhar os elementos na mesma linha, vamos usar a propriedade display: inline-block:

Colunas em e-mail

<table cellpadding="0" cellspacing="0" width="270" style="display: inline-block">
    [...]
</table>

<table cellpadding="0" cellspacing="0" width="270" style="display: inline-block">
    [...]
</table>

Para alinhar no topo é só adicionar o atributo valign="top" (o valign tem a mesma função da propriedade vertical-align).

<table cellpadding="0" cellspacing="0" width="270" style="display: inline-block" valign="top">
    [...]
</table>

<table cellpadding="0" cellspacing="0" width="270" style="display: inline-block" valign="top">
    [...]
</table>

Por fim, vamos adicionar margem nas duas tabelas para separar o conteúdo verticalmente e uma margem à direita na primeira.

Colunas alinhadas verticalmente

<table cellpadding="0" cellspacing="0" width="270" style="display: inline-block; margin-right: 15px;" valign="top">
    [...]
</table>

E como usamos o display: inline-block, essas colunas já são responsivas:

Colunas em um dispositivo móvel

O problema agora é que a primeira tabela está causando um scroll horizontal. Isso porque a margem da direita (15px), somada à largura da imagem (270px) e a margem interna (30px), ultrapassa o limite de 300px (largura mínima de um celular).

Uma forma de resolver é remover o margin-right da primeira tabela e adicionar um span em volta da tabela com um border-right: 15px solid white. Essa borda se encarrega de criar o espaçamento entre as duas tabelas na horizontal e não contabiliza na soma por ser um elemento inline. Dessa forma conseguimos atingir o efeito desejado:

<span style="border-right: 15px solid white">
    <table cellpadding="0" cellspacing="0" width="270" style="display: inline-block" valign="top">
        [...]
    </table>
</span>
<span>
    <table cellpadding="0" cellspacing="0" width="270" style="display: inline-block" valign="top">
        [...]
    </table>
</span>

Colunas usando borda para criar a margem

A outra forma é adicionar uma media query específica para mobile e remover essa margem. Sim! Alguns clientes de e-mail agora aceitam a tag style no cabeçalho e media queries! Essa mudança está revolucionando o desenvolvimento de e-mails responsivos, criando experiência mais rica para os nossos usuários e melhorando a legibilidade do código.

Voltando ao nosso exemplo, vamos adicionar a tag style com uma media query dentro do header:

<head>
    <style>
        @media only screen and (max-width: 480px) {

        }
    </style>
</head>

As regras declaradas nessa media query serão aplicadas para todas as telas com uma largura de no máximo 480px, ou seja, apenas para a versão mobile. Para aplicar a regra de remoção da margem, vamos adicionar uma classe para a primeira tabela:

<table class="tabela-responsiva" bgcolor="#ffffff" width="100%" cellpadding="0" cellspacing="0" style="padding-left: 15px; padding-right: 15px; margin-right: 15px;">

E dentro da media query:

@media only screen and (max-width: 480px) {
    .tabela-responsiva {
        margin-right: 0 !important;
    }
}

O !important é necessário para conseguirmos sobrescrever o estilo que está declarado inline. Com essa mudança conseguimos atingir o mesmo resultado, entretanto a tag style no cabeçalho não funciona em alguns clientes de e-mail.

Voltando ao nosso e-mail, agora o único problema ainda não resolvido é o fato do template não ser exibido corretamente em telas um pouco menores que 600px, mas maiores que 480px:

Colunas quebram em duas linhas em devices com uma largura um pouco menor que 600px

Para esse problema, podemos alterar a largura das tabelas para serem baseadas em uma porcentagem. Por exemplo, se alterarmos as larguras dessas tabelas para 47% (um valor próximo da largura de 270px) teríamos o seguinte resultado:

Usando porcentagem nas colunas

Mas, como podemos ver, essa alteração piora a usabilidade na versão mobile. Nesse caso, podemos aproveitar a nossa media query no header e fazer essas tabelas ocuparem 100% do espaço em telas menores. Vamos adicionar a mesma classe .tabela-responsiva para a segunda tabela e adicionar a seguinte regra na media query:

@media only screen and (max-width: 480px) {
    .tabela-responsiva {
        margin-right: 0 !important;
        width: 100% !important;
    }
}

Template final

E voilá! Chegamos ao efeito desejado!

Também poderíamos optar por não utilizar a tag style para corrigir esse problema. Não resolveria muito, mas poderíamos voltar para as medidas fixas e adicionar uma tabela envolta para alinhar os elementos no centro e melhorar um pouco o design.

Por fim, podemos só adicionar uma tipografia padrão na tabela de conteúdo:

<table bgcolor="#ffffff" width="100%" cellpadding="0" cellspacing="0" style="padding-left: 15px; padding-right: 15px; font-family: arial, sans-serif">

Assim, todo o texto que está no conteúdo já herda por padrão essa tipografia.

Compatibilidade

As técnicas apresentadas funcionam nos seguintes clientes de email:

Web

Gmail Inbox Outlook Yahoo
Chrome ✗¹
Safari ✗¹
Firefox ✗¹
IE11 - ✗¹
Edge ✗¹
Chrome Mobile ✗¹ - ✗¹
Firefox Mobile ✗¹ - ✗¹
Safari Mobile ✗¹ - ✗¹

Mobile

Gmail App Inbox App Outlook App Yahoo App Apple Mail
Android -
iOS ✗¹ ✗¹ ✗¹ ✗¹
Windows Phone - - - -

Aplicativo Outlook

2007 2010 2011 2013 2015
Outlook ✗¹ ✗¹ ✗¹

¹ A propriedade style no head não funciona

Conclusão

Enfim, conseguimos finalizar o e-mail com o layout apresentado no primeiro post! No próximo e último post da série, vamos comentar sobre algumas dicas e web fonts nos e-mails.

E você? Já teve problemas com e-mails responsivos?