簡體   English   中英

反應模態動態調整大小

[英]react-modal Dynamic Sizing

我正在使用非常棒的react-modal 是否可以動態調整它的大小(可能使用 css 媒體標簽)。 例如,

  1. 對於大屏幕,模態框只占屏幕的一小部分(比如說最大寬度 200px;
  2. 對於中等屏幕,模態框占據了大部分屏幕(比方說占屏幕寬度和高度的 80%
  3. 對於移動設備,它占用 100% 的寬度和高度。

看看為您准備的代碼。

ReactModal.setAppElement('#main');

class ExampleApp extends React.Component {
  constructor () {
    super();
    this.state = {
      showModal: false
    };

    this.handleOpenModal = this.handleOpenModal.bind(this);
    this.handleCloseModal = this.handleCloseModal.bind(this);
  }

  handleOpenModal () {
    this.setState({ showModal: true });
  }

  handleCloseModal () {
    this.setState({ showModal: false });
  }

  render () {
    return (
      <div>
        <button onClick={this.handleOpenModal}>Trigger Modal</button>
        <ReactModal 
           isOpen={this.state.showModal}
           contentLabel="onRequestClose Example"
           onRequestClose={this.handleCloseModal}
           className="Modal"
           overlayClassName="Overlay"
        >
          <p>Modal text!</p>
          <button onClick={this.handleCloseModal}>Close Modal</button>
        </ReactModal>
      </div>
    );
  }
}

const props = {};

ReactDOM.render(<ExampleApp {...props} />, document.getElementById('main'))

在響應式視圖中結帳:

https://codepen.io/ene_salinas/full/yRGMpG/

結帳完整代碼:

https://codepen.io/ene_salinas/pen/yRGMpG

Yellow color = large screen
Green color = medium screen
Gray color = Mobile

不要忘記這個元:

"<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">"

快樂的編碼。

我也在我的一個項目中使用該庫,在那里我提出了以下模式的樣式規則:

.ReactModal__Overlay {
    z-index: 99;
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    background-color: rgba(255,255,255,0.75);
}

.ReactModal__Content {
    position: absolute;
    left: 2.5rem;
    right: 2.5rem;
    top: 2.5rem;
    bottom: 2.5rem;
    background-color: #fff;
    box-shadow: 0 0 10px 0 rgba(0,0,97,0.5);
    overflow: auto;
    border-radius: 4px;
    outline: none;
}

為了獲得理想的結果,您需要調整絕對定位,因此:

1. large screen, modal max-width 200px
@media screen and (min-width: 900px) {
    max-width: 200px;
    left: calc(50% - 100px);
}

2. medium screen, modal about 80% screen width
@media screen and (min-width: 475px) and (max-width: 900px) {
    left: 10%;
    right: 10%;
    top: 10%;
    bottom: 10%;
}

3. mobile screen, modal full width
@media screen and (max-width: 475px) {
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
}

由於IE支持,最好不要使用calc

..ReactModal__Overlay {
    position: fixed;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    background-color: rgba(0,0,0,0.7);
    z-index: 999;
}

// this is better to use transform for center the modal and width 
.ReactModal__Content {
    position: absolute; // if it's inside your ReactModal__Overlay if not use Fixed and a higher z-index.
    width: 100%;
    height: 100%;
    left: 50%;
    top: 50%;
    overflow: auto;
    background-color: #fff;
    -webkit-transform: translate(-50,-50%);
    transform: translate(-50,-50%);
}

@media screen and (min-width: 992px) { // desktop
    .modal.modal-content {
        max-width: 200px;
        max-height: 80%;
    }
}

@media screen and (min-width: 426px) and (max-width: 991) { // tablet size
    .modal.modal-content {
        max-width: 80%;
        max-height: 80%;
    }
}

@media screen and (max-width: 425px) { // mobile size
    .modal.modal-content {
        max-width: 100%;
        max-height: 100%;
    }
}

I couldn't find a solution how to make the React Modal <<"react-modal": "^3.14.4">> height dynamic, ie depending on the content, and forcedly used the global class to be set by default

.ReactModal__Content--after-open {
    width: 1000px !important;
    top: 50% !important;
    left: 50% !important;
    transform: translate(-50%, -50%) !important;
    min-height: max-content !important;
    overflow: hidden !important;
}

 class Modal extends React.Component { state = { showModal: false }; handleOpenModal = () => { this.setState({ showModal: true }); }; handleCloseModal = () => { this.setState({ showModal: false }); }; componentDidMount() { ReactModal.setAppElement('#root'); } render() { return ( <div> <button onClick={this.handleOpenModal}>Trigger Modal</button> <ReactModal isOpen={this.state.showModal} className="Modal" overlayClassName="Overlay" > <p>Here goes your content!</p> <button onClick={this.handleCloseModal}>Close Modal</button> </ReactModal> </div> ); } } const rootElement = document.getElementById("root"); ReactDOM.render(<Modal />, rootElement); 
 .Modal { height: 100%; width: 100%; background-color: #ffffff; overflow: auto; } .Overlay { position: fixed; top: 0; bottom: 0; right: 0; left: 0; display: flex; justify-content: center; align-items: center; background-color: rgba(0, 0, 0, 0.4); } @media (min-width: 768px) and (max-width: 1279px) { .Modal { width: 80%; height: 80%; } } @media (min-width: 1280px) { .Modal { height: auto; width: auto; max-width: 500px; max-height: 80%; } } 
 <div id="root" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-modal/3.6.1/react-modal.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM