javascript - 正在申请:focus CSS to input-field in shadowDOM and :focus CSS to shadow host

标签 javascript html css web-component custom-element

我目前正在开发一个自定义元素,它基本上是输入元素的稍微增强版本,在影子 DOM 中托管其所有构建 block (包括输入元素)。

当内部输入元素具有焦点时,宿主元素应使用彩色轮廓和框阴影进行样式化,如下所示:

enter image description here

因此,输入的焦点和模糊事件处理程序在宿主元素上切换属性“focussed”,封装样式如下所示:

:host([focussed]) {
    transition: outline 0.3s ease-in-out;
    outline-color: var(--focus-color, var(--default-focus-color)) !important;
    box-shadow: 0px 0px 3px var(--focus-color, var(--default-focus-color)) !important;
}

我不喜欢这种方法的地方:

在主机上公开需要观察的自定义属性,以确保视觉表示状态的正确性(例如消费者调用setAttribute('focussed', ''))

我考虑过的替代方案:

当然,我的第一个想法是将属性封装在填充宿主元素空间的容器元素上的影子 DOM 中(甚至切换类),但问题是溢出的内容,例如轮廓和框 -阴影似乎被宿主元素强制隐藏 - 这似乎是合乎逻辑的。

我可以在主机元素上指定固定的填充,以确保轮廓和阴影的可见性,但这需要考虑 box-shadow 的不同浏览器渲染行为,并且对于消费者的自定义样式来说会感觉违反直觉。

我正在寻找一种最佳实践方法,非常感谢您对此的有教养的想法。

最佳答案

this.attachShadow({
      mode: 'open',
      delegatesFocus: true
    })

适用于 Chrome、Edge、Opera,但不适用于其他版本

这对输入(在shadowDOM中)本身进行样式设置:

:focus {
  transition: outline 1s ease-in-out;
  outline: 2px solid var(--focus-color,blue);
  box-shadow: 10px 0px 10px var(--focus-shadow-color,red);
}

使用(全局)CSS 设置 host 元素的样式:

  :focus {
    outline: 5px solid green;
  }

完整解释和 JSFiddle Playground
首先使用 Chrome/Edge/Opera,然后再查看其他人的缺乏行为:
https://jsfiddle.net/WebComponents/Lpqyg201/

它有一些点击/聚焦/模糊解决方法的指针。

对于 FireFox 和 Safari 支持,我会添加一些不太花哨但可以轻松删除的内容。

目前我还不清楚 Mozilla 和 Apple 的时间表,
也许 Supersharp 知道

关于javascript - 正在申请:focus CSS to input-field in shadowDOM and :focus CSS to shadow host,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60706702/

相关文章:

html - 如何将一个 DIV 类放置在另一个 DIV 类之上的特定位置?

html - 图像在 CSS 中对齐 ='middle'

html - 表格 CSS 的单元格溢出问题

javascript - 删除电话号码中的+1node.js

javascript - 使用书签将 html 插入网页

javascript - 如何通过jquery click函数从不同的输入框获取当前数值

javascript - 使用 document.getElementsByClassName 添加 css 类

javascript - 如何使用 mongoose 从 MongoDb 获取数据?

javascript - 将 $ ('body' ).on ('click' ) 与 $(window).resize(function() in jQuery

html - 居中对齐 2x DIV - 如何?