【发布时间】:2017-12-19 19:57:13
【问题描述】:
我创建了一个 HTML 电子邮件,它可以在我测试过的几个电子邮件客户端中正确显示,但是当我在我的页面上提供它的预览时,innerHTML 中的嵌入样式会影响父级。必须有可能避免这种情况,因为当我在 gmail 中查看电子邮件时,它会正确显示,而不会更改 gmail 本身的样式。
这里有一些显示问题的 HTML(但在 gmail 中显示没有副作用):
<!DOCTYPE HTML>
<html>
<head>
<style type="text/css">
* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
</style>
</head>
<body>
<pre style="white-space:pre-wrap;">Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test </pre>
</body>
</html>
我正在使用 Angular 4,所以我以这种方式将它包含在我的页面中:
<div [innerHTML]="myHtml | safeHtml">
</div>
...safeHtml 只是一个管道,可以绕过对我正在注入的 HTML 的 Angular 检查:
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml } from "@angular/platform-browser";
@Pipe({name: 'safeHtml'})
export class SafeHtmlPipe implements PipeTransform {
constructor(private sanitizer:DomSanitizer){}
transform(html) {
return this.sanitizer.bypassSecurityTrustHtml(html);
}
}
它确实有效,因为它确实在 div 中显示了 html,但样式信息会改变页面上的所有内容。我明白了——我实际上是在我的嵌入式样式中使用*。 ...但正如我所说,gmail设法以某种方式“包含”它,因此它不会重新设置父元素的样式。我该如何做到这一点?
理想情况下,我希望完全隔离样式 - 就像我不希望父样式受子样式影响或子样式受父样式影响(这似乎是 gmail 的行为方式)。
更新
将 HTML 更改为以下内容使其适用于电子邮件,并包含 CSS,但无法嵌入 Angular:
<!DOCTYPE HTML>
<html class="my-class">
<head>
<style type="text/css">
.my-class * {
font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif;
color: blue;
}
.my-class pre {
white-space:pre-wrap;
}
</style>
</head>
<body>
<pre>Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test </pre>
</body>
</html>
这是因为(看起来)html 和 body 标记在您将其嵌入 div 时被剥离(这很有意义)。因此,只需在该类中添加一个包含 div 的父级,这一切都可以正常工作 - 嵌入和电子邮件中:
<!DOCTYPE HTML>
<html>
<head>
<style type="text/css">
.my-class * {
font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif;
color: blue;
}
.my-class pre {
white-space:pre-wrap;
}
</style>
</head>
<body>
<div class="my-class">
<pre>Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test Test test </pre>
</div>
</body>
</html>
【问题讨论】:
-
Angular 4 被设计为在每个组件的基础上处理 CSS,这应该防止它干扰父组件。也许您可以使用 Angular 组件而不是 [innerHTML] 来防止该问题。这是一个参考页面:angular.io/guide/component-styles
-
但它已经影响了完全不相关的组件——它影响了整个页面,无论哪个组件包含 html。就像我的菜单上的字体发生了变化,它甚至不是父组件。
标签: html css angular innerhtml