Czy istnieje odpowiednik maksymalnej szerokości CSS, który działa w e-mailach HTML?

115

Próbuję utworzyć wiadomość e-mail w formacie HTML, która będzie poprawnie wyświetlana we wszystkich powszechnie używanych klientach poczty e-mail. Zawijam całą wiadomość e-mail w tabeli i chciałbym, aby miała szerokość do 98% dostępnej szerokości, ale nie większą niż 800 pikseli. Lubię to: <table style="width:98%; max-width:800px;">

Ale nie robię tego w ten sposób, ponieważ zgodnie z tym Outlook 2007 nie obsługuje właściwości szerokości CSS.

Zamiast tego robię to: <table width="98%">

Czy istnieje sposób na ustawienie maksymalnej szerokości bez polegania na CSS?

Tim Goodman
źródło
1
Zaktualizowałem zaakceptowaną odpowiedź na tę z @MarkNugent, ponieważ wydaje się, że przyniosło to konsensus - nawet jeśli nadszedł 4 lata za późno, aby był dla mnie przydatny. :)
Tim Goodman

Odpowiedzi:

225

Tak, istnieje sposób na emulację max-widthprzy użyciu tabeli, co zapewnia zarówno responsywny, jak i przyjazny dla programu Outlook układ. Co więcej, rozwiązanie to nie wymaga warunkowych komentarzy.

Załóżmy, że potrzebujesz odpowiednika wyśrodkowanego divz max-widthz 350px. Tworzysz tabelę, ustawiasz szerokość na 100%. Tabela zawiera trzy komórki w rzędzie. Ustaw szerokość środka TDna 350(używając HTMLwidth atrybutu , a nie CSS) i gotowe.

Jeśli chcesz, aby zawartość była wyrównana do lewej, a nie wyśrodkowana, po prostu pomiń pierwszą pustą komórkę.

Przykład:

<table border="0" cellspacing="0" width="100%">
    <tr>
        <td></td>
        <td width="350">The width of this cell should be a maximum of 
                  350 pixels, but shrink to widths less than 350 pixels.
        </td>
        <td></td>
     </tr>
</table> 

W jsfiddle daję obramowanie tabeli, abyś mógł zobaczyć, co się dzieje, ale oczywiście nie chciałbyś takiego w prawdziwym życiu:

http://jsfiddle.net/YcwM7/

Mark Nugent
źródło
18
To najlepsza odpowiedź tutaj dla wszystkich ^^^. Zignoruj ​​zaakceptowaną odpowiedź i warunkową odpowiedź.
Nick Manning
4
Aby zaoszczędzić trochę czasu komuś innemu, potrzebny jest przynajmniej jeden z tych pustych elementów <td>, w przeciwnym razie <td> z zawartością rozciągnie się, aby wypełnić całe <tr>. Ale to zdecydowanie najlepsze rozwiązanie spośród oferowanych.
Chris Strickland
2
@Phyllis Sutherland Możesz spróbować usunąć rozmiar inline img i zastąpić go:style="max-width: 100%; height: auto; width: auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box;"
morespace54
5
uważaj, aby nie dodawać jednostek do wewnętrznej szerokości, tak jak ja, bo inaczej to nie zadziała! tj. don't do width = "350px"
magritte
3
@PhyllisSutherland znalazł poprawkę dla obrazów: <img src="file.jpg" "width="350" alt="" style="display:block;width:100%" /> litmus.com/community/discussions/ ...
cbron
34

Istnieje sztuczka, którą można zrobić w programie Outlook 2007, używając warunkowych komentarzy HTML.
Poniższy kod upewni się, że tabela Outlooka ma szerokość 800 pikseli, a nie maksymalną, ale działa lepiej niż pozostawienie tabeli w całym oknie.

<!--[if gte mso 9]>
<style>
#tableForOutlook {
  width:800px;
}
</style>
<![endif]-->

<table style="width:98%;max-width:800px">
<!--[if gte mso 9]>
  <table id="tableForOutlook"><tr><td>
<![endif]-->
    <tr><td>
    [Your Content Goes Here]
    </td></tr>
<!--[if gte mso 9]>
  </td></tr></table>
<![endif]-->
<table>
Shay Erlichmen
źródło
6
doskonała sugestia, ale ponieważ jest to selektor identyfikatora, a nie klasa, zaoszczędzisz trochę pisania, używając atr szerokości elementu tabeli
Steve Wasiura
To jest świetne. Z wyjątkiem jednego problemu, ustawiając szerokość, Outlook nie pozwoli, aby wiadomość e-mail zmniejszyła się o mniej niż podane wymiary. Bez ustawienia szerokości wiadomość e-mail rozszerzy się na cały ekran. Wybierz swoją truciznę :)
The Coordinator
13

Krótka odpowiedź: nie.

Długa odpowiedź:

Stałe formaty działają lepiej w przypadku wiadomości e-mail w formacie HTML. Z mojego doświadczenia wynika, że ​​najlepiej udawać, że jest rok 1999, jeśli chodzi o e-maile HTML. Podaj wyraźne informacje i używaj atrybutów HTML (width = "650"), jeśli to możliwe, w definicjach tabel, a nie CSS (style = "width: 650px"). Używaj stałych szerokości, bez wartości procentowych. Szerokość stołu o szerokości 650 pikseli to bezpieczny zakład. Użyj wbudowanego CSS, aby ustawić właściwości tekstu.

Nie chodzi o to, co działa w „e-mailach HTML”, ale raczej o mnogość klientów poczty e-mail i ich ograniczoną (a czasami celowo tak w przypadku Gmaila, Hotmaila itp.) Możliwość renderowania HTML.

Diodeus - James MacFarlane
źródło
Tak, tego się spodziewałem, ale pomyślałem, że zapytam.
Tim Goodman
35
Ustawienie stałej szerokości 650 sprawi, że Twoje e-maile będą wyglądać okropnie w mobilnych klientach poczty e-mail.
DrewB
6
-1: Wygląda okropnie, ponieważ urządzenia mobilne mają stosunkowo małe wymiary w prawdziwym świecie. Oznacza to, że bez powiększania i przesuwania tekst w twoich projektach będzie nieczytelnie mały. Zapoznaj się z przewodnikiem Campaign Monitor Responsive Email Design .
Karl Horky
1
-1 również dlatego, że poradziłem sobie z tym również w klientach mobilnych i posiadanie stałej szerokości było dokładnie moim problemem.
Brian FitzGerald
7
Jest rok 2015. Urządzenia mobilne są wszędzie. Mówisz, że chcesz zapomnieć o urządzeniach mobilnych dla głupiej perspektywy? Mówię, zapomnij o perspektywach. I każdy inny gówniany produkt Microsoftu.
refaelio
5

Trochę za późno na imprezę, ale to załatwi sprawę. Zostawiłem przykład na 600, ponieważ większość ludzi będzie tego używać:

Podobnie jak w przykładzie Shaya, z tym wyjątkiem, że obejmuje to również max-width do pracy z resztą klientów, którzy mają wsparcie, a także drugą metodę zapobiegania rozszerzaniu (zapytanie o media), które jest potrzebne w Outlook'11.

W głowie:

  <style type="text/css">
    @media only screen and (min-width: 600px) { .maxW { width:600px !important; } }
  </style>

W ciele:

<!--[if (gte mso 9)|(IE)]><table width="600" align="center" cellpadding="0" cellspacing="0" border="0"><tr><td><![endif]-->
<div class="maxW" style="max-width:600px;">

<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
  <tr>
    <td>
main content here
    </td>
  </tr>
</table>

</div>
<!--[if (gte mso 9)|(IE)]></td></tr></table><![endif]-->

Oto kolejny przykład tego w użyciu: Responsywne e-maile z potwierdzeniem zamówienia na urządzenia mobilne?

Jan
źródło
0

To rozwiązanie, które mi się sprawdziło

https://gist.github.com/elidickinson/5525752#gistcomment-1649300 , dzięki @ philipp-klinz

<table cellpadding="0" cellspacing="0" border="0" style="padding:0px;margin:0px;width:100%;">
    <tr><td colspan="3" style="padding:0px;margin:0px;font-size:20px;height:20px;" height="20">&nbsp;</td></tr>
     <tr>
        <td style="padding:0px;margin:0px;">&nbsp;</td>
        <td style="padding:0px;margin:0px;" width="560"><!-- max width goes here -->

             <!-- PLACE CONTENT HERE -->

        </td>
        <td style="padding:0px;margin:0px;">&nbsp;</td>
    </tr>
    <tr><td colspan="3" style="padding:0px;margin:0px;font-size:20px;height:20px;" height="20">&nbsp;</td></tr>
</table>
henry
źródło
Czy mógłbyś podać bardziej zwięzły przykład, jest tam wiele rzeczy, które nie są wymagane do rozwiązania pytania
EdL
@EdL chodzi o to, że jest to najbardziej zwięzły sposób na dostosowanie się do poczty elektronicznej max-width. To wszystko zastąpi <div style="max-width: ...px">...</div>. W przypadku wiadomości e-mail, nad którą pracowałem, gdy znalazłem tę istotę, było to jedyne rozwiązanie, które sprawiło, że wszystko wyglądało dobrze w programach Outlook 2010, 2013 i 2016.
henry
@henry Bardziej odnosiłem się do wszystkich atrybutów rozmiaru czcionki, itp. Obrazy są trudne, ponieważ jeśli nie określisz jako atrybutu width = "500", gdzie 500 to szerokość w pikselach, widok sprawi, że obrazy będą miały pełny rozmiar ( wrt. plik obrazu) powoduje to zazwyczaj stałą szerokość.
EdL
Zostawiam to tak, jak jest, ponieważ to nie jest mój kod - cytuję go tylko z istoty - ale uczyniłem z niego wiki społeczności. Uważam, że jest to konieczne, aby wyraźnie określić, 0px paddingS i marginS, jak również 0 cellpaddingi cellspacing. Możliwe, że określenie line-heightzadziałałoby jako substytut font-sizewypełnienia czasów, które heightnie są przestrzegane (chciałbym przetestować to na wszystkich trs, a następnie na wszystkich, tdaby zobaczyć dokładnie, gdzie jest to potrzebne). @EdL, jeśli jesteś w stanie uzyskać lżejsze rozwiązanie działające, a także to, które byłoby świetne - opublikuj to tutaj i w tym powiązanym tekście
henry