inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex

모달 컴포넌트 등록

vue3 모달창 트랜지션

619

wooyeop Lee

작성한 질문수 1

1

<template>
    <transition appear name="modal">
        <div class="modal-mask">
            <div class="modal-wrapper">
              <div class="modal-container">

                <!-- Modal Header -->
                <div class="modal-header">
                  <slot name="header">
                      default header
                  </slot>
                </div>

                <!-- Modal Body -->
                <div class="modal-body">
                  <slot name="body">
                      default body
                  </slot>
                </div>

                <!-- Modal footer -->
                <!-- <div class="modal-footer">
                  <slot name="footer">
                      default footer
                      <button class="modal-default-button" @click="$emit('close')">
                        OK
                      </button>
                  </slot>
                </div> -->
              </div>
            </div>
        </div>
    </transition>
</template>

<style scoped>
.modal-mask {
  position: fixed;
  z-index: 9998;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  display: table;
  transition: opacity 0.3s ease;
}

.modal-wrapper {
  display: table-cell;
  vertical-align: middle;
}

.modal-container {
  width: 300px;
  margin: 0px auto;
  padding: 20px 30px;
  background-color: #fff;
  border-radius: 2px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.33);
  transition: all 0.3s ease;
  font-family: Helvetica, Arial, sans-serif;
}

.modal-header {
  margin-top: 0;
  color: #42b983;
}

.modal-body {
  margin: 20px 0;
}

.modal-default-button {
  float: right;
}

.modal-enter-from {
  opacity: 0;
}

.modal-leave-active {
  opacity: 0;
}

.modal-enter-from .modal-container,
.modal-leave-active .modal-container {
  -webkit-transform: scale(1.1);
  transform: scale(1.1);
}
</style>

vue3인데 모달창 띄울 때 애니매이션 효과가 잘 작동하는데 왜 닫을 때는 작동을 안하는 지 잘 모르겠어요

<AlertModal v-if="showModal" @close="showModal = false">
            <!--
            you can use custom content here to overwrite
            default content
            -->
            <template v-slot:header>
                <h3>경고! <span class="closeModalBtn" @click="showModal = false">x</span></h3>
            </template>
            <template v-slot:body>
                아무것도 입력하지 않으셨습니다.
            </template>
            <!-- <template v-slot:footer>
                copy right
            </template> -->
</AlertModal>

참고로 vue3에서는 slot을 template 태그 안에 v-slot으로 적어야 한다해서 이렇게 작성했어요

javascript vue.js es6 vuex

답변 2

0

캡틴판교

안녕하세요, 코드 상으론 문제 없어 보여요. AI 답변 확인해 보시겠어요? :)

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

우선 v-if는 조건이 false가 되는 순간 요소를 즉시 제거하기 때문에, Vue.js에서 모달창 닫기 시 애니메이션 효과가 작동하지 않는 이유로 생각됩니다. 트랜지션 효과가 보이려면 DOM에서 제거되기 전에 애니메이션이 실행될 수 있는 시간이 필요합니다.

대신 v-if대신 v-show를 사용하여 모달창 표시 상태를 제어하면, 요소는 계속 DOM에 남아있지만 보이거나 숨겨지는 형태가 됩니다. 이렇게 하면 트랜지션 효과가 정상적으로 작동할 수 있습니다.

또한, 트랜지션의 동작을 위해서는 modal-entermodal-leave 클래스명을 사용해야 합니다. 이미 modal-enter-frommodal-leave-active 스타일이 작성되어 있는데, name 속성 값인 “modal”에 따라 modal-enter-active, modal-enter-to, modal-leave-from, modal-leave-to 같은 클래스명을 사용해야 합니다.

모달이 닫힐 때도 트랜지션 효과가 작동하도록 하려면 다음과 같이 코드를 조정할 수 있습니다:

<AlertModal v-show="showModal" @close="showModal = false">
   <!-- 모달 콘텐츠 -->
</AlertModal>

그리고 <style> 내에 .modal-enter-active, .modal-leave-active 클래스를 아래와 같이 추가해주세요:

.modal-enter-active,
.modal-leave-active {
  transition: opacity 0.3s ease;
}
.modal-enter, .modal-leave-to /* .modal-leave-active in <2.1.8 */ {
  opacity: 0;
  transform: scale(1.1);
}

이렇게 수정하면 Vue 3에서 모달창이 닫힐 때도 애니메이션 효과가 잘 작동할 것입니다.

Chrome 개발자 모드 확장이 안됨

0

255

1

깃 권한 요청드립니다

0

118

1

vue.js 중급 리포지토리 권한 관련

0

118

1

vuex + axios 질문 있습니다!

1

198

2

깃 권한 요청드립니다!

0

161

1

강의 깃주소 문의

0

144

1

router-view에 props를 어떻게 넘길 수 있나요?

1

279

2

Vue가 인식되지 않는 현상

0

205

1

기초강좌는 어디있나요?

1

190

2

App.vue가 필요한 이유

0

192

1

getter가 정의되어 있지 않아 오류가 발생합니다.

1

253

1

뷰 라이프사이클

1

187

1

TSLint 말고 TSLint Vue 설치해도 되나요?

1

368

3

로컬 스토리지는 어디에 있나요?

1

279

1

vuex 실행시 새로고침해야지만 리스트에 나타나는 현상

1

387

2

export default 관련한 질문

0

354

2

깃허브 vue-todo 접근불가에 따른 확인요청

1

354

2

깃허브에 문제있는것 같습니다.

1

273

2

인프런 강의 재생 화면 구성 변경 문의드립니다

1

303

2

addTodo Helper 함수 적용

1

243

1

vuex 헬퍼 전역 설정

1

245

2

github 권한요청드립니다.

1

258

2

이벤트 위치에 대한 궁금증 입니다.

1

223

2

구조 차이에 대한 문의

1

345

2