css - 如何防止 Outlook 中 HTML 模板中的图像使用 React 进行不必要的扩展?
问题描述
我正在使用 React 创建一个电子邮件生成器。我正在渲染表格(因为这是电子邮件必须具备的)。
在大多数电子邮件浏览器中,电子邮件看起来不错,但在 Outlook 中会扩展图像并破坏布局。
这是渲染图像的特定组件:
const Ad = ({ image, link, hasDivider, styles = localStyles }) => (
<>
<Grid.Row className={styles.container}>
<a href={link}>
<span
dangerouslySetInnerHTML={{
__html: `
<!--[if mso]>
<table width="100%">
<tr>
<td>
<img width="100%" src=${image}
alt="ad" style="text-align: right; width: 100%; border: 0;
text-decoration:none;
vertical-align: baseline;">
</td>
</tr>
</table>
<div style="display:none">
<![endif]-->`
}}
/>
<Img className={styles.image} src={image} alt="ad" />
<span
dangerouslySetInnerHTML={{
__html: `
<!--[if mso]>
</div>
<![endif]-->
`
}}
/>
</a>
</Grid.Row>
{hasDivider && (
<Grid.Row>
<Divider />
</Grid.Row>
)}
</>
)
Img
零件:
const Img = ({ src, alt, className, styles = localStyles, style = {} }) => {
return (
<img
src={src}
alt={alt}
style={style}
className={cx(styles.img, className)}
/>
)
}
我正在为此使用“电子邮件条件”,这适用于更现代的 Outlook 版本。
解决方案
在 Windows 上的 Outlook(从 2007 年到 2019 年,使用 Word 的渲染引擎)中,<img>
元素的百分比宽度基于图像文件的物理宽度,而不是 CSS 中应该期望的父元素的宽度。因此,如果您的图像是 100 像素宽,width="100%"
则等于 100 像素。如果您的图像是 2000 像素宽,则它将等于 2000 像素。Outlook 的适当解决方案是通过 HTMLwidth
属性使用以像素为单位的固定宽度,并width:100%;
以内联样式(Outlook 将忽略)为其他客户端使用样式。
您将需要更新您的Img
组件以包含图像的宽度并使用以下内容进行渲染:
<img width="${width}" src=${image}
alt="ad" style="text-align: right; width: 100%; border: 0;
text-decoration:none;
vertical-align: baseline;">
推荐阅读
- sql - 数据归档不工作时的动态 SQL 日期时间比较
- bash - 如何在bash中解析xml文件
- java - 如何减小pdf中png图像的大小(压缩pdf中的png)
- swift - UIImagePickerController - 当用户从前到后更改相机时获取通知,反之亦然
- javascript - 如何根据重试次数重复迭代
- r - 如何在 R 中为 .shp 多边形文件设置 CRS
- angular - Angular 9 ivy dist 对于产品构建来说太大了
- c# - 使用c#在浏览器中打开一个url,chrome不允许打开新窗口
- javascript - react中的setTimeout函数导致类型错误
- maven - 在 NetBeans 的 Maven 自定义目标定义中停用配置文件