Skip to content

样式冲突 Styled-Components

styled-components 它的作用就是怕里面的个个 css 之间相互重叠,覆盖,犯冲突,所以引入了这个组件,因为他只对本组件管用

  • 这个组件仅仅负责样式 不负责逻辑

安装

javascript
npm install --save styled-components

基础语法

  • 用组件的形式编写 css,必须引入 styled
javascript
import styled from "styled-components";

export const HomeWrap = styled.div`
  width: 1200px;
  height: 150px;
  margin: 0 auto;
  background: blue;
  text-align: center;
  color: yellow;
`;

export const HomeHeader = styled.div`
  width: 800px;
  height: 75px;
  margin: 0 auto;
  background: red;
`;
  • 组件里面使用的时候
javascript
import React, { Component } from "react";
import { HomeHeader, HomeWrap } from "./jscss/Header";
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      message: "首页",
    };
  }
  render() {
    return (
      <div>
        <HomeWrap>
          <HomeHeader>{this.state.message}</HomeHeader>
        </HomeWrap>
      </div>
    );
  }
}

export default App;

全局样式

  • styled-components 提供了 createGlobalStyle 可以设置全局样式

  • 例如下面就是简单版本的全局引入,里面有 iconfont 请注意路径匹对

  • 代码

javascript
import { createGlobalStyle } from "styled-components";
const GrobalStyle = createGlobalStyle`
    html, body, div, span {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
    }
    /* HTML5 display-role reset for older browsers */
    article, aside, details, figcaption, figure,
    footer, header, hgroup, menu, nav, section {
    display: block;
    }
    body {
    line-height: 1;
    background:red;
    }
    ol, ul {
    list-style: none;
    }
    blockquote, q {
    quotes: none;
    }
    blockquote:before, blockquote:after,
    q:before, q:after {
    content: '';
    content: none;
    }
    table {
    border-collapse: collapse;
    border-spacing: 0;
    }
  @font-face {font-family: "iconfont";
  src: url('../iconfont/iconfont.eot?t=1563781351915'); /* IE9 */
}

.iconfont {
  font-family: "iconfont" !important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.icon-tupian:before {
  content: "\e643";
}

.icon-fanhui:before {
  content: "\e624";
}

.icon-jiantouxia:before {
  content: "\e62d";
}

.icon-sousuo:before {
  content: "\e632";
}
`;
export default GrobalStyle;
  • 页面上引入的时候千万注意他也是组件。但是不能包含其他组件。必须优先引入,在 app.js 里面 Global 必须放在外面
javascript
import Global from "./pages/commonstyle";

class App extends Component {
  render() {
    return (
      <Fragment>
        <Global />
        <PageUi
          inputValue={this.state.inputValue}
          handchange={this.handchange}
          handClick={this.handClick}
          deleteItem={this.deleteItem}
          list={this.state.list}
        />
        <Index />
      </Fragment>
    );
  }
}

export default App;

背景图片引入

  • ${} 里面放的变量
javascript
import styled from "styled-components";
import Middleimg from "../../../images/2019-07-20_200948.png";
export const MiddleWraper = styled.div`
  width: 880px;
  height: 100px;
  float: left;
  background: url(${Middleimg});
`;

组件传值的方式也可以(尽量少用)

  • 组件传值只能是地址不能是相对路径

父组件

javascript
import React, { Component, Fragment } from "react";
import Header from "./components/Header.js";
class Index extends Component {
  constructor(props) {
    super(props);
    this.state = {
      imgurl:
        "http://fuss10.elemecdn.com/c/cd/c12745ed8a5171e13b427dbc39401jpeg.jpeg?imageView2/1/w/114/h/114",
    };
  }
  render() {
    return (
      <Fragment>
        <Header imgurl={this.state.imgurl} />
      </Fragment>
    );
  }
}

export default Index;

子组件

  • 把值放到属性里面
javascript
<RightWraper imgurl={this.props.imgurl} />
  • css 里面变量变成
javascript
export const RightWraper = styled.div`
  width: 100px;
  height: 100px;
  float: left;
  background-image: url(${(props) => props.imgurl});
  background-size: contain;
`;

还可以加标签属性

javascript
export const NavSearch = styled.input.attrs({
  placeholder: "搜索框架",
  type: "text",
})`
  width: 200px;
  height: 50px;
`;

继承

  • 比如一个按钮 button 只想改变颜色 不想改变大小

  • styled(xxxx)

javascript
export const HomeHeader = styled.div`
  width: 800px;
  height: 75px;
  margin: 0 auto;
  background: red;
`;

export const HomeHeaderson = styled(HomeHeader)`
  width: 300px;
  height: 100px;
  background: black;
  float: left;
`;

总结

  • 利用 styled-components 这样可以避免 css 混淆

  • styled-components 法则