shadow-dom 相关问题

Shadow DOM是Web Components的关键部分,它允许您使用与主DOM隔离的DOM元素子树创建基于组件的应用程序。

shadow DOM 像 Iframe 一样封装 javascript

我试图弄清楚在 Shadow DOM 中执行的 Javascript 是否可以限定作用域(就像 iframe 标签的沙箱属性所做的那样)。我不希望加载的 Javascript 与其余部分混淆......

回答 1 投票 0

如何从一个 JSON 数据对象构建点亮元素的分槽层次结构

我想从一个 JSON 数据对象构建一个点亮元素的层次结构 - 每个元素都位于其父元素的槽中。 例如图书馆、书籍、页面 在我的图书馆中,我想将书籍分配给...

回答 1 投票 0

无法定位shadow dom元素

我正在尝试找到位于影子根下的元素。然而,当我访问 SLOT 标签下的一个组件时,它返回了 NONE。 下面是代码。 js_script =“&...

回答 1 投票 0

@font-face 未在 ShadowDom 中加载

this.shadowRoot.innerHTML = ` @font-face { 字体系列:SpaceGrotesk; src: url(/fonts/SpaceGrotesk-Medium.ttf); } @font-face { 字体系列:</desc> <question vote="1"> <pre><code> this.shadowRoot.innerHTML = ` &lt;style&gt; @font-face { font-family: SpaceGrotesk; src: url(/fonts/SpaceGrotesk-Medium.ttf); } @font-face { font-family: SpaceGroteskLight; src: url(/fonts/SpaceGrotesk-Light.ttf); } * { box-sizing: border-box; } .tipme { position: relative; font-size: 1.4rem; font-family: SpaceGrotesk, sans-serif; text-align: center; background-color: #fff; padding: 4rem 1.4rem 1.4rem; box-shadow: 0px 4px 40px rgba(0, 0, 0, 0.08); margin: 5rem 1.4rem 1.4rem; width: 50rem; } h1 { font-family: SpaceGroteskLight, sans-serif; font-weight: 400; font-size: 2.6rem; margin: 1rem; } `; </code></pre> <p>浏览器未请求字体文件。</p> <p>我在隐身模式下尝试过,所以这不是缓存问题。</p> <p>这是一个在多个站点上运行的分布式组件,因此我不能只在父 html 中加载字体。需要封装一下。</p> </question> <answer tick="true" vote="2"> <p>我最终只是动态地将样式加载字体添加到父页面:</p> <pre><code> this.fonts = ` @font-face { font-family: SpaceGrotesk; src: url(${this.host}/fonts/SpaceGrotesk-Medium.ttf); } @font-face { font-family: SpaceGroteskLight; src: url(${this.host}/fonts/SpaceGrotesk-Light.ttf); } `; const style = document.querySelector(&#39;style[data-description=&#34;tipme-fonts&#34;]&#39;); if (!style) { const el = document.createElement(&#39;style&#39;); el.dataset.description = &#39;tipme-fonts&#39;; el.appendChild(document.createTextNode(this.fonts)); document.head.appendChild(el); } </code></pre> </answer> </body></html>

回答 0 投票 0

使用 Selenium 和 VBA 从网站抓取数据并遇到影子 DOM 问题

这是我的代码: 选项显式 私有 cd 作为 Selenium.EdgeDriver 子条形图() obj.Start "边", "" obj.Get“https://www.barchart.com/stocks/performance/gap/gap-up?viewN...

回答 1 投票 0

光照元素也可以在没有 Shadow dom 的情况下使用 - 有任何风险吗?

我们需要 Web 组件并在 Web 应用程序中使用发光元素。然而,dom 阴影不仅在 css 区域引起问题(无法访问,没有全局 css 表)。 最大的是什么...

回答 1 投票 0

用于设置任意网站的 Shadow DOM 元素样式的用户脚本

这是我的用户脚本,用于更改访问链接的颜色。假设它能够与任何网站一起使用。 // ==用户脚本== // @name 改变访问过的链接的颜色 // @描述 - ...

回答 1 投票 0

设置滑动器 Web 组件导航按钮的样式

所以我对 Web 组件和 Shadow dom 相当陌生。 我正在尝试创建其中包含 swiper Web 组件的 Web 组件,到目前为止一切正常;虽然我正在尝试制作自定义导航...

回答 1 投票 0

可以使用`<style>`标签从shadow DOM中导入字体吗?

可以从 Shadow dom 中导入字体并将其应用于其子项吗? 当尝试做类似的事情时 类 MyCustomElement 扩展 HTMLElement { 构造函数(){ 极好的(); ...

回答 2 投票 0

从 Shadow dom `<style>` 导入的字体未应用

可以从 Shadow dom 中导入字体并将其应用于其子项吗? 当尝试做类似的事情时 类 MyCustomElement 扩展 HTMLElement { 构造函数(){ 极好的(); ...

回答 1 投票 0

如何使用影子 DOM 附加样式表根据子节点选择器设置自定义 HTML 元素的样式?

我有一个自定义 HTML 元素,可以对按钮元素进行分组: 福 酒吧 巴兹 &...

回答 1 投票 0

仅使用CSS选择shadow-root中的元素

有什么方法可以在不使用JS的情况下更改shadow-root中的CSS吗?我的意思是仅CSS。我浏览了一些东西,但找不到一种没有 js 的方法。 假设我们有代码 有什么方法可以在不使用 JS 的情况下更改 Shadow-root 中的 CSS 我的意思是仅 CSS。我浏览了一些东西,但找不到一种没有 js 的方法。 假设我们有代码 <div id="parent"> #shadow-root (open) <div id="child"> </div> </div> 如何仅使用 CSS 访问子元素? 仅当组件作者明确允许在影子 DOM 中的元素上使用 part 属性时。在这种情况下,您可以使用 ::part 伪元素选择器: 将 CSS 应用于该元素 这是一个例子: customElements.define('foo-bar', class extends HTMLElement { constructor() { super(); this.attachShadow({mode: 'open'}) this.shadowRoot.innerHTML = '<p part="baz">foo-bar here</p>'; } }); ::part(baz) { background-color: red; } <foo-bar></foo-bar> 请注意,您不能执行类似 ::part(foo) + .internal-css-class {...} 的操作(::part 不能成为复合选择器的一部分)。 除此之外,您始终可以使用CSS的继承属性,这些属性也会影响shadow DOM。例如。将 Web 组件放入 <h1> 将影响其字体大小和粗细(除非它专门为这些属性定义了自己的值)。

回答 1 投票 0

如何正确导入样式

我使用vanilla javascript + Vite,为什么样式不起作用? 此时我导入了徽标组件的样式,这是常见的 style.css @import url("./CORE/Logo/style.scss"); *, 身体, html...

回答 1 投票 0

如何在shadow dom中使用全局css样式

Shadow dom 封装了 css 样式,选择器不会跨越阴影边界。 问题:如何在shadow dom中使用全局通用的css样式? (假设有一些常见的CSS样式......

回答 7 投票 0

使用支持 Shadow DOM 的纯 JavaScript 模拟 Tab 键按下

注意:这里和其他地方都存在现有问题,但它们都是特定于 jQuery 的,并且没有涵盖纯 JavaScript 的规范答案,包括对 Web 组件的支持。 我想模拟...

回答 1 投票 0

我们如何让外部样式表加载到shadow DOM中?

我使用 Angular 16 为我为响应式设计创建的新 CSS 实用程序构建了一个文档网站。为了演示响应式功能,我创建了一个具有可调整大小的组件 我使用 Angular 16 为我为响应式设计创建的新 CSS 实用程序构建了一个文档网站。为了演示响应式功能,我创建了一个具有可调整大小的 <iframe> 的组件,并将演示组件嵌入其中。我这样做是为了利用 <iframe> 的单独 DOM 实例,以便演示响应 <iframe> 的大小,而不必调整整个浏览器窗口的大小,这对用户来说很方便。 我需要使用两个样式表,一个用于我的 CSS 实用程序,另一个用于我的所有颜色定义。我能够让它们工作的唯一方法是将它们导入到我的角度项目的主 styles.css 并将其附加到 <iframe> 的头部。 我的组件的代码看起来像这样,减去了一些与问题无关的内容。 @Component({ selector : 'responsive-window', standalone : true, imports : [ CommonModule ], templateUrl : './responsive-window.component.html', styleUrls : ['./responsive-window.component.css'], changeDetection : ChangeDetectionStrategy.OnPush }) export class ResponsiveWindowComponent implements OnInit, AfterViewInit, AfterContentChecked, OnDestroy { /* I pass the components I want to embed through this Input */ @Input() Demonstration! : Type<Component>; /* I use this to target the iframe in the template */ @ViewChild('domFrame', {static: true, read: ElementRef}) DomFrame! : ElementRef; constructor( private cdr : ChangeDetectorRef, private vcRef : ViewContainerRef, private zone : NgZone ){} ngAfterViewInit(): void { /* embeds the component into the iframe after the view is loaded */ this.embedContent(); } public embedContent(): void{ /* targets the iframe */ const frame = this.DomFrame?.nativeElement.contentDocument || this.DomFrame?.nativeElement.contentWindow; /* resolves the component */ const item : ComponentRef<any> = this.vcRef.createComponent<Component>(this.Demonstration); /* for setting up a broadcast channel to send data back and forth from outside the iframe */ if(reflectComponentType(this.Demonstration)?.inputs.find(a=> a.propName === 'BroadcastName') !== undefined){ item.instance.BroadcastName = this.BroadcastName; item.instance.ChannelName = this.ChannelName; item.instance.TargetName = this.TargetName; } /* for the default styling of the iframe's body element */ const defaultStyles = document.createElement('style'); /* for attaching the main stylesheet of the angular app */ const stylesLink = document.createElement('link'); defaultStyles.innerText = `*{ padding : 0; margin : 0; box-sizing: border-box; overflow: hidden; } body{ display : grid; place-items: center; min-height: 0px; max-height: 100vh; grid-template-columns: 1fr; grid-template-rows: 1fr; background-color: hsl(var(--gray-100), 1); }`; stylesLink.rel = 'stylesheet'; stylesLink.type = 'text/css'; stylesLink.href = 'styles.css'; /* embedding everything into the iframe */ frame.head.appendChild(defaultStyles); frame.head.appendChild(stylesLink); frame.body.appendChild(item.location.nativeElement); } } 就我传递到此组件以嵌入到 <iframe> 中的组件而言,这是它们如何设置的示例。 @Component({ selector : 'app-example', standalone : true, imports : [CommonModule], templateUrl : './example.component.html', styleUrls : [ './example.component.css' ], encapsulation : ViewEncapsulation.ShadowDom }) export class ExampleComponent { } 我必须将封装设置为 ShadowDom,否则组件的任何样式都不会生效,也不会从嵌入到 styles.css 中的 <head> 文件中读取任何样式。运行 ng serve 时一切正常,但是当我运行 ng-build 并将文件加载到我的 c-panel 并访问该站点时,styles.css 文件中的任何样式都不会对嵌入到 中的组件生效<iframe>。 我更改了嵌入组件的样式表中的一些样式,只是为了看看它们是否会生效,它们确实做到了,这意味着它可以识别组件样式表中的样式,但是当查看来自我的样式表的一些定义时,其中包含所有颜色和我的 CSS 实用程序,它们是 CSS 变量,它们都没有定义。 我尝试将这些样式表导入到我的组件的样式表中,但这不起作用。然后我尝试将它们导入到元数据中,如下所示。 @Component({ selector: 'app-product', standalone: true, imports: [CommonModule], templateUrl: './product.component.html', styleUrls: [ '../../../../assets/utility-styles.css', '../../../../assets/color-defs.css', './product.component.css' ], encapsulation: ViewEncapsulation.ShadowDom }) 我确保先导入其他样式表,然后再导入组件的样式表,以便所有值在使用之前都已定义。我再次运行 ng build 并将文件加载到我的 c-panel 中,但这也不起作用。我还将这些额外的样式表添加到我的 styles 文件中的 angular.json 数组中,看看是否允许我将它们导入到嵌入式组件中,但也无法正常工作。 在 responsive-window 组件中,您会注意到我的代码中有一部分引用了 BroadcastName、ChannelName 和 TargetName 输入,这些输入用于设置广播频道,以便用户可以尝试不同的设置将从 <iframe> 外部的仪表板更改嵌入组件中某些 CSS 属性的值。我还不知道这是否也有效,但我很担心。有人知道我该如何解决这个问题吗? 这两个url在构建项目后将不起作用。 '../../../../assets/utility-styles.css', '../../../../assets/color-defs.css', 因为资产相对于已部署应用程序的根 URL 具有不同的路径。你应该使用: 'assets/utility-styles.css', 'assets/color-defs.css',

回答 1 投票 0

在 Shadow dom 中设置元素的样式

我正在应用程序之上应用自定义 CSS 样式,但我无法修改其代码。 以前的 DOM 是这样的: <... 我正在应用程序之上应用自定义 CSS 样式,但我无法修改其代码。 以前的 DOM 是这样的: <div class="foo"> <div class="bar"></div> </div> 我可以使用 .foo .bar轻松修改它。 但是他们发布了应用程序的新版本,现在孩子位于影子 DOM 中: <div class="foo"> #shadow-root <div class="bar"></div> </div> 显然我以前的选择器不再起作用了。仅当它位于 .bar 内时,我怎样才能到达此 .foo?我读到了 ::part(),但我无法在 DOM 元素上添加 part="bar"。谢谢您的帮助。 目前仅使用CSS,如果不使用part,则无法从外部target子元素。这是有意为之,其动机是为了允许 Shadow DOM 创建者完全控制暴露在外部的样式。 但是,如果允许 JavaScript 并且 Shadow DOM 是使用模式 open 创建的,则可以使用 shadowRoot.querySelector 来定位子元素。 const host = document.querySelector("#host"); const shadow = host.attachShadow({ mode: "open" }); const div = document.createElement("div"); div.className = "bar"; div.textContent = "I'm in the shadow DOM"; shadow.appendChild(div); document.querySelector("#host").shadowRoot.querySelector(".bar").style.color = "red"; <div id="host" class="foo"></div> 您还可以使用 JavaScript 注入样式,其中包含针对 bar 的规则,但同样仅当模式为 open 时。

回答 1 投票 0

FireFox/Safari 事件目标与影子 DOM 中的当前目标

我见过许多看似相似的(Firefox + Event Target)问题,但没有处理我的特定问题。 基本上,我在这里和参考文档中读到的所有内容都表明目标是......

回答 1 投票 0

FireFox 事件不会冒泡或从阴影 DOM 传播到光 DOM

编辑1 Firefox 实际上确实将一个事件冒泡到 light DOM,但它是一个 INPUT 事件;不是 CLICK 事件。为什么? 结束编辑1 文档说事件在阴影中的元素上触发......

回答 1 投票 0

使用 Bootstrap 设置自定义元素 ShadowDOM 样式不起作用

我尝试使用shadowDom及其样式(即bootsrap)创建自定义元素导航栏。我使用 NPM 安装了引导程序。然后我在 style.scss 中导入了 bootstrap 并获取了导航栏

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.