반응: 모달 열 때 스크롤 방지
커스텀 모드 컴포넌트가 있습니다.열려 있을 때는, 백그라운드에서 스크롤 할 수 없습니다.
아래 코드를 사용해 보았습니다.
componentDidMount() {
document.body.style.overflow = 'hidden';
}
componentWillUnmount() {
document.body.style.overflow = 'unset';
}
처음에는 효과가 있는 것 같습니다만, 모달 컴포넌트를 사용하면, 다른 페이지에서는 모달의 닫힘 상태에서도 스크롤이 되지 않습니다.
이에 대한 더 나은 해결책이 있을까요?
모달 컴포넌트:
export class Modal extends React.Component {
constructor(props) {
super(props);
}
componentDidMount() {
document.body.style.overflow = 'hidden';
}
componentWillUnmount() {
document.body.style.overflow = 'unset';
}
render() {
return (
<React.Fragment>
{this.props.showAt ?
this.props.show ?
<div style={style} className={`${this.props.sectionName} ${modalTypeStyle ? modalTypeStyle : styles.modalWhite} ${modalTypeSize ? modalTypeSize : styles.modalSmall} ${!this.props.showAt ? styles.modalWhiteFixed : ""}`}>
{this.props.arrowShape ? <div className={arrowTypeStyle ? arrowTypeStyle : styles.triangleToprightWhite} /> : null}
{this.props.children}
</div>
: null
:
this.props.show ?
<div className={`${this.props.className} ${styles.modal}`}>
<div style={style} className={`${this.props.sectionName} ${modalTypeStyle ? modalTypeStyle : styles.modalWhite} ${modalTypeSize ? modalTypeSize : styles.modalSmall} ${!this.props.showAt ? styles.modalWhiteFixed : ""}`}>
{this.props.arrowShape ? <div className={arrowTypeStyle ? arrowTypeStyle : styles.triangleToprightWhite} /> : null}
{this.props.children}
</div>
</div> :
null}
</React.Fragment>
)
}
}
상태를 사용하여 모달의 열림 여부를 추적하고 모달일 경우에만 스크롤을 숨길 수 있습니다.쓰고 있으니까document.body.style.overflow = 'hidden'
…에.componentDidMount
이 컴포넌트는 본체에 스크롤을 숨기는 라이프 사이클 메서드를 호출하는 마운트되어 있습니다.
export class Modal extends React.Component {
constructor(props) {
super(props);
this.state = {
open:false
}
}
componentDidMount() {
if(this.state.open){
document.body.style.overflow = 'hidden';
}
}
componentWillUnmount() {
document.body.style.overflow = 'unset';
}
render() {
return (
<React.Fragment>
{this.props.showAt ?
this.props.show ?
<div style={style} className={`${this.props.sectionName} ${modalTypeStyle ? modalTypeStyle : styles.modalWhite} ${modalTypeSize ? modalTypeSize : styles.modalSmall} ${!this.props.showAt ? styles.modalWhiteFixed : ""}`}>
{this.props.arrowShape ? <div className={arrowTypeStyle ? arrowTypeStyle : styles.triangleToprightWhite} /> : null}
{this.props.children}
</div>
: null
:
this.props.show ?
<div className={`${this.props.className} ${styles.modal}`}>
<div style={style} className={`${this.props.sectionName} ${modalTypeStyle ? modalTypeStyle : styles.modalWhite} ${modalTypeSize ? modalTypeSize : styles.modalSmall} ${!this.props.showAt ? styles.modalWhiteFixed : ""}`}>
{this.props.arrowShape ? <div className={arrowTypeStyle ? arrowTypeStyle : styles.triangleToprightWhite} /> : null}
{this.props.children}
</div>
</div> :
null}
</React.Fragment>
)
}
}
마운트 또는 마운트 해제 시 기능 구성 요소에서
useEffect(() => {
document.body.style.overflow = 'hidden';
return ()=> document.body.style.overflow = 'unset';
}, []);
또는 언제show
변화나 기타
useEffect(() => {
show && document.body.style.overflow = 'hidden';
!show && document.body.style.overflow = 'unset';
}, [show ]);
다음은 기능 컴포넌트에 사용할 수 있는 커스텀훅입니다.
import { useEffect } from 'react';
export const useDisableBodyScroll = (open) => {
useEffect(() => {
if (open) {
document.body.style.overflow = 'hidden';
} else {
document.body.style.overflow = 'unset';
}
}, [open]);
};
export const Modal = (props) => {
useDisableBodyScroll(props.show);
return (
<React.Fragment>
{props.showAt ?
props.show ?
<div style={style} className={`${props.sectionName} ${modalTypeStyle ? modalTypeStyle : styles.modalWhite} ${modalTypeSize ? modalTypeSize : styles.modalSmall} ${!props.showAt ? styles.modalWhiteFixed : ""}`}>
{props.arrowShape ? <div className={arrowTypeStyle ? arrowTypeStyle : styles.triangleToprightWhite} /> : null}
{props.children}
</div>
: null
:
props.show ?
<div className={`${props.className} ${styles.modal}`}>
<div style={style} className={`${props.sectionName} ${modalTypeStyle ? modalTypeStyle : styles.modalWhite} ${modalTypeSize ? modalTypeSize : styles.modalSmall} ${!props.showAt ? styles.modalWhiteFixed : ""}`}>
{props.arrowShape ? <div className={arrowTypeStyle ? arrowTypeStyle : styles.triangleToprightWhite} /> : null}
{props.children}
</div>
</div> :
null}
</React.Fragment>
)
}
}
나는 이것을 처리할 수 있는 두 가지 기능이 있다, 모달 열 때와 닫힘 모달 열 때
openModal(){
this.setState({
isModalOpen: true
})
document.body.style.overflow = 'hidden';
}
closeModal(){
this.setState({
isModalOpen: false
})
document.body.style.overflow = 'unset';
}
스크롤 숨김/표시 때문에 브라우저가 이동하는 경우 기능 컴포넌트.
useEffect(() => {
if (show) {
document.body.style.overflow = 'hidden';
document.body.style.paddingRight = '15px';
}
return () => {
document.body.style.overflow = 'unset';
document.body.style.paddingRight = '0px';
};
}, [show]);
나는 쇼의 쇼를 확인할 때 효과가 있다.기능 컴포넌트의 예
useEffect(() => {
if (show) document.body.style.overflow = 'hidden';
else document.body.style.overflow = 'visible';
}, [show]);
Mehran Motie's에 따라 시도했지만 쿠키 동의를 닫을 때마다 바디스타일이 지워집니다.그래서 대신 수업목록을 추가해봤더니 잘 되더라.
React.useEffect(() => {
if (show) document.body.classList.add('overflow-hidden');
else document.body.classList.remove('overflow-hidden');
}, [show]);
다음 클래스를 모달 포함 div에 추가할 수도 있습니다.
.modal {
position: fixed;
}
여기서 중요한 것은 사용자를 페이지 아래로 스크롤하여 모달(modal)을 트리거하고 모달(modal)을 스크롤하지 않은 경우와 마찬가지로 중앙에 표시되도록 할 수 있다는 것입니다.
언급URL : https://stackoverflow.com/questions/54989513/react-prevent-scroll-when-modal-is-open
'programing' 카테고리의 다른 글
새 봄 MVC 프로젝트를 위한 Tymeleaf와 Angular 중 선택 (0) | 2023.03.23 |
---|---|
Angular에서 $scope 액세스JS 공장? (0) | 2023.03.23 |
실패한 폼 propType: "onChange" 핸들러가 없는 폼 필드에 "값" 프로포트를 제공했습니다. (0) | 2023.03.23 |
주석을 사용하지 않는 잭슨의 필드를 제외하려면 어떻게 해야 합니까? (0) | 2023.03.23 |
Woocommerce : 모든 제품 업데이트 기능 (0) | 2023.03.23 |