如何应用带有阴影 DOM 的父项的伪选择器样式?

How do I apply pseudo-selector styles from a parent with shadow DOM?

我基本上是在尝试复制 CSS Tricks 导航栏的行为,当整个栏的任何部分悬停时,项目标签的动画从左侧飞入。我正在尝试使用 Web 组件和 Polymer 来做到这一点。

我的 HTML 结构(大致)如下:

index.html

<!-- ... head stuff ... -->
<body>
  <my-app></my-app>
</body>

我的-app.html

<dom-module id="my-app">
  <nav>
    <my-nav-item url="/"
                 text="Home"
                 icon="home.svg#nav-icon-home"></my-nav-item>
  </nav>
</dom-module>

我的导航-item.html

<dom-module id="my-nav-item">
  <a href$="[[url]]">
    <svg height="20px" width="20px" viewBox="0 0 20 20">
      <use href$="[[icon]]"></use>
    </svg>
    <span>[[text]]</span>
  </a>
</dom-module>

CSS 看起来像这样:

我的-app.html

nav {
  width: 75px;
  height: calc(100% - 60px);
  background: #222d32;
}

我的导航-item.html

a {
  display: block;
  text-decoration: none;
  color: white;
  margin: 25px auto;
  text-transform: uppercase;
  font-family: 'Exo 2', sans-serif;
  font-size: 12px;
}

svg {
  fill: white;
  margin: 0 auto;
}

span {
  display: block;
  margin: 10px auto;
  transform: translateX(-200px);
  transition: 0.1s;
}

span 按预期从屏幕外开始,当我将 a:hover spantransform: translateX(0) 一起使用时,它与从左侧飞入的文本完美配合。但是,我希望所有标签在 nav 的任何部分悬停时从左侧飞入,就像 CSS Tricks 网站所做的那样。

如何在不破坏关注点分离的情况下设置 nav:hover my-nav-item span transform 属性?

我最终(不情愿地)用 ::shadow /deep/ 解决了这个问题:

我的-app.html

nav:hover worf-nav-item::shadow /deep/ span {
  transform: translateX(0);
}

可能 的好处是在 11:40 的 Polymer Summit 演讲中提出的用作 mixins 的原生 CSS 属性2015: "Polymer's Styling System."

我可能会提出这样的建议:

我的-app.html

nav:hover {
  --transform-no-translate-x: {
    transform: translateX(0);
  }
}

我的导航-item.html

span {
  @apply(--transform-no-translate-x);
}

但是等等……还有更多!

实际上我在写这篇文章的时候一直在玩它,并想出了另一个解决方案。我更喜欢这个。

我的-app.html

nav {
  --nav-transform: translateX(-200px);
}

nav:hover {
  --nav-transform: translateX(0);
}

我的导航-item.html

span {
  transform: var(--nav-transform);
}