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:
<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:
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.
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:
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
.
<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
:
<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.
<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:
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>
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:
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:
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;
}
}
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?