Изменить модальный фон на анимированный фон - PullRequest
2 голосов
/ 15 февраля 2020

В настоящее время у меня есть таблица с вопросом для каждой ячейки. Он моделирует игру Jeopardy. Когда пользователь нажимает на одну из ячеек, появляется модальный вопрос, а затем, когда он нажимает «Отправить», появляется модал обратной связи. Я хочу изменить фон вопроса и модальностей обратной связи, чтобы они были единым анимированным фоном. Но в настоящее время фон меняется только для одного столбца ячейки, на которой я щелкаю. Мне нужно как-то временно переопределить таблицу и отображать анимированный фон, а не таблицу, когда всплывают модалы.

Вот что у меня есть: Вопрос модальный (который также отображает модал обратной связи)

import React, { Component } from 'react';

import Modal from "react-bootstrap/Modal";
import Button from "react-bootstrap/Button";
import UserInput from './userInput.js';
import Feedback from "./feedback/feedback";
import Backdrop from "./backdrop";
import styles from '../scss/backdrop.scss';

class SampleQ extends Component {
    static getInitialProps({query: {amount, question, answer}}) {
        return {specAmt: amount, specQ: question, specA: answer}
    }

    constructor(props) {
        super(props);

        this.state = {
            showQuestion: false, // tracks visibility of first modal (the question modal)
            showFeedback: false, // tracks visibility of second modal (the feedback modal)
            showBackdrop: false // tracks visibility of backdrop when question pops up
        };

        this.handleShow = () => {
            // show question and the backdrop when the user clicks a cell on the table
            this.setState({ showQuestion: true, showBackdrop: true });
        };

        this.handleHide = () => {
            this.setState({ showQuestion: false });
        };

        this.submitForm = event => {
            event.preventDefault();

            this.setState({
                showQuestion: false, // close question modal
                showFeedback: true, // should open Feedback modal
            });
        };

        this.closeFeedback = () => {
            // close Feedback modal and close backdrop so that it goes back to the table
            this.setState( { showFeedback: false, showBackdrop: false });
        };
    }

    render() {
        let backdrop;

        // only shows if either the question or feedback modal is up. if neither are open, then don't show stars
        if (this.state.showBackdrop && (this.state.showQuestion || this.state.showFeedback) ) {
            backdrop = <Backdrop/>
        } else {}

        return (
            <>
                <Button variant="outline-danger" size = "lg" onClick={this.handleShow}>
                    $ {this.props.amount}00
                </Button>

                {backdrop}

                <Modal
                    show={this.state.showQuestion}
                    onHide={this.handleHide}
                    dialogClassName="modal-90w"
                    aria-labelledby="example-custom-modal-styling-title"
                >
                    <Modal.Header closeButton>
                        <Modal.Title id="example-custom-modal-styling-title">
                            Question
                        </Modal.Title>
                    </Modal.Header>
                    <Modal.Body>
                        <p>
                            {this.props.question}
                        </p>
                        <div>
                            <UserInput
                                answer={this.props.specA}
                                handleClick={this.submitForm}
                            />
                        </div>
                    </Modal.Body>
                </Modal>
                <Feedback
                    showModal={this.state.showFeedback}
                    handleHide={this.closeFeedback}
                />
            </>
        );
    }
}

export default SampleQ;

Анимированный фон / фон для модалов

import React, { Component } from 'react';
import styles from '../scss/backdrop.scss';

export default class Backdrop extends Component {
    render() {
        return (
            <div className={styles.body}>
                <div className={styles.night}>
                    <div className={styles.shooting_star}></div>
                    <div className={styles.shooting_star}></div>
                    <div className={styles.shooting_star}></div>
                    <div className={styles.shooting_star}></div>
                </div>
            </div>
        );
    }
}

CSS / S CSS для фона / фона

.body {
  background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%);
  height: 100vh;
  overflow: hidden;
  display: flex;
  font-family: 'Anton', sans-serif;
  justify-content: center;
  align-items: center;
}

$shooting-time: 3000ms;

.night {
  position: relative;
  width: 100%;
  height: 100%;
  transform: rotateZ(45deg);
  // animation: sky 200000ms linear infinite;
}

.shooting_star {
  position: absolute;
  left: 50%;
  top: 50%;
  // width: 100px;
  height: 2px;
  background: linear-gradient(-45deg, rgba(95, 145, 255, 1), rgba(0, 0, 255, 0));
  border-radius: 999px;
  filter: drop-shadow(0 0 6px rgba(105, 155, 255, 1));
  animation:
          tail $shooting-time ease-in-out infinite,
          shooting $shooting-time ease-in-out infinite;

  &::before {
    content: '';
    position: absolute;
    top: calc(50% - 1px);
    right: 0;
    // width: 30px;
    height: 2px;
    background: linear-gradient(-45deg, rgba(0, 0, 255, 0), rgba(95, 145, 255, 1), rgba(0, 0, 255, 0));
    transform: translateX(50%) rotateZ(45deg);
    border-radius: 100%;
    animation: shining $shooting-time ease-in-out infinite;
  }

  &::after {
    @extend .shooting_star::before;
    transform: translateX(50%) rotateZ(-45deg);
  }

  @for $i from 1 through 20 {
    &:nth-child(#{$i}) {
      $delay: random(9999) + 0ms;
      top: calc(50% - #{random(400) - 200px});
      left: calc(50% - #{random(300) + 0px});
      animation-delay: $delay;
      // opacity: random(50) / 100 + 0.5;

      &::before,
      &::after {
        animation-delay: $delay;
      }
    }
  }
}

@keyframes tail {
  0% {
    width: 0;
  }

  30% {
    width: 100px;
  }

  100% {
    width: 0;
  }
}

@keyframes shining {
  0% {
    width: 0;
  }

  50% {
    width: 30px;
  }

  100% {
    width: 0;
  }
}

@keyframes shooting {
  0% {
    transform: translateX(0);
  }

  100% {
    transform: translateX(300px);
  }
}

@keyframes sky {
  0% {
    transform: rotate(45deg);
  }

  100% {
    transform: rotate(45 + 360deg);
  }
}

Скриншоты: таблица вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...