- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何移动 popper.js 元素以遵循特定的坐标?
我能够获得(我认为)文本区域中的插入符号位置,但现在我需要让 Popper.js 跟随它。
我在根目录和修改器中尝试了 update 和 onUpdate。我完全不理解文档。
我创建了一个 codepen 来展示到目前为止我能够实现的目标:
https://codepen.io/anon/pen/gzGvvG
const refEl = document.getElementById('ref');
const popEl = document.getElementById('pop');
new Popper(refEl, popEl, {
placement: 'auto',
modifiers: {
offset: {
enabled: true,
offset: '0,10'
},
flip: {
behavior: ['left', 'bottom', 'top']
},
preventOverflow: {
enabled: true,
padding: 10,
escapeWithReference: false,
}
},
});
document.getElementById("ref").onkeyup = function() {
var xy = getCursorXY(refEl, refEl.selectionEnd)
document.getElementById("log").innerText = `X: ${xy.x}, Y: ${xy.y}`;
}
我从 Medium 获得的 getcursorXY
函数:https://medium.com/@jh3y/how-to-where-s-the-caret-getting-the-xy-position-of-the-caret-a24ba372990a
最佳答案
这不是您问题的完整答案...因为它需要一些调整才能让它像我认为您正在努力让它工作的那样工作。但是,这是我从您的 CodePen 修改的 javascript,我相信这是朝着您希望实现的目标的正确方向迈出的一步。
const refEl = document.getElementById('ref');
const popEl = document.getElementById('pop');
function update_popper(x, y) {
new Popper(refEl, popEl, {
placement: 'auto',
modifiers: {
offset: {
enabled: true,
offset: (x - 150) + ',' + (-1 * (y - 140))
},
flip: {
behavior: ['left', 'bottom', 'top']
},
preventOverflow: {
enabled: true,
padding: 10,
escapeWithReference: false,
}
},
});
}
document.getElementById("ref").onkeyup = function () {
var xy = getCursorXY(refEl, refEl.selectionEnd)
document.getElementById("log").innerText = `X: ${xy.x}, Y: ${xy.y}`;
update_popper(xy.x, xy.y);
}
const getCursorXY = (input, selectionPoint) => {
const {
offsetLeft: inputX,
offsetTop: inputY,
} = input
// create a dummy element that will be a clone of our input
const div = document.createElement('div')
// get the computed style of the input and clone it onto the dummy element
const copyStyle = getComputedStyle(input)
for (const prop of copyStyle) {
div.style[prop] = copyStyle[prop]
}
// we need a character that will replace whitespace when filling our dummy element if it's a single line <input/>
const swap = '.'
const inputValue = input.tagName === 'INPUT' ? input.value.replace(/ /g, swap) : input.value
// set the div content to that of the textarea up until selection
const textContent = inputValue.substr(0, selectionPoint)
// set the text content of the dummy element div
div.textContent = textContent
if (input.tagName === 'TEXTAREA') div.style.height = 'auto'
// if a single line input then the div needs to be single line and not break out like a text area
if (input.tagName === 'INPUT') div.style.width = 'auto'
// create a marker element to obtain caret position
const span = document.createElement('span')
// give the span the textContent of remaining content so that the recreated dummy element is as close as possible
span.textContent = inputValue.substr(selectionPoint) || '.'
// append the span marker to the div
div.appendChild(span)
// append the dummy element to the body
document.body.appendChild(div)
// get the marker position, this is the caret position top and left relative to the input
const { offsetLeft: spanX, offsetTop: spanY } = span
// lastly, remove that dummy element
// NOTE:: can comment this out for debugging purposes if you want to see where that span is rendered
document.body.removeChild(div)
// return an object with the x and y of the caret. account for input positioning so that you don't need to wrap the input
return {
x: inputX + spanX,
y: inputY + spanY,
}
}
我在这里所做的是将您的 Popper() 移动到一个名为 update popper 的函数中,该函数每次都会使用新的 x,y 偏移重建新的 popper。您不必担心一遍又一遍地创建新的 Popper(),因为它主要只是数学运算,权重很小。
无论如何,我认为这应该可以帮助您更接近您的目标..祝您好运!
关于javascript - 如何更新 popper.js 元素的 x/y 位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50195866/
我在自定义下拉菜单中的项目上使用 popper.js(它不是 )。该站点使用 Bootstrap 4。 我的poppers看起来像这样,但我希望它溢出滚动容器之外: 我希望 poppers 出现在
如何将 popper 与刚刚发布的 Bootstrap 5 alpha 捆绑在一起? 最佳答案 Bootstrap 5,就像 v4 一样默认带有 JS 包 - Bootstrap JS + poppe
我正在学习使用此命令安装 popper 的教程:npm install popper --save .但是当我尝试它时收到此错误消息:fatal error - cygheap base mismat
我想给一个弹出框(工具提示)一个填充窗口。所以它对窗框有一个偏移量,而不是 stick at the edges 我试图通过添加 padding/ margin/ transparent border
我正在开发一个日历应用程序。 问题:单击 popper 的 popper 会关闭两个 popper,因为它会触发关闭它的第一个 popper 的 click outside 事件。 我有一个组件 使用
我正在使用 Material UI (v 4.9.5) Popper对于上面的“弹出”菜单。它是 anchorElement是选中的ListItem在左边。 我想要 Popper与主菜单顶部齐平。但是
Angular 和 Bootstrap 的新手,我正在尝试创建 helloworld 应用程序。我已经添加了所需的库,但我一直卡在这个错误中 Uncaught Error: Bootstrap dro
所以 Bootstrap 4 Beta 已经发布了……是的!但是,Tether 已被 Popper.js 替换为工具提示(和其他功能)。我看到控制台中抛出的错误足够快,可以告诉我对 Popper.js
当我为现有 React 项目输入命令 npm update 时,会显示以下内容: npm WARN deprecated popper.js@1.16.1: You can find the new
我尝试编辑 Tippy.js 的 CSS STLye。所以我 npm install tippy 并像这样将它导入我的 html 但是,它有一些错误。 Uncaught TypeError: Pop
我在 React 中构建了一个自定义 TreeView ,每个项目都包含一个使用 Popper 定位的下拉列表。由于子元素在渲染时不可见,因此 Popper 没有正确定位下拉列表,例如: 当树在 mo
由于依赖 jquery 3x,我在使用某些 ng-bootstrap 下拉组件时遇到问题,而 jquery 3x 又无法找到 popper.js 在我的控制台中查看此内容 Uncaught Error
我正在尝试将我的 javascript 文件移动到 Webpack。我对 Webpack 不太熟悉,所以我不确定我是否正确编码了其中的任何内容。我正在尝试加载 jquery-ui、popper 和 b
运行命令: npm install popper.js --save 将返回警告消息: npm WARN 已弃用 popper.js@1.16.1:您可以在 @popperjs/core 找到新的 P
我正在使用 Bootstrap,我希望使用下拉菜单。当我点击它时它不起作用,控制台中出现以下消息: Uncaught TypeError: Bootstrap dropdown require Pop
这似乎是一个蹩脚的问题,但我想不通。如何导入 Bootstrap 4 beta 自带的 popper.js? 我使用 Bower,并且安装了 Bootstrap 4 beta。现在在 bower_co
我刚刚升级到 Bootstrap 4 并实现了 Popper.js是一种依赖。我喜欢在本地托管库,因为我有时需要离线工作,但当我尝试离线使用它时,我收到错误消息 unexpected token ex
我目前在阻止我的工具提示离开 View 时遇到问题。 这是我创建工具提示实例的代码: // The '+'-Button as seen on the screenshots below const
我正在尝试制作下拉菜单,但出现此错误: "Uncaught Error: Bootstrap dropdown require Popper.js (https://popper.js.org)
我正在使用 Popper.js当单击具有类 .js-share-cf-btn 的元素时显示具有类 .js-share-cf-popover 的弹出元素。 但我希望仅当我在其外部单击时弹出窗 Eloqu
我是一名优秀的程序员,十分优秀!