更改angular2中伪元素的样式

Change style of pseudo elements in angular2

是否可以在 angular2 中使用 [style][ngStyle] 更改伪元素的样式?

为了在 div 上获得像叠加层一样的模糊效果,我应该在伪元素上设置背景图像。

我试过

<div class="blur" [style.before.backgroundImage]="'url('+ featuredImage[i] + ' )'">

没用。我也试过这个

<div class="blur" [ngStyle]="'{:before{ background-image:url('+ featuredImage[i] + ' )}}'">

不,这不可能。这实际上不是 Angular 问题:伪元素不是 DOM 树的一部分,因此不会暴露任何可用于交互的 DOM API他们。

如果你想以编程方式处理伪元素,通常的方法是间接的:你 add/remove/change class 并在 CSS 中使这个 class 影响相应的伪元素。因此,在您的情况下,您可以再添加一个 class 来更改必要的样式:

.blur:before {/* some styles */}
.blur.background:before {/* set background */}

现在您需要做的就是在需要 before 伪元素来获取背景时在元素上切换 .background class。例如,您可以使用 NgClass

您可以使用 CSS 个变量实现您所需要的。

根据您的风格sheet,您可以这样设置背景图片:

.featured-image:after      { content: '';
                             background-image: var(--featured-image); 
                           }

之后,您可以在 DOM 树中的同一元素或更高层以编程方式设置此变量:

<div class="featured-image" [ngStyle]="{'--featured-image': featuredImage}">

更多关于 CSS 变量的信息:https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_variables 请注意,浏览器支持尚未完成。

另请注意,您需要使用 sanitizer.bypassSecurityTrustResourceUrl(path)sanitizer.bypassSecurityTrustStyle('--featured-image:url(' + path + ')')):

清理 url/style

在 Angular 2+ 的当前版本中,您可以使用 CSS 变量来实现此目的并清理您的输入。

按照您的风格 sheet 使用 CSS 变量定义规则。回退也可以定义为 CSS IE 不支持变量。 https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties

.featured-image:after { 
    content: '';
    // Fallback for IE
    background-image: url('fallback-img.png');
    background-image: var(--featured-image); 
}

除了绕过安全信任样式,您还可以使用可重复使用的管道来清理您的输入: https://angular.io/api/platform-browser/DomSanitizer#sanitize

import {Pipe, PipeTransform, SecurityContext} from '@angular/core';
import {DomSanitizer, SafeStyle} from '@angular/platform-browser';
@Pipe({
    name: 'safeStyle',
})
export class SafeStylePipe implements PipeTransform {
    constructor(protected sanitizer: DomSanitizer) {}
    transform(value: string): SafeStyle {
        if (!value) return '';

        return this.sanitizer.sanitize(SecurityContext.STYLE, value);
    }
}

在您的模板中:

<div class="featured-image" [style.--featured-image]="featuredImage[i] | safeStyle"></div>

如果你想添加其他属性,我是这样做的:

<div class="progress" [style]= "'--porcentaje-width:' + widthh " ></div>

和 css:

.progress::after {
  content: '';
  width: var(--porcentaje-width);
}

这对我有用:)