如何覆盖另一个css文件中的样式

Posted

技术标签:

【中文标题】如何覆盖另一个css文件中的样式【英文标题】:How to override styles from another css file 【发布时间】:2018-11-27 23:08:51 【问题描述】:

我有一个 css 文件 (main.css),我想使用另一个 css 文件 (overrides.css) 覆盖它。但是我这样做有问题,因为它们位于不同的文件中并且它们得到不同的哈希值。

这是我的 CSS:

/* main.css */
.mainContainer 
    padding: 16px;
    margin: 16px;
    background-color: palevioletred;
    border-radius: 5px;


.mainContainer h1
    color: white;



/* overrides.css */
.mainContainer h1
    color: blue;

来自here,我使用Object.assign() 来合并css 文件,但没有帮助。这是我的组件:

import React from 'react';
import Main from './main.css';
import Overrides from './overrides.css';
const Style = Object.assign(, Overrides, Main);

class Sample extends React.Component
  render()
    return (
      <div className=Style.mainContainer>
        <h1>Hello</h1>
        <p>Hello CSS modules!</p>
      </div>
    );
  


export default Sample;

我希望我的h1 变成蓝色,但它不会。这是我编译的css:

/* main.css */
._1pXpG 
    padding: 16px;
    margin: 16px;
    background-color: palevioletred;
    border-radius: 5px;

._1pXpG h1
    color: white;



/* overrides.css */
.Wmy0p h1
  color: blue;

我希望 .Wmy0p h1._1pXpG h1 所以它可以覆盖。但它不会。请注意,如果您只是将 overrides.css 的内容粘贴到主 css 的底部,它将起作用,但我需要将我的覆盖 css 文件放在单独的文件中。

提前致谢

【问题讨论】:

【参考方案1】:

可以通过从父 div 提供更多特异性来覆盖其他文件中的样式。大多数特异性解决了覆盖其他文件的 CSS。

class Sample extends React.Component
render()
    return (
      <div className=Style.mainContainerDetails>
        <div className=Style.mainContainer>
          <h1>Hello</h1>
          <p>Hello CSS modules!</p>
        </div>
      </div>
    );
  



/* main.css */
.mainContainer 
    padding: 16px;
    margin: 16px;
    background-color: palevioletred;
    border-radius: 5px;


.mainContainer h1
    color: white;



/* overrides.css */
.mainContainerDetails .mainContainer h1
    color: blue;

【讨论】:

我试过这个。不幸的是,这对我不起作用。编译后得到另一个名字。 文字颜色没有变化吗?我在本地尝试了示例,它按预期工作。 是的,对我来说,文本的颜色不会像预期的那样变为蓝色。【参考方案2】:

您可以只使用原生 javascript 来替换网页上的特定 css 链接。 我还建议使用事件侦听器等到页面加载完毕后再进行替换。

这是一个例子:

function overrideCommonCss() 
    var webpageCurrentLink = "main.css", webpageNewLink = "overrides.css", webpageFoundLink, webpageCssTags = 0,webpageAllCssLinks = document.getElementsByTagName("LINK");
    if (webpageAllCssLinks) 
        for (webpageCssTags = 0;webpageCssTags < webpageAllCssLinks.length;webpageCssTags++) 
            webpageFoundLink = webpageAllCssLinks[webpageCssTags].href;                                 
            if (webpageFoundLink.indexOf(webpageCurrentLink) !== -1) 
                webpageAllCssLinks[webpageCssTags].href = webpageAllCssLinks[webpageCssTags].href.replace(webpageCurrentLink, webpageNewLink);                  
                break;
                                   
        
    

if(window.attachEvent) 
    window.attachEvent("onload", overrideCommonCss);            

else 
    window.addEventListener("load", overrideCommonCss, false);          

【讨论】:

【参考方案3】:

您是否尝试过在css 中使用!important?我相信这似乎是问题所在。下面是一个例子,简单的html

/* main.css */
.mainContainer 
    padding: 16px;
    margin: 16px;
    background-color: palevioletred;
    border-radius: 5px;


.mainContainer h1
    color: white;



/* overrides.css */
.mainContainer h1
    color: blue;
<div class="mainContainer">
<h1>Hello World!</h1>
</div>

如您所见,使用!important 对我来说效果很好...

【讨论】:

以上是关于如何覆盖另一个css文件中的样式的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 如何在组件中定义(覆盖)css 样式?

Bootstrap cdn 覆盖了我在 react js 中的自定义 css 样式

CSS覆盖公共样式中的某个属性

GWT 主题样式覆盖了我的 css 样式

css样式覆盖顺序

如何使用样式组件覆盖material-ui css?