使用styled-components实现CSS in JS
前面的话
使用jsx语法可以实现HTML in JS,使用svgr可以实现svg in JS,使用styled-components可以实现CSS in JS。这样,使用react开发,就变成了使用JS开发,统一且方便。本文将详细介绍styled-components的用法
基本用法
【安装】
- $ npm install styled-components
使用非常简单,下面的代码片段展示了 React 项目中使用 styled-components,定义了 Wrapper 和 Button 两个组件,包含了 html 结构和对应的 css 样式,从而将样式和组件之间的 class 映射关系移除
- import styled from 'styled-components';
- const Wrapper = styled.section`
- margin: auto;
- width: 300px;
- text-align: center;
- `;
- const Button = styled.button`
- width: 100px;
- color: white;
- background: skyblue;
- `;
- render(
- <Wrapper>
- <Button>Hello World</Button>
- </Wrapper>
- );
组件样式
如果要为组件设置样式,则需要使用小括号语法,而且需要在组件上设置className和children
- const Link = ({ className, children }) => (
- <a className={className}>
- {children}
- </a>
- )
- const StyledLink = styled(Link)`
- color: palevioletred;
- font-weight: bold;
- `;
- render(
- <div>
- <Link>Unstyled, boring Link</Link>
- <br />
- <StyledLink>Styled, exciting Link</StyledLink>
- </div>
- );
扩展样式
使用扩展样式,可以基于已经存在的样式进行扩展
- const Button = styled.button`
- color: palevioletred;
- font-size: 1em;
- margin: 1em;
- padding: .25em 1em;
- border: 2px solid palevioletred;
- border-radius: 3px;
- `;
- const TomatoButton = Button.extend`
- color: tomato;
- border-color: tomato;
- `;
- render(
- <div>
- <Button>Normal Button</Button>
- <TomatoButton>Tomato Button</TomatoButton>
- </div>
- );
更换标签
在某些情况下,可以在复用样式的基础上更换标签
- const Button = styled.button`
- display: inline-block;
- color: palevioletred;
- font-size: 1em;
- margin: 1em;
- padding: .25em 1em;
- border: 2px solid palevioletred;
- border-radius: 3px;
- `;
- const Link = Button.withComponent('a')
- const TomatoLink = Link.extend`
- color: tomato;
- border-color: tomato;
- `;
- render(
- <div>
- <Button>Normal Button</Button>
- <Link>Normal Link</Link>
- <TomatoLink>Tomato Link</TomatoLink>
- </div>
- );
传递属性
通过props可以从父组件向子组件传递属性
- const GlassModal = ({ children, className, backgroundColor, padding }) => (
- <Wrap backgroundColor={backgroundColor}>
- <Main padding={padding} className={className}>
- {children}
- </Main>
- </Wrap>
- )
- export default GlassModal
- const Wrap = styled.section`
- background-color: ${props => props.backgroundColor || BLUE_DARK};
- `
- const Main = styled.main`
- padding: ${props => props.padding || ''};
- background-color: ${OPACITY_LIGHT};
- `
- const StyledGlassModal = styled(GlassModal)`
- padding: 20px 10px;
- text-align: center;
- `
或者,基于prop来定制主题
- const Button = styled.button`
- background: ${props => props.primary ? 'palevioletred' : 'white'};
- color: ${props => props.primary ? 'white' : 'palevioletred'};
- font-size: 1em;
- margin: 1em;
- padding: .25em 1em;
- border: 2px solid palevioletred;
- border-radius: 3px;
- `;
- render(
- <div>
- <Button>Normal</Button>
- <Button primary>Primary</Button>
- </div>
- );
attrs函数
通过使用attrs函数,可以用来设置其他属性
- const Input = styled.input.attrs({
- type: 'password',
- margin: props => props.size || '1em',
- padding: props => props.size || '1em'
- })`
- color: palevioletred;
- border-radius: 3px;
- margin: ${props => props.margin};
- padding: ${props => props.padding};
- `;
- render(
- <div>
- <Input placeholder="A small text input" size="1em" />
- <Input placeholder="A bigger text input" size="2em" />
- </div>
- );
或者引入第三方库的样式,如activeClassName
- const Button = styled.button.attrs({
- className: 'small',
- })`
- background: black;
- color: white;
- `;
编译后的 html 结构如下:
- <button class="sc-gPEVay small gYllyG">
- Styled Components
- </button>
动画
styled-components 同样对 css 动画中的 @keyframe 做了很好的支持
- import { keyframes } from 'styled-components';
- const rotate360 = keyframes`
- from {transform: rotate(0deg);}
- to {transform: rotate(360deg);}
- `;
- const Rotate = styled.div`
- display: inline-block;
- animation: ${rotate360} 2s linear infinite;
- `;
- render(
- <Rotate><
使用styled-components实现CSS in JS的更多相关文章
一.什么是 CSS in JS 上图来源:https://2019.stateofcss.com/technologies/ CSS in JS 是2014年推出的一种设计模式,它的核心思想是把 CS ...
转自:https://blog.bitsrc.io/9-css-in-js-libraries-you-should-know-in-2018-25afb4025b9b 实际上 wix 的 styl ...
1.styled components官网网址 https://www.styled-components.com/docs 以组件的形式来写样式. 1.1安装 yarn add styled-c ...
开发者需要了解的WebKit https://www.infoq.cn/article/webkit-for-developers 开发者需要了解的 WebKit 彭超 2013 年 3 月 18 ...
例子中css文件采用bootstrap.css,js文件采用jQuery,less文件用less.less(自定义文件) 步骤一:安装webpack cnpm install webpack -g 步 ...
vue components @import css not support css3 @import https://github.com/vuejs/vue-loader/issues/138#i ...
在正常的创建和引用vue文件都是html.css.js三者在一起的,这样写起来虽然方便了,但是页面比较大或者代码比较多的情况下,即使使用组件有时代码也比较多,简单来说查找不变不利于编程,大的来说影像优 ...
目录 项目初始化 组件数据局部化处理 子组件 父组件 路由逻辑跳转 案例 组件传参 父传子 子组件 父组件 子传父 子组件 父组件 组件的生命周期钩子 路由传参 第一种 配置:router/index ...
目录 前台 vue环境 创建项目 重构项目目录 文件修订:目录中非配置文件的多余文件可以移除 App.vue router/index.js Home.vue 全局配置:全局样式.配置文件 globa ...
随机推荐
一.使用OpenCV处理图像 1.不同颜色空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法.当前,在计算机视觉中有三种常用的色彩空间:灰度.BGR以及HSV(Hue, Saturat ...
今天是使用vue突然发现没有热加载功能了,然后网上查了一下,配置了一些东西,并没有什么用,然后发现电脑FQ影响 vue 热加载 关掉FQ软件就好了,具体原理我也不清
时间:2018.05.21地点:北京嘉丽大酒店
目录 一.进程相关的概念 二.关闭会话时子进程进程被杀死 三.nohup的原理 四.setsid原理 五.daemon &和守护进程的区别 六.服务进程为什么要fork两次 七.systemd ...
目录 一起学 mybatis 0 <sql> 节点解析 1 解析流程 2 节点解析 2.1 解析流程 2.2 <include> 节点的解析 2.3 Node.ELEMENT_ ...
class Test<T> where T : new() { public static T Instance() { return new T(); } } 就上面这方法, 居然比ne ...
一.列出IO操作的标识符及描述 标识符 描述 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式打开一个文件用于只读.文件指针将会放在文件的开头.这是默认模式. ...
Problem The Constitution of a certain country states that the leader is the person with the name con ...
title: { text: '总资产', subtext: '2000000.00', x: 'center', y: 'center' }图例:
Hibernate Column 'parent_id' specified twice问题解决--insertable = false, updatable = false的使用 - shendeg ...