css 使用@mixin在Angular上实现RTL支持

mdfafbf1  于 2022-12-20  发布在  Angular
关注(0)|答案(2)|浏览(119)

我正在使用一个mixin将我的Angular 应用程序从LTR相应地转换为RTL。

@mixin rtl($property, $ltr-value, $rtl-value) {
  [dir='ltr'] & {
    #{$property}: $ltr-value;
  }

  [dir='rtl'] & {
    #{$property}: $rtl-value;
  }
}

@mixin rtl-prop($ltr-property, $rtl-property, $value) {
  [dir='ltr'] & {
    #{$ltr-property}: $value;
  }

  [dir='rtl'] & {
    #{$rtl-property}: $value;
  }
}

当我使用@include时,由于某种原因它不起作用。(html标签定义正确)
x一个一个一个一个x一个一个二个x
知道为什么吗?

ca1c2owp

ca1c2owp1#

对于那些将来会遇到这个问题的人来说,问题是组件的封装-它被设置为Emulated,这可能会干扰类名。
将其改为设置为“无”。

w8biq8rn

w8biq8rn2#

您可以做几件事来解决这个问题,但它们不是最优的
首先,你要检查组件本身是否设置了dir,这就是为什么它不能工作的原因。因为方向是在标签上设置的。你可以尝试用途:host-context,因为它会查看html属性,而不是你的组件。就像这样:

@mixin rtl($property, $ltr-value, $rtl-value) {
  :host-context([dir='ltr']) & {
    #{$property}: $ltr-value;
  }

  :host-context([dir='rtl']) & {
    #{$property}: $rtl-value;
  }
}

但是一定要检查canIUse是否有足够的覆盖率。目前它大约是75%,所以我会说它太低了,当然如果你有很多移动的iOS用户的话。

:host-context()的另一个替代方法是:dir(),但在编写时它的覆盖率只有3%,所以我也不会使用它。
不推荐当前认可的答案(建议将封装设置为None),因为它会使该组件的所有标记都是全局的,并可能导致一些意外的问题。当然,因为方向可能是您希望在几乎所有组件中使用的东西。
我认为最好的解决方案是使用css中的逻辑属性。例如,你使用“start”而不是“left”。你可以在谷歌上搜索它,找到很多使用它的信息。(例如on developer mozilla site)。对于你的例子,你必须用途:

.yourClass {
    border-start-start-radius: 0;
    border-start-end-radius: 10px;
    border-end-start-radius: 80px;
    border-end-end-radius: 0;
}

这将使它在任何文本方向上看起来都像你想要的那样,而不使用任何mixin。

相关问题