reactjs - 出现自定义加载时,背景不应移动到顶部

标签 reactjs css

这个问题是另一个问题(已回答)的延续

Content below should not scroll when fixed div is visible

期望什么?

点击数字中的“PRESS ME”(#39)

内容不应移动到顶部,而应保留在原处且不应滚动。

我已经添加了 React 代码

class App extends React.Component {

    state = {
      isLoading: false
    }

    changeLoadingState() {
      this.setState({
        isLoading: true
      });
      setTimeout(() => this.setState({
        isLoading: false
      }), 3000)
    }

    render() {
        var array = new Array(420);
        var filledArray = array.fill(0);
        return ( <
          div style = {
            {
              overflow: this.state.isLoading ? 'auto' : '',
              height: this.state.isLoading ? '100vh' : null
            }
          } > {
            this.state.isLoading ? ( <
              div className = "fixed" >
              <
              div className = "loader" > Loading... < /div> <
              /div>
            ) : null
          }

          <
          div className = "content" > {
            filledArray.map((a, index) => < div className = "hook"
              onClick = {
                index == 39 ? this.changeLoadingState.bind(this) : null
              } > {
                index == 39 ? "CLICK ME" : index
              } < /div>)} <
              /div> <
              /div>
            );
          }
        }

        ReactDOM.render( < App / > , document.getElementById("root"));
body,
html {
  margin: 0;
  padding: 0;
}

.fixed {
  display: flex;
  color: white;
  align-items: center;
  justify-content: center;
  position: fixed;
  background: rgba(0, 0, 0, 0.5);
  height: 100vh;
  width: 100vw;
}

.content {
  height: 3300px;
  background: red;
}

.hook {
  color: white;
  font-size: 40px;
}


/* Please ignore the below code, as it has nothing to do with the problem */

.loader {
  color: #ffffff;
  font-size: 90px;
  text-indent: -9999em;
  overflow: hidden;
  width: 1em;
  height: 1em;
  border-radius: 50%;
  margin: 72px auto;
  position: relative;
  -webkit-transform: translateZ(0);
  -ms-transform: translateZ(0);
  transform: translateZ(0);
  -webkit-animation: load6 1.7s infinite ease, round 1.7s infinite ease;
  animation: load6 1.7s infinite ease, round 1.7s infinite ease;
}

@-webkit-keyframes load6 {
  0% {
    box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  }
  5%,
  95% {
    box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  }
  10%,
  59% {
    box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
  }
  20% {
    box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
  }
  38% {
    box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
  }
  100% {
    box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  }
}

@keyframes load6 {
  0% {
    box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  }
  5%,
  95% {
    box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  }
  10%,
  59% {
    box-shadow: 0 -0.83em 0 -0.4em, -0.087em -0.825em 0 -0.42em, -0.173em -0.812em 0 -0.44em, -0.256em -0.789em 0 -0.46em, -0.297em -0.775em 0 -0.477em;
  }
  20% {
    box-shadow: 0 -0.83em 0 -0.4em, -0.338em -0.758em 0 -0.42em, -0.555em -0.617em 0 -0.44em, -0.671em -0.488em 0 -0.46em, -0.749em -0.34em 0 -0.477em;
  }
  38% {
    box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0.74em 0 -0.42em, -0.645em -0.522em 0 -0.44em, -0.775em -0.297em 0 -0.46em, -0.82em -0.09em 0 -0.477em;
  }
  100% {
    box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em;
  }
}

@-webkit-keyframes round {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

@keyframes round {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>

最佳答案

当模态显示时,您需要将 overflow: hidden 添加到正文(或最高级别的包装器)。有时,这会很痛苦,具体取决于您在 DOM 中可以访问的内容。

我还看到有人通过将 document window 绘制到 canvas 对象中然后将其用作模态的背景来伪造它。看起来过分了,但它使一切看起来都是静态的。

关于reactjs - 出现自定义加载时,背景不应移动到顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55718358/

相关文章:

html - 网站风格在iOS设备上不同

html - 中心图像,较小的图像围绕外部旋转

javascript - Reanimated 2 不能使用具有直接值的 withSequence

javascript - react 动画不起作用

css - 列宽故障与 contenteditable

javascript - 如果在移动设备上,将数组(索引列表)拆分为两行

javascript - 让 Paypal 捐赠改变 CSS

java - com.android.build.api.transform.TransformException :

reactjs - 如何解决下一个js项目中的npm错误

javascript - 在 React 中测试嵌套组件回调