:host-context 在 Lit-Element Web 组件中未按预期工作

2024-02-28

我有两个 Lit-element Web 组件 - 一个是units-list,其中包含许多units-list-item元素。这units-list-item元素有两种不同的显示模式:紧凑和详细。由于列表元素支持无限滚动(因此可能包含数千个单元),因此我们需要在两种模式之间切换的任何机制,以尽可能提高性能。

这就是为什么我认为理想的解决方案是使用:host-context()样式中的伪选择器units-list-item元素,这样每个units-list-item元素可以在两种显示模式之间切换,只需更改应用于祖先的类(该类将位于该元素的影子 DOM 内)units-list元素)。

为了详细说明,这里是来自units-list元素。请注意,“触发”类被应用于#list-contentsdiv,它是units-list模板。

<div id="list-contents" class="${showDetails ? 'detail-view table' : 'compact-view table'}">
    ${units.map(unit => html`<units-list-item .unit="${unit}"></units-list-item>`)}
</div>

如您所见,showDetailsflag 控制是否将“detail-view”或“compact-view”类应用于包含所有内容的 divunits-list-item元素。这些课程肯定被正确应用。

这是完整的渲染方法units-list-item元素(删除不必要的标记):

render() {
    const {unit} = this;
    // the style token below injects the processed stylesheet contents into the template
    return html`
        ${style}
        <div class="row compact">
            <!-- compact row markup here -->
        </div>
        <div class="row detail">
            <!-- detail row markup here -->
        </div>
    `;
}

然后我有以下内容units-list-item元素的样式(我们使用 SCSS,因此单行注释不是问题):

    // This SHOULD hide the compact version of the row when the 
    // unit list has a "detail" class applied
    :host-context(.detail-view) div.row.compact {
        display: none !important;
    }

    // This SHOULD hide the detail version of the row when the
    // unit list has a "compact" class applied
    :host-context(.compact-view) div.row.detail {
        display: none !important;
    }

我对 :host-context 选择器的理解表明这应该有效,但 Chrome 每次都会渲染该行的两个版本,并且 Chrome 开发工具显示选择器永远不会与任何一行匹配。

我知道有几种可行的替代方案,但这是我所知道的唯一一种可以通过更改父元素上的单个类来允许整个单元列表切换模式的方案。我考虑过的所有其他解决方案至少都需要更新每个units-list-item列表中的元素。如果可能的话我想避免这种情况。

当然,我主要关心的是如果可能的话,让这项工作可行,但我也对一些事情感到好奇,但找不到有关它们的任何信息。我似乎找不到答案的两个问题是

  1. When :host-context在本身就是影子 DOM 一部分的元素中使用,它是否认为父元素的影子 DOM 是“主机上下文”,或者它是否“一路跳出”到文档 DOM?
  2. 如果是前者的话,会:host-context跳转多个 Shadow DOM 边界?说我有一个习惯page包含自定义的元素list元素,它本身包含许多自定义item元素。其中item元素有一个:host-context规则,浏览器会首先扫描 Shadow DOMlist元素,然后,如果没有匹配任何内容,则扫描该元素的影子 DOMpage元素,如果仍然没有匹配任何内容,则将主文档 DOM 扫描到<html> tag?

不支持:host-context在 FireFox 或 Safari 中

一个月前的最后一次更新是 Mozilla 和 Apple 都不会实施它。

看起来它将从规范中删除:https://github.com/w3c/csswg-drafts/issues/1914 https://github.com/w3c/csswg-drafts/issues/1914

一种替代方法是使用 CSS 属性(这些属性会渗透到 影子DOM)

JSFiddle:https://jsfiddle.net/WebComponents/hpd6yvxt/ https://jsfiddle.net/WebComponents/hpd6yvxt/

  • using host-context适用于 Chrome 和 Edge
  • 使用其他浏览器的 CSS 属性

2022 年 2 月更新

https://caniuse.com/?search=host-context https://caniuse.com/?search=host-context

2023 年 2 月更新

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

:host-context 在 Lit-Element Web 组件中未按预期工作 的相关文章

  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • 使用 CryptoJS 更改密钥 [重复]

    这个问题在这里已经有答案了 我正在使用 CryptoJS 来加密和解密文本 在这里 我只是获取消息并显示加密和解密消息 我使用DES算法进行加密和解密 这是我的 HTML 文件
  • 如何为背景图像添加边距?

    我想向背景图像添加边距 以便将其与屏幕中间保持距离 但将其添加到该类中会为整个主体添加边距 body poppage background url Imagenes tip3 png 50 200px no repeat E2E4E9 我怎
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • 如何使用 JavaScript 获取没有 HTML 元素的纯文本?

    我的 HTML 中有 1 按钮和一些文本 如下所示 function get content I don t know how to do in here
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • 覆盖并重置 CSS 样式:auto 或 none 不起作用

    我想覆盖为所有表定义的以下 CSS 样式 table font size 12px width 100 min width 400px display inline table 我有一个特定的表 其类名为 other 最后的餐桌装饰应该是这
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • JavaScript 代码在不使用 ActiveX 的情况下截取网站屏幕截图

    我有一个用户与之交互的 JavaScript 应用程序 我需要保存当前界面的外观 裁剪出我需要的部分 或者通过指定div只拍摄我需要的部分 然后发送回服务器 显然任何外部服务都无法做到这一点 我需要一个 JavaScript 或Flash
  • 如何将函数内的捕获错误传递给父级

    我有这几行代码示例 想知道下面的逻辑到底如何 try var response child console log why here catch err console log should show this err function c
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 为范围旋钮 ionic-range 添加边框颜色

    我正在使用离子范围添加范围滑块 并想向范围旋钮添加边框 由于它的 ionic4 和范围旋钮是 Shadow dom 的一部分 我无法使用范围旋钮的 border 属性直接更改边框 我已附上我想要实现的图像 范围旋钮周围有白色边框 现有属性只
  • 单击引导分页链接时调用 jquery 函数

    我想在单击引导分页链接时调用 jquery 函数 假设我想从第1页遍历到第2页 应该调用一个jquery函数 我正在使用以下代码 但它不起作用 ul pagination on click li function alert page ch
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse
  • 闪亮井板宽度

    library shiny library shinydashboard ui lt dashboardPage dashboardHeader dashboardSidebar dashboardBody wellPanel tags d
  • 带显示块的SPAN

    和默认有什么区别 div 元素和默认值 span 元素与display block HTML 元素的有效性和语义存在差异 否则它们是相同的 div and span两者都被定义为通用容器 在 HTML 方面没有更深层次的含义 一个默认为块显

随机推荐

  • css制作响应式椭圆块

    我正在尝试为下图所示的数字制作一个 css 块 我的想法 目标是制作一个响应块 因此如果有一个数字 它将是圆形的 如果有两个 则像第二个 我曾尝试制作 border radius 50 所以我成功执行的第一个块与 border radius
  • VBA/VB6 中的 NaN 测试

    我使用 VBA 将字节数组中的 8 字节浮点数加载到 Double 中 有些数字将为 IEEE 754 NaN 即 如果您尝试使用 Debug Print 打印它 您将看到 1 QNAN 我的问题是 如何测试 Double 中包含的数据是否
  • Python pandas 将带时区的 unix 时间戳转换为日期时间

    我有一个数据框 df pd DataFrame unix utc ts 1503007204222 1503007210206 1503007215121 1503007220475 tz 0000 0100 CEST EEST 我想将 u
  • multipart/form-data,字段的默认字符集是什么?

    如果没有给出字符集 应该使用什么默认编码来解码多部分 表单数据 RFC2388 规定 4 5 表单数据中文本的字符集 多部分 表单数据的每个部分都应该有一个内容 类型 如果字段元素是文本 则字符集 文本参数表示使用的字符编码 例如 带有一个
  • 如何在 Angular2 中对复选框进行单元测试

    我有一个用 Angular2 编写的复选框示例代码
  • 运行时:无法创建新的操作系统线程

    在54核机器上 我使用os Exec 生成数百个客户端进程 并使用大量的 goroutine 来管理它们 有时 但并非总是 我会得到这样的信息 runtime failed to create new OS thread have 1306
  • 给定一个不带空格的短语,添加空格以构成正确的句子

    这就是我的想法 但它是 O n 2 例如 输入是 Thisisawesome 我们需要检查添加当前字符是否会使旧的搜索结果变得更长且有意义 但为了看到我们需要备份的地方 我们必须一直遍历到起点 例如 awe 和 some 是合适的词 但 a
  • ReferenceError:WScript 未定义

    我希望使用 Javascript 执行以下操作 这是我的完整 JS 文件 test js var xo WScript CreateObject Msxml2 XMLHTTP var xa WScript CreateObject ADOD
  • 我如何根据键值将 python dict 排序到嵌套列表

    我有一个嵌套字典 d records name abhi age 23 dept cse name anu age 20 dept ece name ammu age 25 dept cse name anju age 26 dept ec
  • MySQL 对索引 TIMESTAMP 列使用文件排序

    我有一个拒绝使用索引的表 它总是使用文件排序 该表是 CREATE TABLE article ID int 11 NOT NULL AUTO INCREMENT Category ID int 11 DEFAULT NULL Subcat
  • Node.js:req.params 与 req.body

    我一直在将几个不同教程中的代码拼凑在一起 使用 Node express Angular 和 mongodb 使用 MEAN 堆栈构建一个基本的待办事项应用程序 一篇教程介绍了为 GET POST 和 DELETE 操作创建 api 但忽略
  • 如何使用 PhpWord 读取 Doc 文件?

    最近我下载了从github下载的php word 但我不知道如何通过这个读取word文件 该库中没有任何帮助 我看到一个与 php excel b 相同的文件 但不知道如何使用 以下文件 simple01 example php
  • Keras:具有多个参数的 Lambda 层函数

    我正在尝试写一个LambdaKeras 中调用函数的层connection 运行一个循环for i in range 0 k where k作为函数的输入 connection x k 现在 当我尝试调用功能 API 中的函数时 我尝试使用
  • 在 javascript 中创建可调整大小/可拖动/旋转视图

    我一直在尝试用 Javascript 创建这样的东西 正如您所看到的 容器可以被拖动 旋转和调整大小 大多数事情都工作正常 但是旋转容器时调整容器大小会产生奇怪的输出 我预计这会发生 相反 我得到这个 这是完整的代码 https jsfid
  • Swift 3 错误:“另请参阅”标注未显示

    我刚刚将我的项目迁移到 Swift 3 发现快速帮助中的 另请参阅 标注没有显示 在 Swift 的早期版本中 一切都运行得很好 下面是我的代码 Adds a See also callout in the Quick Help for a
  • 无表单方法的 POST (PHP)

    有没有什么方法可以使用 POST 方法而不使用表单将内容从一个页面传递到另一个页面 就像在 get 中一样 你可以只附加一个 与您想发送的任何内容一起 你能为帖子做点什么吗 我还阅读了另一篇文章 其中提到要使用会话 但会话会以 cookie
  • UITableView 使用 UIRefreshControl 拖动距离

    我在 UITableView 上实现 UIRefreshControl 时遇到一些麻烦 一切工作正常 除了我必须滚动屏幕的 80 之类的内容才能触发 UIRefreshControl 有时我什至无法触发它 因为屏幕底部有一个选项卡栏 当手指
  • window.location.assign(“链接”),不起作用

    这是 JavaScript 代码
  • 如何使用 htaccess 分割 URL

    例如 google com en game game1 html应该google com index php p1 en p2 game p3 game1 html 我怎样才能分割URL并发送index php 部分 仅当查询参数具有固定长
  • :host-context 在 Lit-Element Web 组件中未按预期工作

    我有两个 Lit element Web 组件 一个是units list 其中包含许多units list item元素 这units list item元素有两种不同的显示模式 紧凑和详细 由于列表元素支持无限滚动 因此可能包含数千个单