Всплывающая подсказка TippyJS расположена странно, но отображается правильно после прокрутки страницы или изменения размера окна

#javascript #html #jquery #css #tippyjs

#javascript #HTML #jquery #css — код #tippyjs

Вопрос:

Я использую TippyJS для отображения всплывающей подсказки, но по какой-то причине при первом нажатии на всплывающую подсказку она располагается слишком сильно вправо, и если у вас маленький экран, он даже выйдет за пределы поля зрения.

Пример:

Вне экрана
Странное положение

В то время как после того, как я немного прокручиваю или изменяю размер страницы, она позиционируется правильно.

Пример:

введите описание изображения здесь

Что может быть причиной такого поведения?

Пример codepen (корзина пуста, но все равно ведет себя так же при нажатии / прокрутке): https://codepen.io/twan2020/pen/ZEBvYXv

Я попытался настроить boundary:viewport такие параметры, как:

 $( ".carttip" ).each(function( i ) {
    tippy(this, {
        theme: 'blue',
        trigger: 'click',
        allowHTML: true,
        animation: 'scale-subtle',
        maxWidth: 400,
        boundary: 'viewport',
        interactive: true,
        content: function (reference) {
            return reference.querySelector('.tooltipcontent');
        },
        onShow(instance) {
            refreshcart(true);
        }
    });
});
 

Но это ничего не меняло.

Ответ №1:

Как указывает Ставрос Анджелис, расположение экземпляра tippy уже вычисляется при применении содержимого. Чтобы изменить положение всплывающей подсказки при разрешении вызова ajax, вы можете передать экземпляр tippy в refreshcart() функцию, а затем получить доступ к экземпляру popper внутри него, чтобы обновить всплывающую подсказку:

 function refreshcart(force, tippyInstance) {
    $.ajax({
        type: 'post',
        url: 'includes/refreshcart.php',
        data: ({}),
        success: function(data){
            $('body #headercart').empty().append(data);
            tippyInstance.popperInstance.update(); // Here, the tippy positioning is updated
        }
    });
}

// other code...

$( ".carttip" ).each(function( i ) {
    tippy(this, {
        theme: 'blue',
        trigger: 'click',
        allowHTML: true,
        animation: 'scale-subtle',
        maxWidth: 400,
        boundary: 'viewport', // This has been dropped in tippy@6
        interactive: true,
        content: function (reference) {
            return reference.querySelector('.tooltipcontent');
        },
        onShow(instance) {
            refreshcart(true, instance);
        }
    });
});
 

Что касается boundary : похоже, что tippy @6 (который используется в вашем примере) отбросил эту опору, поэтому ее можно удалить здесь.

Подробнее об экземпляре popper здесь: https://github.com/atomiks/tippyjs/issues/191

Ответ №2:

Проблема возникает из-за функции OnShow. Способ работы вашего кода заключается в том, что сначала вы открываете всплывающее окно, затем выполняете вызов ajax и извлекаете некоторый HTML-код для добавления в поле tippy. В этот момент поле tippy уже отрисовало и рассчитало положение поля с шириной 0 и высотой 0. Затем вызов ajax завершается, и контейнер изменяет размеры и оказывается за пределами области просмотра.

Документация tippyjs описывает это здесь на очень понятном примере: https://atomiks.github.io/tippyjs/v6/ajax /