css переход не работает после вызова jQuery функции, пытающейся изменить DOM - PullRequest
1 голос
/ 20 июня 2020

Я хочу делать игры Таро. Когда пользователь щелкает карточку, размер карточки масштабируется, а положение карточки перемещается в центр экрана. Поэтому я хочу добавить родительский div в элемент .flipping-card после события щелчка, вызвав функцию jQuery wrap (). Вот мой код js:

Прежде, чем я добавлю эту строку: $(this).wrap("<div class='h-modal-bg'></div>");

Эффект переворота карт Таро работает отлично. Но после добавления этой строки эффект перехода просто исчез. Может кто-нибудь сказать мне, что не так с этим кодом? Спасибо! (Когда вы запускаете мой код на фрагментах, лучше изменить размер экрана на мобильный

$(function() {
    $('.h-flipping-card').click(function(){
        $(this).toggleClass('card-flipped');
        $(this).closest('.card-frame').wrap("<div class='h-modal-bg h-modal-bg-show'></div>");
    });
});
*, *:before, *::after {
    -webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
}
.h-flipping-card {
    position: relative;
    width: 96%;
    height: 0;
    padding-bottom: 144%;
    display: block;
    margin: 0 auto;

    perspective: 1000px;
}
.h-flipping-card-content {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    transform-style: preserve-3d;

    transition: transform 0.8s;
}
.h-flipping-card-front, .h-flipping-card-back {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    border-radius: 18px;
    box-shadow: 2px 1px 15px #8A8A8A;
    
    -webkit-backface-visibility: hidden; 
            backface-visibility: hidden;
}
.h-flipping-card-front {
    transform: rotateY(180deg);
}
.h-flipping-card-back {
    background-color: brown;
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center;
}
.h-flipping-card-front[data-tarot-opt='demo1'] {
    background-color: orange;
    background-size: 130% auto;
    background-repeat: no-repeat;
    background-position: center;
}
.h-flipping-card.card-flipped .h-flipping-card-content {
    transform: rotateY(180deg);
}

.h-modal-bg {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(33, 33, 33, 0.48);
    z-index: 10000;
    visibility: hidden;
    display: flex;
    flex-direction: column;
    justify-content: center;
    opacity: 0;

    -webkit-transition: all 0.3s ease-out; 
            transition: all 0.3s ease-out;
    }
    .h-modal-bg-show {
        visibility: visible;
              opacity: 1;
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
    <div class="card-frame" style="max-width: 320px; width: 50%; display: inline-block;">
        <div class="h-flipping-card">
            <div class="h-flipping-card-content">
                <div class="h-flipping-card-back"></div>
                <div class="h-flipping-card-front" data-tarot-opt="demo1"></div>
            </div>
        </div>
    </div>
</div>

Ответы [ 2 ]

1 голос
/ 24 июня 2020

Это потому, что когда вы вызываете $.wrap(), ваш исходный элемент удаляется из DOM, а затем снова добавляется. При этом его вычисляемый стиль устанавливается непосредственно на тот, который установлен классом .card-flipped, и переходить больше нечего, поскольку для движка CSS он уже находится в этом перевернутом состоянии.

Вы можете см. этот связанный Q / A , который объясняет очень похожую ситуацию.

Таким образом, решение состоит в том, чтобы сначала обернуть ваш элемент, а затем принудительно выполнить перекомпоновку, чтобы движок CSS знал, какой текущий вычисленный стиль вашего элемента и, наконец, измените его класс, чтобы произошел переход.

$(function() {
    $('.h-flipping-card').click(function(){
        // first DOM manip
        $(this).closest('.card-frame').wrap("<div class='h-modal-bg h-modal-bg-show'></div>");
        document.body.offsetWidth; // force recalc
        $(this).toggleClass('card-flipped'); // now ask for transition
    });
});

$(function() {
    $('.h-flipping-card').click(function(){
        $(this).closest('.card-frame').wrap("<div class='h-modal-bg h-modal-bg-show'></div>");
        document.body.offsetWidth;
        $(this).toggleClass('card-flipped');
    });
});
*, *:before, *::after {
    -webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
}
.h-flipping-card {
    position: relative;
    width: 96%;
    height: 0;
    padding-bottom: 144%;
    display: block;
    margin: 0 auto;

    perspective: 1000px;
}
.h-flipping-card-content {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    transform-style: preserve-3d;

    transition: transform 0.8s;
}
.h-flipping-card-front, .h-flipping-card-back {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    border-radius: 18px;
    box-shadow: 2px 1px 15px #8A8A8A;
    
    -webkit-backface-visibility: hidden; 
            backface-visibility: hidden;
}
.h-flipping-card-front {
    transform: rotateY(180deg);
}
.h-flipping-card-back {
    background-color: brown;
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center;
}
.h-flipping-card-front[data-tarot-opt='demo1'] {
    background-color: orange;
    background-size: 130% auto;
    background-repeat: no-repeat;
    background-position: center;
}
.h-flipping-card.card-flipped .h-flipping-card-content {
    transform: rotateY(180deg);
}

.h-modal-bg {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(33, 33, 33, 0.48);
    z-index: 10000;
    visibility: hidden;
    display: flex;
    flex-direction: column;
    justify-content: center;
    opacity: 0;

    -webkit-transition: all 0.3s ease-out; 
            transition: all 0.3s ease-out;
    }
    .h-modal-bg-show {
        visibility: visible;
              opacity: 1;
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
    <div class="card-frame" style="max-width: 320px; width: 50%; display: inline-block;">
        <div class="h-flipping-card">
            <div class="h-flipping-card-content">
                <div class="h-flipping-card-back"></div>
                <div class="h-flipping-card-front" data-tarot-opt="demo1"></div>
            </div>
        </div>
    </div>
</div>
0 голосов
/ 21 июня 2020
• 1000 хотите обернуть только один раз при первом нажатии. Итак, я попробовал что-то одним щелчком мыши проверить это
$(function() {
    $('.h-flipping-card').click(function(){
        $(this).toggleClass('card-flipped');
    });
    $('.h-flipping-card').one("click", function(){
        $(this).closest('.card-frame').wrap("<div class='h-modal-bg h-modal-bg-show'></div>");
    });
});

Вот моя JSFiddle Link

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