javascript - 如何防止绝对定位的弹出窗口从其容器中剪出?

标签 javascript html css

function myclick() {
  let node = document.createElement("div");
  node.className = "popover";
  node.innerText = "hello world hello world";
  event.srcElement.appendChild(node);
}
.container {
  width: 230px;
  height: 200px;
  border: 1px solid #ddd;
  display: flex;
  flex-flow: wrap;
}

.tag {
  border: 1px solid #ddd;
  padding: 5px;
  margin: 5px;
  display: flex;
  height: 20px;
  position: relative;
}

.popover {
  position: absolute;
  top: 30px;
  width: 60px;
  left: 0px;
  background-color: #dfdfdf;
}
<div class="container">
  <div class="tag" onclick="myclick();">apple</div>
  <div class="tag" onclick="myclick();">banana</div>
  <div class="tag" onclick="myclick();">carrot</div>
  <div class="tag" onclick="myclick();">dog</div>
  <div class="tag" onclick="myclick();">elephant</div>
  <div class="tag" onclick="myclick();">firetruck</div>
</div>

我已经完全重现了我面临的上述问题。基本上,当您单击标签时,我会从标签中显示弹出窗口。这一切都完美无缺,除非标签靠近其容器的边缘。在这种情况下,标签会从容器中剪出。在提供的示例中,如果您单击“dog”,则弹出窗口将剪辑在 container div 之外。

相反,我希望弹出窗口尽可能向左移动,以防止其自身从容器中剪出。我已经弄乱了一段时间,但我不太清楚如何完成它。

最佳答案

你可以试试这个。我添加了一个名为 onEdge 的 javascript 函数,用于检测子元素与边缘的距离。这可能需要根据您的需要进行修改(例如设置与您认为“太近”的 parent 边缘的距离)。

function onEdge(child) {
  if (child.parentElement.offsetWidth < (child.offsetLeft + child.offsetWidth))
    return true;
  return false;
}

function myclick(elm) {
  var addClass = onEdge(elm);

  let node = document.createElement("div");
  node.className = "popover" + (addClass ? " right" : "");
  node.innerText = "hello world hello world";
  event.srcElement.appendChild(node);
}
.container {
  width: 230px;
  height: 200px;
  border: 1px solid #ddd;
  display: flex;
  flex-flow: wrap;
}

.tag {
  border: 1px solid #ddd;
  padding: 5px;
  margin: 5px;
  display: flex;
  height: 20px;
  position: relative;
}

.popover {
  position: absolute;
  top: 30px;
  width: 60px;
  left: 0px;
  background-color: #dfdfdf;
}

.popover.right {
  left: auto;
  right: 0;
}
<div id="tag-container" class="container">
  <div class="tag" onclick="myclick(this);">apple</div>
  <div class="tag" onclick="myclick(this);">banana</div>
  <div class="tag" onclick="myclick(this);">carrot</div>
  <div class="tag" onclick="myclick(this);">dog</div>
  <div class="tag" onclick="myclick(this);">elephant</div>
  <div class="tag" onclick="myclick(this);">firetruck</div>
</div>

关于javascript - 如何防止绝对定位的弹出窗口从其容器中剪出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63726744/

相关文章:

html - IE8 中的页脚问题

当 html 和 body 自动溢出时,jquery scrollTop 不起作用

html - 在图像上放置文本似乎会使导航中的链接消失( float 相对冲突?)

html - 将轮播高度调整为图像高度(响应式)

javascript - Polymer DOM-根据接收到的数据重复内容

javascript - 如何在 notepad++ 中为 .html 文件中的 javascript 添加自动完成功能?

javascript - 如何用 DOM 中下一个 img src 替换 div 背景?

Javascript:动态创建带有文本的表格列标题

javascript - 为什么必须使用 Reactjs 中的类组件调用 useCallback 选项?

javascript - 模态防止点击外部无法使用javascript