【问题标题】:React Inline styles clashes with the Client CSSReact 内联样式与客户端 CSS 冲突
【发布时间】:2017-07-29 05:37:21
【问题描述】:

我们需要在客户端页面中加载我们的应用程序。我们正在使用 React 构建它们。因此,我们通过将样式定义为对象来使用 React 内联样式。但是我们遇到了一个问题。当客户端使用标签属性指定任何 css 时。我们从未在 inline 中定义的属性获取客户端 css 的 tag 属性中使用的属性。

以下代码是我们用于导航栏的 react 内联样式。

var style = {
navigation: {
    minWidth: '50px ',
    position: 'relative ',
    marginBottom: '20px ',
    border: '1px solid transparent '
},
};
render function() {
 return(<nav style={style.navigation}> ...... </nav>);
}

在客户端,他使用样式标签属性来定义导航栏。

nav{height:40px;}

在上面这种情况下,客户端定义的nav属性也被添加到了我们的内联样式中,造成了很多麻烦。

建议一些更好的解决方案。在这种情况下,使用 Reset 类是唯一的解决方案 ??

【问题讨论】:

  • 它显然会占用那些 css。您可以做的是覆盖它们或删除那些不需要的样式
  • 嘿 piyush。谢谢回复。但它来自客户端 css 页面。所以重置是唯一的方法。 ?
  • 不重置实际上只是覆盖它们。就是这样,你也可以为不同的标签提供类名
  • 我明白,但事实是,有很多客户在使用我们的产品,所以不可能为每个客户覆盖我们样式对象中的每个样式属性。那么,有什么方法可以阻止客户端 css 应用在我们的组件中。
  • 如果是这种情况,那么只有覆盖是选项。对于覆盖,您必须提及您想要的每种样式。只需将那些作为内联传递为“null”

标签: javascript jquery css reactjs


【解决方案1】:

您需要重置组件中受客户端 CSS 影响的所有 CSS 样式。一种方法是使用CSS all property

CSS all 速记属性将除 unicode-bidi 和方向之外的所有属性重置为其初始值或继承值。

这个解决方案的问题是 all 在 IE 或 Edge 中不受支持。

var style = {
  navigation: {
    all: 'initial',
    minWidth: '50px ',
    position: 'relative ',
    marginBottom: '20px ',
    border: '1px solid transparent '
  },
};

render function() {
  return(<nav style={style.navigation}> ...... </nav>);
}

这是一个实际的示例 - 显示相同的 &lt;Nav /&gt; 组件,一个使用 CSS all: initial 属性,另一个没有。如前所述,这不适用于 Internet Explorer 或 Edge。

class Nav extends React.Component {
  render() {
    var style = {
      navigationWithAll: {
        all: 'initial',
        border: '1px solid red'
      },
      navigation: {
        minWidth: '50px ',
        position: 'relative ',
        marginBottom: '20px ',
        border: '1px solid red'
      }
    };

    return (
      <div>
        <nav style={style.navigation}>Navigation</nav>
        <nav style={style.navigationWithAll}>Navigation</nav>
      </div>
    )
  }
}

ReactDOM.render(
  <Nav />,
  document.getElementById('app')
);
nav {
  height: 100px;
  background-color: gray;
  font-family: "Comic Sans MS";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="app"></div>

如果您需要支持 IE 或 Edge(可能就是这种情况),您将需要重置正在继承的特定 CSS 属性。这可以通过以下简单的方式完成:

styles = {
  navigation: {
    height: 'initial'
  }
}

但更强大的解决方案是导入一个 CSS 组件重置,它适用于所有客户端站点。

reset = {
    margin: 'initial',
    padding: 'initial',
    height : 'auto',
    height: 'initial',
    width: 'auto',
    // any other properties you want to reset, or a full list of CSS properties to reset to initial/auto
  }
}

然后将此重置导入您的组件样式中

import reset from 'reset'  

styles = {
  navigation: {
    ...reset,
    border: 1px solid red,
    // your custom styles
  }
}

【讨论】:

  • 感谢 Brett 的时间和帮助。将测试此解决方案。
猜你喜欢
  • 2021-06-10
  • 2023-03-09
  • 1970-01-01
  • 2016-04-19
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多