vue2使用transition过渡效果时,样式发生错误,过渡结束后,样式正确显示

发布于 2022-09-05 09:55:27 字数 3435 浏览 25 评论 0

问题

因为业务要求,我自己写了一个popup组件,在需要用户确认的地方调用显示,为了提升体验,所以想给popup增加淡入淡出的效果,于是用了animate.css和transition组件,但是在过渡过程中发生了样式错误,具体看下图:
图片描述

过渡完成后,正确显示:
图片描述

尝试

一开始,我认为可能是z-index的问题,但是尽管我把z-index调到100000,还是没有正确显示,而且过渡结束之后,是能正确显示的,说明z-index的设置没有问题。

同样的问题

其实我之前还写了一个toast,并且用了css3的transform(-50%,-50%)结合fixed定位,让toast在页面垂直居中显示,那时候同样想添加一个淡入弹出的效果,但是也发生了同样的问题,在过渡时,transform(-50%,-50%)没有奇效,导致toast的左上角的坐标为屏幕中心,而不是整体垂直居中,过渡结束后才回到正确的位置。

猜测

1、过渡效果会把某些css属性失效
2、过渡效果的时间点在某些css绑定属性之前

代码

    <!--popup-->
    <transition mode="out-in" enter-active-class="animated fadeIn" leave-active-class="animated fadeOut">
        <div class="popup-wrap" v-show="show">
            <div class="modal">
                <div class="popup">
                    <p class="title"><span>{{title}}</span><i @click="$emit('update:show',false)" class="iconfont icon-cuo"></i></p>
                    <p v-if="message_show" class="message">{{message}}</p>
                    <slot></slot>
                    <div class="btn-group">
                        <span @click="$emit('update:show',false)" class="cancel">取消</span>
                        <span @click="$emit('sure')" class="sure">确定</span>
                    </div>
                </div>
            </div>
        </div>
    </transition>

<style scoped lang="less">
    .popup-wrap {
        animation-duration: .5s;
        animation-timing-function:ease;
    }
    
    .modal {
        top: 0;
        left: 0;
        z-index: 1000;
        position: fixed;
        height: 100vh;
        width: 100vw;
        background: rgba(0, 0, 0, 0.7);
        display: flex;
        justify-content: center;
        align-items: center;
    }
    
    .popup {
        display: flex;
        flex-direction: column;
        background: white;
        padding: 0 1.5rem;
        min-width: 60vw;
        .title {
            font-size: 1.6rem;
            height: 10vw;
            display: flex;
            justify-content: space-between;
            align-items: center;
            width: 100%;
            font-weight: bold;
            & > i {
                font-size: 2rem;
                color: #cccccc;
            }
        }
        .message {
            padding: 1rem 0 2rem 0;
            font-size: 1.8rem;
        }
        .btn-group {
            font-size: 1.5rem;
            display: flex;
            width: 100%;
            margin-bottom: 1rem;
            justify-content: flex-end;
            & > span {
                display: flex;
                justify-content: center;
                align-items: center;
                padding: 0.3rem 1.5rem;
                color: white;
                background: #FF5555;
                border-radius: 4px;
            }
            .cancel {
                margin-right: 1rem;
                color: #FF5555;
                background: white;
                border: 1px solid #ff5555;
            }
        }
    }
</style>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

司马昭之心 2022-09-12 09:55:28

是刚开始modal隐藏,popup-wrap没有高度导致的,可以去掉popup-wrap将 v-show="show"放在modal上,另外建议
transition上不要写animated,放在用 v-show="show"上的元素上好点

<div class="modal animated" v-show="show">
                        <div class="popup "></div>
</div>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文