GVKun编程网logo

css – 在React中缓解过渡(react css解决方案)

14

本篇文章给大家谈谈css–在React中缓解过渡,以及reactcss解决方案的知识点,同时本文还将给你拓展12react基础的css过渡动画及动画效果及使用react-transition-grou

本篇文章给大家谈谈css – 在React中缓解过渡,以及react css解决方案的知识点,同时本文还将给你拓展12 react 基础 的 css 过渡动画 及 动画效果 及 使用 react-transition-group 实现动画、2019最新create-react-app创建的react中使用sass/scss,以及在react中使用sass/scss公共变量的方法、css – 如何在React Create-React-APP中使用LESS预处理器、css – 如何在React中创建样式元素并追加?等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

css – 在React中缓解过渡(react css解决方案)

css – 在React中缓解过渡(react css解决方案)

我刚刚开始使用React并遇到一些我期待非常简单的问题.我所要做的就是让一段文字淡入,然后根据一个简单的触发器淡出,但我无法让它淡出.

代码在下面,我有一个按钮,使消息出现.两秒钟后,它正在逐渐消失,但是我希望消息在离开时消失……但显然我在React-ish转换CSS中误解了它的含义.

这是React组件:

class MessageSender extends React.Component {
  render() {
    let sent_element = null;
    if (this.state.linkSent) {
      sent_element = <AnimatedText/>;
    }
  return (
    <div>
      {sent_element}
    </div>
  );


    //A fetch then triggers:
    ...then((json) => {
      if (json.success) {
        _this.setState({
          linkSent: true
        })
        setTimeout(
            function(){
              _this.setState({linkSent:false});
            },2000
        )
      }
    });
}

class AnimatedText extends React.Component {
  render() {
    return <ReactTransitionGroup transitionAppear={true} transitionName="fadeInOut">
      <div>Sent!</div>
    </ReactTransitionGroup>;
  }
}

这是CSS:

.fadeInOut-appear {
  opacity: 0.01;
  transition: opacity 0.4s ease-in-out;
  -webkit-transition: opacity 0.4s ease-in-out;
}

.fadeInOut-appear.fadeInOut-appear-active {
  opacity: 1;
}

.fadeInOut-leave {
  opacity: 1;
  transition: opacity 0.4s ease-in-out;
  -webkit-transition: opacity 0.4s ease-in-out;
}

.fadeInOut-leave.fadeInOut-leave-active {
  opacity: 0.01;
}

解决方法

您应该使用ReactCsstransitionGroup,这是ReactTransitionGroup周围的高级API

import `ReactCsstransitionGroup` from "react-addons-css-transition-group";

在React中> v0.14,如果你启用了transitionAppear,你还必须将transitionEnterTimeout transitionLeaveTimeout和可选的transitionAppearTimeout props传递给组件(你可以这样做).

最后,您需要将key-attribute传递给动画孩子

You must provide the key attribute for all children of ReactCsstransitionGroup,even when only rendering a single item. This is how React will determine which children have entered,left,or stayed.

您可能还需要重构一下代码,以便您的ReactCsstransitionGroup不在< AnimatedText>内,而是包裹在您的{sent_element}中

有关更多信息,请参见React/Animation-docs.

12 react 基础 的 css 过渡动画 及 动画效果 及 使用 react-transition-group 实现动画

12 react 基础 的 css 过渡动画 及 动画效果 及 使用 react-transition-group 实现动画

一。过渡动画

  # index.js

import React from ''react'';
import ReactDOM from ''react-dom'';
import App from ''./app'';
ReactDOM.render(<App />, document.getElementById(''root''));

  # app.js

import React, { Component, Fragment } from ''react'';
import ''./style.css'';
class app extends Component{
constructor(props){
super(props);
this.state = {
show : true
};
this.DivToggle = this.DivToggle.bind(this);
}
DivToggle(){
console.log(this.state.show)
this.setState({
show: this.state.show ? false : true
})
}
render() {
return (
<Fragment>
<div className={this.state.show? ''show'': ''hide''}>你好啊</div>
<button onClick={this.DivToggle}>toggle</button>
</Fragment>
)
}
}
export default app;

  # style.css

.show{
opacity: 1;
transition: all 1s ease-in;
}
.hide{
opacity: 0;
transition: all 1s ease-in;
}

 

二。动画效果

  使用 keyframes 进行渲染 动画

# style.css

.show{
/* 使用 forwards css 动画最后一帧 保存 样式*/
animation: show-item 2s ease-in forwards;
}
.hide{
/* 使用 forwards css 动画最后一帧 保存 样式*/
animation: hide-item 2s ease-in forwards;
}

@keyframes hide-item {
0% {
opacity: 1;
color: red;
}
50% {
opacity: 0.5;
color: green;
}
100% {
opacity: 0;
color: blue;
}
}

@keyframes show-item {
0% {
opacity: 0;
color: blue;
}
50% {
opacity: 0.5;
color: green;
}
100% {
opacity: 1;
color: red;
}
}

 

三。使用 react-transition-group CSSTransition 实现动画  (github 地址)  (文档)

  1. 安装 react-transition-group

    yarn add react-transition-group

  2. 引入 css-transition 

    import { CSSTransition } fron ''react-transition-group''

  3. 将要 改变样式的元素用 CSSTransition 标签包裹起来

  eg:

    # index.js

import React from ''react'';

import ReactDOM from ''react-dom'';

import App from ''./app'';

 

ReactDOM.render(<App />, document.getElementById(''root''));

    # app.js

import React, {Component, Fragment} from ''react'';

import {CSSTransition} from ''react-transition-group''

import ''./style.css''

 

class app extends Component

{

    constructor(props){

        super(props);

        this.state={

            show : true

        }

        this.DivToggle = this.DivToggle.bind(this);

    }

 

    DivToggle(){

        console.log(this.state.show);

        this.setState({

            show: this.state.show? false : true

        });

    }

 

    render(){

        return (

            <Fragment>

                <CSSTransition

                    in={this.state.show}

                    timeout={1000}

                    classNames = "fade"

                    // 当隐藏后 去除挂载

                    unmountOnExit

                    // 当显示完成时 颜色变蓝  el 指 CSSTransition 内包裹的元素

                    onEntered={(el)=>{ el.style.color=''red'' }}

                    // 当退出显示时 颜色变黑  el 指 CSSTransition 内包裹的元素

                    onExited={(el)=>{ el.style.color=''black'' }}

                    // 第一次入场动画也要引入动画

                    appear={true}

                >

                    <div className={this.state.show?''show'':''hide''}>hello</div>

                </CSSTransition>

                <button type="button" onClick={this.DivToggle}> 点一下 </button>

            </Fragment>

        );

    }

 

}

export default app;

    #style.css

/* 第一次加载的时候 */
.fade-appear{
opacity: 0;
}
/* 第一次入场的时候后到 第一次完成之前 */
.fade-appear-active{
opacity: 1;
transition: opacity 1s ease-in;
}
/* 入场动画执行的第一个时刻 */
.fade-enter{
opacity: 0;
}
/* 入场动画执行的第二个时刻 到 完成之前 */
.fade-enter-active{
opacity: 1;
transition: opacity 1s ease-in;
}
/* 入场动画执行的完成时刻 */
.fade-enter-done{
opacity: 1;
}
/* 出场动画开始第一个时刻 */
.fade-exit{
opacity: 1;
}
/* 出场动画开始第二个时刻到完成时刻之前 */
.fade-exit-active{
opacity: 0;
transition: opacity 1s ease-in;
}
/* 出场动画的完成时刻 */
.fade-exit-done{
opacity: 0;
}

四。使用 react-transition-group CSSTransition TransitionGroup 实现多个元素样式动画

 #index.js

import React from ''react'';

import ReactDOM from ''react-dom'';

import App from ''./app'';

ReactDOM.render(<App />, document.getElementById(''root''));

#app.js 

import React, {Component, Fragment} from ''react'';

import {CSSTransition, TransitionGroup} from ''react-transition-group''

import ''./style.css''

 

class app extends Component

{

    constructor(props){

        super(props);

        this.state={

            list : []

        }

        this.AddItem = this.AddItem.bind(this);

    }

 

    AddItem (){

        this.setState((prevState)=>{

            return {

                list : [...prevState.list, ''item'']

            }

        })

    }

 

    render(){

        return (

            <Fragment>

                {/* TransitionGroup 包裹住要展示动画的元素 */}

                <TransitionGroup>

                {

                    this.state.list.map((val, index)=>{

                        return (

                            // 内部要展示样式的元素 使用 CSSTransition 包裹并边写动画效果

                            // 这时可以删除 in 效果 没有手动点击变换效果

                            <CSSTransition

                                timeout={1000}

                                classNames="fade"

                                onEntered={(el)=>{el.style.color="red"}}

                                appear={true}

                                key={index}

                            >

                            <div key={index} >{val}</div>

                            </CSSTransition>

                        )

                    })

                }

                </TransitionGroup>

                <button type="button" onClick={this.AddItem}> 点一下 </button>

            </Fragment>

        );

    }

 

}

 

export default app;

#style.css

/* 第一次加载的时候 */
.fade-appear{
opacity: 0;
}
/* 第一次入场的时候后到 第一次完成之前 */
.fade-appear-active{
opacity: 1;
transition: opacity 1s ease-in;
}
/* 入场动画执行的第一个时刻 */
.fade-enter{
opacity: 0;
}
/* 入场动画执行的第二个时刻 到 完成之前 */
.fade-enter-active{
opacity: 1;
transition: opacity 1s ease-in;
}
/* 入场动画执行的完成时刻 */
.fade-enter-done{
opacity: 1;
}
/* 出场动画开始第一个时刻 */
.fade-exit{
opacity: 1;
}
/* 出场动画开始第二个时刻到完成时刻之前 */
.fade-exit-active{
opacity: 0;
transition: opacity 1s ease-in;
}
/* 出场动画的完成时刻 */
.fade-exit-done{
opacity: 0;
}


 

2019最新create-react-app创建的react中使用sass/scss,以及在react中使用sass/scss公共变量的方法

2019最新create-react-app创建的react中使用sass/scss,以及在react中使用sass/scss公共变量的方法

Sass(英文全称:Syntactically Awesome Stylesheets)是一个最初由Hampton Catlin设计并由Natalie Weizenbaum开发的层叠样式表语言。Sass是一个将脚本解析成CSS的脚本语言,即SassScript。Sass包括两套语法。最开始的语法叫做“缩进语法”,与Haml类似,使用缩进来区分代码块,并且用回车将不同规则分隔开。而较新的语法叫做“SCSS”,使用和CSS一样的块语法,即使用大括号将不同的规则分开,使用分号将具体的样式分开。通常情况下,这两套语法通过.sass和.scss两个文件扩展名区分开。相信每个前端开发者都对这种css预处理器有所耳闻。
        不管你是刚使用Reactjs或者是Reactjs的老司机,你们一定都听说过create-react-app这个脚手架,而从create-react-app的官方文档中,我们可以看到他们暂时还不支持直接导入LESS或者Sass。但是通过一些配置,我们还是可以从官方脚手架中使用sass/scss/less的。
首先我们先安装node-sass这个组件,我推荐我们国内的coder使用下面的命令行安装
 
npm install -g mirror-config-china --registry= http://registry.npm.taobao.org
npm install node-sass
 
然后在自己项目的package.json中,将以下行添加到scripts中:
 
"build-css": "node-sass-chokidar src/ -o src/","watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
 
小提示: 在使用不同的预处理器时,请根据预处理的文档替换build-css和watch-css命令。
现在,您可以将src/App.css重命名为src/App.scss并运行npm run watch-css。watch-css将在src子目录中找到每个Sass文件,并在其旁边创建一个相应的CSS文件,在我们的例子中覆盖src/App.css。由于src/app.js仍然 improt src/App.css,所以样式同样成为您的应用程序的一部分。您现在可以编辑src/App.scss,同时会生成相应的src/App.css。
为了能一边编译sass,一边运行我们的前端项目,我们还需要npm-run-all这个工具,这是一个并行运行多个npm脚本的脚手架工具,安装方式也非常简单。
 
$ npm install npm-run-all --save-dev
# or
$ yarn add npm-run-all --dev
 
最后,在不使用ejec命令的情况下,更改create-react-app的webpack配置,我们使用react-app-rewired来处理,安装方式如下:
 
$ npm install react-app-rewired --save-dev
 
在完成这些步骤之后,我们修改package.json的script内容,让sass一边编译,一边跑着我们的前端项目,实现热更。
 
"scripts": {
"build-css": "node-sass src/ -o src/",
"watch-css": "npm run build-css && node-sass src/ -o src/ --watch --recursive",
"start-js": "node scripts/start.js",
"start": "npm-run-all -p watch-css start-js",
"build": "npm run build-css && node scripts/build.js",
"test": "node scripts/test.js --env=jsdom"
},
 
scripts的命令如上所述,安装完之后,npm start就可以搞定sass的使用问题了。
现在运行run npm和npm run build同样构建了Sass文件。
作者:Originalee
链接: https://www.jianshu.com/p/8c577509079f     
来源:简书
如果需要定于全局的scss样式,只需要完成以上设置后,将index.css文件改成index.scss就行
然后在index.js文件中引入  import ''./index.scss'';
 
以上就是在最新creact-react-app搭建的react项目中使用sass的配置方式;  实际开发中还需要定义公共的sass变量,函数等,要实现这一目的,就还需要进行以下操作(前方高能):
============================-
 

react sass scss设置全局变量全局函数

定义全局变量的种方式: 
方式一(需要eject暴露环境,不推荐):       https://www.jianshu.com/p/ec57dd11c4eb
  • 1.安装 sass-resources-loader
  npm i sass-resources-loader --save-dev
  • 2.暴露配置文件 npm run eject //如果这一步报错,可能是安装了git后出现的问题,解决方案是:
      • git add .
      • git commit -am "Save before ejecting"
      • npm run eject
      • 这样就能eject了
  • 3.修改 config 里面的 webpack.config.js
在 getStyleLoaders后面添加如下代码
 
.concat({
loader: ''sass-resources-loader'',
options: {
resources: [
// 这里按照你的公共变量文件路径填写
path.resolve(__dirname, ''./../src/common.scss'')
]
}
})
 
最终代码如下
 
{
test: sassRegex,
exclude: sassModuleRegex,
use: getStyleLoaders(
{
importLoaders: 2,
sourceMap: isEnvProduction && shouldUseSourceMap,
},
''sass-loader'',
).concat({
loader: ''sass-resources-loader'',
options: {
resources: [
// 这里按照你的公共变量文件路径填写
path.resolve(__dirname, ''./../src/common.scss'')
]
}
}),
sideEffects: true,},
提示:    ''./../src/common.scss'' 这个是我的公共的sass路径 根据你自己的来配置
以上步骤完成后,重新npm start就可以使用公共变量了.
 
方式二(不需要eject暴露环境,强烈推荐使用这种方式!!!): 
         1  安装3个模块: cnpm install    react-app-rewired    customize-cra    sass-resources-loader  --save-dev
         2 在package.json的同级目录中 新建一个config-overrides.js文件,在该文件中写入以下代码:
 
const { override, adjustStyleLoaders } = require("customize-cra");
module.exports = override(
  // ...其他配置...
  adjustStyleLoaders(rule => {
    if (rule.test.toString().includes("scss")) {
      rule.use.push({
        loader: require.resolve("sass-resources-loader"),
        options: {
          resources: "./src/assets/scss/color/outcolor.scss" //这里是你自己放公共scss变量的路径
        }
      });
    }
  })
  // ...其他配置...
);
                
        3 在package.json文件中,将 "scripts"修改为:
                
                      "scripts": {
    "build-css": "node-sass-chokidar src/ -o src/",
    "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
    "start-js": "node scripts/start.js",
    "start": "react-app-rewired start",
    "build": "react-app-rewired build",
    "test": "react-app-rewired test",
    "eject": "react-app-rewired eject"
  },
                
                4  最后重新运行一下:  npm start;   大功告成!!
 
看完觉得有用的同学,帮忙点个赞让更多人看到吧~~(比心)
     
2019年12月
 
 
 
 
 
 
 

css – 如何在React Create-React-APP中使用LESS预处理器

css – 如何在React Create-React-APP中使用LESS预处理器

我想在我的create-react-app中使用LESS预处理器.
React Code
ReactDOM.render(
    <form>
        <input type="email" data-info="Enter Email" pattern="/\S+@\S+\.\S+/" required title="Please enter value" required="required"/>
        <input type="submit"/>      
    </form>,document.getElementById('root'))

index.less

body{
  background: red;
}

解决方法

这是我这样做的方式

你应该使用node-sass-chokidar npm包:

npm install node-sass-chokidar --save-dev

然后将以下内容添加到package.json中的npm脚本中:

"build-css": "node-sass-chokidar src/ -o src/","watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive"

观察者将在src子目录中找到每个Sass文件,并在其旁边创建相应的CSS文件.

请记住从源代码管理中删除所有css文件,并将src / ** / *.css添加到.gitignore.

最后,您可能希望使用npm start自动运行watch-css,并将build-css作为npm run build的一部分运行.为此,安装以下npm包,以便能够顺序执行两个脚本:

npm install --save-dev npm-run-all

然后将package.json文件中的npm start和build脚本更改为以下内容:

"scripts": {
     "build-css": "node-sass-chokidar src/ -o src/","watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive"
    "start-js": "react-scripts start","start": "npm-run-all -p watch-css start-js","build": "npm run build-css && react-scripts build","test": "react-scripts test --env=jsdom","eject": "react-scripts eject"
   }

有关详细信息,请参阅此链接:https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-a-css-preprocessor-sass-less-etc

css – 如何在React中创建样式元素并追加?

css – 如何在React中创建样式元素并追加?

我正在学习React,并且(更重要的是)试图了解反应是如何实际运作的.

我有一些生成的CSS,我想作为样式元素追加到头部.在js land中,这将是:

const $style = document.createElement("style");
document.head.appendChild($style);
const randBlue = ~~(Math.random() * 250);
$style.innerHtml = `body { color: rgb(10,10,${randBlue}); }`;

不幸的是,在React的土地上,事情在这方面似乎不太直白.我对此的理解是,将所有样式添加到willy nilly是不好的做法,因为有足够的人做这件事会导致问题.我也认识到大多数人都使用样式组件,魅力四射,样式化的jsx,或内联生成的CSS,因为它们可以避免上述威利猥亵可能产生的许多问题.

但我不想使用我不了解的模块,据我所知,上面的大多数创建样式元素并以某种方式将它们添加到头部,我想知道如何.

所以,如果我在React中并且有一些生成的css文本:

const randomColor = Math.random() > 0.5 ? "red" : "blue";
const generatedCss = `body { color: ${randomColor}; }`;

这里有什么?

createStyleElementAndAppendToHead(generatedCss) {
  // mystery code
};
最佳答案
欢迎来到React!

确实,在反应土地上有人们会像风格组件,迷人,风格-jsx,内联等一样推动你的最佳实践.我甚至会推荐这些.

关于Reactjs的重要部分是可以使用vanilla javascript.可以在生命周期componentDidMount中使用相同的代码片段

componentDidMount() {
  const $style = document.createElement("style");
  document.head.appendChild($style);
  const randBlue = ~~(Math.random() * 250);
  $style.innerHTML = `body { color: rgb(10,${randBlue}); }`;
}

或者你甚至可以像这样定位身体的内联样式:

componentDidMount() {
  const randBlue = ~~(Math.random() * 250);
  document.body.style.color = `rgb(10,${randBlue})`;
}

React Hooks更新:

把它放在功能组件的开头

useEffect(() => {
  const randBlue = ~~(Math.random() * 250);
  document.body.style.color = `rgb(10,${randBlue})`;
});

关于css – 在React中缓解过渡react css解决方案的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于12 react 基础 的 css 过渡动画 及 动画效果 及 使用 react-transition-group 实现动画、2019最新create-react-app创建的react中使用sass/scss,以及在react中使用sass/scss公共变量的方法、css – 如何在React Create-React-APP中使用LESS预处理器、css – 如何在React中创建样式元素并追加?的相关信息,请在本站寻找。

本文标签: