我尝试对使用TypeScript的CreatElement创建的div应用一些样式,但是样式没有被应用。
EDIT:我通过在style.scss
全局项目文件中应用样式解决了这个问题,但我想了解为什么它在此文件中有效,而在组件的scss中无效
组件.ts
export class Component implements OnInit {
bgAnimation!: any;
numberOfColorBoxes = 400;
ngOnInit(): void {
this.bgAnimation = document.getElementById('bgAnimation');
for (let i = 0; i < this.numberOfColorBoxes; i++) {
const colorBox = document.createElement('div');
colorBox.classList.add('colorBox');
this.bgAnimation.appendChild(colorBox);
}
}
}
组件.html
<div class="bgAnimation" id="bgAnimation">
<div class="backgroundAmim"></div>
</div>
组件.scss
.colorBox {
z-index: 2;
filter: brightness(1.1);
transition: 2s ease;
position: relative;
margin: 2px;
background: #1d1d1d;
}
2条答案
按热度按时间vmdwslir1#
这是因为封装策略。在默认行为中,Angular 用途:
这是所有组件的默认Angular 行为,并通过向组件的主机元素添加特定属性并将相同属性应用于所有提供的CSS选择器来模拟原生Shadow DOM封装行为。如果您使用document手动添加类,则该特定属性不会添加到该类。
如果你想让组件样式正常工作,你必须使用ViewEncapsulation.None或ViewEncapsulation.ShadowDom.
如果使用ShadowDom,则无法使用document.getElementById访问元素。必须使用ViewChild访问它们。
here是ShadowDom策略的一个示例。
i5desfxk2#
简单地解释一下,在ngOnInit,组件的DOM已经准备好了,您可以通过javascript手动创建这些元素,它不会触发任何Angular 事件来检查组件中的更改。当您以全局样式使用该类时,浏览器更新的是DOM而不是Angular