首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用css子代选择器响应主题

用css子代选择器响应主题
EN

Stack Overflow用户
提问于 2019-05-10 15:13:42
回答 1查看 233关注 0票数 1

下面是一个代码片段,说明我如何编写工具提示,使其具有光明和黑暗的主题。它定义了工具提示的位置。我想通过使用主题来以不同的方式来处理这个问题,但我不确定如何:

代码语言:javascript
运行
复制
  static defaultProps = {
    theme: 'light',
    eventsEnabled: true,
  };

  firstOrderPlacement(placement) {
    if (!placement) return null;
    return placement.split('-')[0];
  }

  arrowDirectionClass(firstOrderPlacement) {
    const { theme } = this.props;

    switch (firstOrderPlacement) {
      case 'right':
        return cx(css.arrowLeft, theme === 'dark' ? css.arrowLeftDark : css.arrowLeftLight);
      case 'left':
        return cx(css.arrowRight, theme === 'dark' ? css.arrowRightDark : css.arrowRightLight);
      case 'top':
        return cx(css.arrowDown, theme === 'dark' ? css.arrowDownDark : css.arrowDownLight);
      case 'bottom':
        return cx(css.arrowUp, theme === 'dark' ? css.arrowUpDark : css.arrowUpLight);
      default:
        return cx(css.arrowUp, theme === 'dark' ? css.arrowUpDark : css.arrowUpLight);
    }
  }

以及其立场的css:

代码语言:javascript
运行
复制
.backgroundLight {
  background: white;
  color: #262626;
}

.backgroundDark {
  background: #2d2d2d;
  color: #ffffff;
}

.arrow {
  position: relative;
  width: 0;
  height: 0;
}

.arrowRight {
  border-top: 0.4375rem solid transparent;
  border-bottom: 0.4375rem solid transparent;
}

.arrowRightLight {
  border-left: 0.4375rem solid var(--color-white);
}

.arrowRightDark {
  border-left: 0.4375rem solid #2d2d2d;
}

.arrowLeft {
  border-top: 0.4375rem solid transparent;
  border-bottom: 0.4375rem solid transparent;
}

.arrowLeftLight {
  border-right: 0.4375rem solid var(--color-white);
}

.arrowLeftDark {
  border-right: 0.4375rem solid #2d2d2d;
}

.arrowDown {
  margin: 0 auto;
  border-left: 0.4375rem solid transparent;
  border-right: 0.4375rem solid transparent;
}

.arrowDownLight {
  border-top: 0.4375rem solid var(--color-white);
}

.arrowDownDark {
  border-top: 0.4375rem solid #2d2d2d;
}

.arrowUp {
  margin: 0 auto;
  border-left: 0.4375rem solid transparent;
  border-right: 0.4375rem solid transparent;
}

.arrowUpLight {
  border-bottom: 0.4375rem solid var(--color-white);
}

.arrowUpDark {
  border-bottom: 0.4375rem solid #2d2d2d;
}

当然,这可以通过主题有效地完成,但我已经读到过,我不知道该如何做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-10 19:19:52

您可以允许CSS通过使用CSS variables来完成应用主题的繁重工作。

  • backgroundcolor创建两个变量--比如--bg--color(请注意,您将定义在这里更改主题的所有属性),
  • 定义一个.wrapper.light和一个根据光线或黑暗主题定义这些变量的wrapper.dark规则,例如,
  • 现在,主题将应用于wrapper,使用: .wrapper {颜色:var(-颜色);背景色:var(-bg);}

见下面的演示:

代码语言:javascript
运行
复制
const App = ({theme}) => {
  return (
    <div className={'wrapper ' + theme}>
      <h1>Hello {theme}!</h1>
      <span className="arrow arrowLeft"/>
      <span className="arrow arrowUp"/>
      <span className="arrow arrowRight"/>
      <span className="arrow arrowDown"/>
    </div>
  )
}
ReactDOM.render(<App theme="light"/>, document.getElementById('theme1'));
ReactDOM.render(<App theme="dark"/>, document.getElementById('theme2'));
代码语言:javascript
运行
复制
.wrapper.light {
  --bg: white;
  --color: #262626;
}

.wrapper.dark {
  --bg: #2d2d2d;
  --color: #ffffff;
}

.wrapper {
  color: var(--color);
  background-color: var(--bg);
}

.arrow {
  display: inline-block;
  width: 0;
  height: 0;
  margin: 10px;
}

.arrowRight {
  border-top: 0.4375rem solid transparent;
  border-bottom: 0.4375rem solid transparent;
  border-left: 0.4375rem solid var(--color);
}

.arrowLeft {
  border-top: 0.4375rem solid transparent;
  border-bottom: 0.4375rem solid transparent;
  border-right: 0.4375rem solid var(--color);
}

.arrowDown {
  border-left: 0.4375rem solid transparent;
  border-right: 0.4375rem solid transparent;
  border-top: 0.4375rem solid var(--color);
}

.arrowUp {
  border-left: 0.4375rem solid transparent;
  border-right: 0.4375rem solid transparent;
  border-bottom: 0.4375rem solid var(--color);
}
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="theme1"></div>
<div id="theme2"></div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56080421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档