CSS pseudo :dir(); :host-context() and directionality based styling
在这个问题中,我正在寻找以下问题的最干净的解决方案,并敦促浏览器的编码人员赶上规范,尤其是:dir() 规范!
该问题及其当前对我最有名的解决方案:
我想根据方向性对下面的图像进行样式设置,例如在RTL模式下将其翻转。该图像位于影子DOM中。到目前为止,我正在通过以下样式实现这一目标。
1 2 3 4 5 6 7
:: shadowRoot
<style>
.directed-image : dir ( rtl ) { transform : rotateY( 180deg ) ; } -- Firefox only as of now
: host-context( [ dir = rtl ] ) { transform : rotateY( 180deg ) ; } -- Chromium only as of now
</style>
<img class= "directed-image" src= "..." />
有待解决的问题:
上面没有一种样式可以帮助Safari:尚未实现:dir() 伪类,人们似乎强烈反对:host-context()
我真的不喜欢那些针对平台多样性的双重解决方案。想摆脱这些,但这只是次要问题
解决方案?:
我最想拥有的是:dir() 将获得广泛的跨浏览器支持-它可以解决Safari的问题,并提供真正的方向性上下文感知样式([dir=ltr] 的缺点在WebKit的错误链接上方)。
但是鉴于
Chromium在:dir() 上的错误从2018年开始生效
WebKit在:dir() 上的错误最后一次出现在2016年!!!
Firefox在:host-context() 上的错误从2018年开始出现,对规范有些担忧
WebKit不愿意实现:host-context()
-具有所有这些:是否还有其他解决方案(希望首先解决Safari问题)。
JS based solutions are interesting but much less preferred.
[dir=rtl] 将覆盖具有dir=rtl 属性的所有HTML标记,而使用诸如.rtl {direction: rtl} 这样的类将覆盖其余部分...或者我是否缺少某些内容?更好的是,像[dir=rtl], .rtl 这样的选择器也可以工作。
假设用户在站点内切换语言(我有自己的库可以即时进行操作,不需要重新加载新站点)。相关的dir=ltr 当然是在body 上设置的。现在,无法使用:host-context 的浏览器无法通过shadowRoot 进行匹配。根据lang动态分类设备。开关(a)需要JS; (b)除非遍历每个影子主机并直接在阴影中使用:host(.rtl) 来直接应用该类,否则它将不会被匹配...
img是自定义[is] 吗?为什么在shadowRoot 中?
这只是一个示例,但是在这种特定情况下:(a)不,它不是自定义(正确的术语)元素,(b)在shadow 中,因为我的用例是在其内部时对其进行样式设置自定义组件。
[is] ,就像分配给标准标记的属性(例如 )一样,因此可以将其视为自定义的内置元素(即正确的术语)。如果需要适用于所有Shadow DOM的更广泛的样式范围,请使用DocumentOrShadowRoot.styleSheets 收集所有 和
标记。 Shadow DOM API仍然不切实际。当我刚开始并在后端应用程序中流血的样式中挣扎时,样式封装吸引了我,但那现在变得微不足道了。
关于接受术语的更正,您是对的,谢谢。关于其余部分:影子DOM API的实用性不在此范围之内。说styleSheets 就像是说-走JS路径,我会尝试转义(即使那样走,styleSheets 还不够,例如,它不会在html 上反映dir=rtl ) 。
为什么不html { direction: rtl } ?我看不到与 的区别
请参阅此处和W3C建议。但是我们在这里偏离了主题。
如您所说:body 标记上的dir 属性将(在大多数情况下)是语言更改的唯一指示。由于CSS不会级联(如您所说),目前唯一的选择是让Elements观察该属性更改。因此,我担心您唯一的选择是MutationObserver(在您拥有的元素中)
@ Danny365CSIEngelman:您想发布您的评论作为答案,并将其标记为已接受吗?我按照您所说的做-在每个需要对dir 更改做出反应的自定义元素中启动MutationObserver,并在元素self上设置相关类;而CSS通过:host(.rtl) {...} 之类的东西来处理其余部分。
2020年1月答案:
如您所说:body 标记上的dir 属性将(在大多数情况下)是语言更改的唯一指示。 由于CSS尚未级联(如您所说),目前唯一的选择是让Elements观察该属性更改。 因此,我担心您唯一的选择是MutationObserver(在您拥有的元素中)
https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver
1 2
// Options for the observer ( which mutations to observe)
const config = { attributes: true, childList: false, subtree: false } ;
我还将attributeFilter: [dir] 添加到配置对象FWIW。 再次感谢。
不知道这是否是您要寻找的,但是您可以使用RTLCSS。 它是一个CSS框架,可让您轻松地进行切换并创建RTL和LTR样式表,而不必做过多的重复工作。
如果使用的话,它还支持几个大型CSS框架,例如Bootstrap和Semantic-UI
感谢您的回答。 Ive翻阅了图书馆,必须说我对那个图书馆做出的建筑设计决定的个人看法是一条错误的道路:恕我直言,它给最初的错误方法带来了维护和支持所需要的技术债务。 通常,RTL / LTR应该通过flex ,flex-start ,flex-end 等进行处理。不需要任何特殊格式的渲染(手动或自动倒置CSS),更改body 上的dir 并确认 ! 像图像翻转这样的罕见特殊情况(RTLCSS,BTW不支持)是应用程序自己关心的问题,不能委派给第三方。