TippyJS 工具提示的位置很奇怪,但在滚动页面或调整 window 大小后正确显示
TippyJS tooltip is positioned weird but shows correctly after scrolling the page or resizing the window
我正在使用 TippyJS 来显示工具提示,但由于某些原因,当第一次单击工具提示时,它的位置太靠右了,如果你的屏幕很小,它甚至会超出视野。
示例:
在我稍微滚动或调整页面大小后,它会正确定位。
示例:
是什么导致了这种行为?
代码笔示例(购物车为空但在 clicking/scrolling 时仍然具有相同的行为):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);
}
});
});
但这并没有改变什么。
问题出在onShow函数上。您的代码的工作方式是首先打开弹出窗口,然后执行 ajax 调用并获取一些 html 以附加到 tippy 框中。那时,tippy box 已经渲染并计算了宽度为 0 高度为 0 的盒子的位置。然后 ajax 调用完成,容器改变尺寸并最终出现在视口之外。
tippyjs 文档在这里用一个非常简洁的示例介绍了这一点:https://atomiks.github.io/tippyjs/v6/ajax/
正如 Stavros Angelis 指出的那样,在应用内容时已经计算了 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(您的示例使用的)has dropped this prop,因此可以在此处将其删除。
这里有更多关于 popper 实例的信息:https://github.com/atomiks/tippyjs/issues/191
我正在使用 TippyJS 来显示工具提示,但由于某些原因,当第一次单击工具提示时,它的位置太靠右了,如果你的屏幕很小,它甚至会超出视野。
示例:
在我稍微滚动或调整页面大小后,它会正确定位。
示例:
是什么导致了这种行为?
代码笔示例(购物车为空但在 clicking/scrolling 时仍然具有相同的行为):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);
}
});
});
但这并没有改变什么。
问题出在onShow函数上。您的代码的工作方式是首先打开弹出窗口,然后执行 ajax 调用并获取一些 html 以附加到 tippy 框中。那时,tippy box 已经渲染并计算了宽度为 0 高度为 0 的盒子的位置。然后 ajax 调用完成,容器改变尺寸并最终出现在视口之外。
tippyjs 文档在这里用一个非常简洁的示例介绍了这一点:https://atomiks.github.io/tippyjs/v6/ajax/
正如 Stavros Angelis 指出的那样,在应用内容时已经计算了 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(您的示例使用的)has dropped this prop,因此可以在此处将其删除。
这里有更多关于 popper 实例的信息:https://github.com/atomiks/tippyjs/issues/191