首页 > 解决方案 > CSS 关键帧在开发环境中运行良好,但在生产环境中运行不正常

问题描述

我正在开发一个使用 node-sass 编译 SCSS 的应用程序。我的组件结构是这样的:

./src
|-- components
|   |-- Foo
|   |   |-- Foo.jsx
|   |   `-- Foo.scss
|   |-- Bar
|       |-- Bar.jsx
|       `-- Bar.scss
[...]

然后我这样称呼我的scss:

import React, {useState} from 'react';
import './Foo.scss';
[...]

当我运行开发构建时,我所有的转换都可以,但是当我运行构建和部署时,它们就丢失了。所有其他 CSS 样式都可以正常工作,只是我的转换搞砸了。它们仍然存在,但它们都发生在最后一帧。因此,如果转换应该在 200 毫秒内从 0 变为 100,它仍然会发生,但它会在最后一个可能的帧中从 0 变为 100。

谁能指出我正确的方向?这是我的 package.json:

{
  "name": "frontend",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.3.2",
    "@testing-library/user-event": "^7.1.2",
    "node-sass": "^4.14.1",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-icons": "^3.10.0",
    "react-map-gl": "^5.2.7",
    "react-map-gl-geocoder": "^2.0.12",
    "react-redux": "^7.2.0",
    "react-router": "^5.2.0",
    "react-router-dom": "^5.2.0",
    "react-scripts": "^3.4.3",
    "redux": "^4.0.5",
    "redux-thunk": "^2.3.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

编辑:根据要求,这是我的转换示例:


.fade-in {
    animation: fade-in ease-in 0.25s,
    slide-in ease-in 0.25s;
}

@keyframes fade-in {
    0% {
        opacity: 0%;
    }
    
    100% {
        opacity: 100%;
    }
}

@keyframes slide-in {
    0%{
        transform: translateY(50px);
    }
    100%{
        transform: translateY(0px);
    }
}

然后我根据状态有条件地添加类。

标签: javascriptreactjswebpacksasscreate-react-app

解决方案


简短回答: .scss 不支持 % 表示法(根据 w3 文档,它也不是官方表示法:https ://www.w3.org/TR/css-color-3/#opacity )有些浏览器不支持也支持 % 表示法。将不透明度值从 % 表示法更改为 0 到 1 之间的数字表示法。

长答案:我有一个类似的问题。在 create-react-app 环境中,当我在 cli 上使用 npm start 运行它时,以下动画正确,但在我运行 npm run build 和 serve -s build 时没有工作。我的 opacity 0 元素会在最后一帧突然达到其最终不透明度(就像你的一样。)这是我原来的自定义 .css 文件:

/*keyframes.css*/
@keyframes slideInRightDark {
  0% {
    opacity: 0%;
    transform: translate(100%);
  }
  100% {
    opacity: 40%;
    transform: translate(0%);
  }

以及反应组件文件:

/*Text.js*/
import "[...some_file_path]/keyframes.css"
...
return (<div style={{animationName: slideInRightDark, animationDuration... etc.}}></div>)

我通过查看 animate.css 库 ( https://animate.style/ ) 并观察 animate.css 关键帧是如何构建的。顺便说一句,用于即时可用关键帧的出色库。强烈推荐用于快速启动您的网络应用程序。无论如何,这里来自 animate.css 文件:

/* CSS keyframes from animate.css */
@charset "UTF-8";
:root {
  --animate-duration: 1s;
  --animate-delay: 1s;
  --animate-repeat: 1;
}
...
@-webkit-keyframes slideInLeft {
  from {
    -webkit-transform: translate3d(-100%, 0, 0);
    transform: translate3d(-100%, 0, 0);
    visibility: visible;
  }

  to {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }
}
@keyframes slideInLeft {
  from {
    -webkit-transform: translate3d(-100%, 0, 0);
    transform: translate3d(-100%, 0, 0);
    visibility: visible;
  }

  to {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }
}

在换入和换出 utf-charset 和 :root 部分以及添加我自己的@-webkit-keyframes 之后,我发现实际上是百分比符号的不透明度使它在动画持续时间后突然闪烁:

/*in keyframes.css*/
...
@keyframes slideInRightDark {
  from {
    opacity: 0;
    transform: translate(100%, 0);
  }
  to {
    opacity: 0.4;
    transform: translate(0, 0);
  }
}

我希望这会有所帮助


推荐阅读