javascript - 为什么内联元素底部有额外的边距?

标签 javascript jquery html css

我有以下测试页面。基本上,它在鼠标下方的元素周围绘制边框,并在元素的左下角显示工具提示。对于 block 元素来说,没有问题。

enter image description here

但是对于内联元素,突出显示的元素和工具提示之间始终存在间隙。

enter image description here

我尝试为这些内联元素添加 0 边距,但无济于事。有人能帮忙指出正确的方向吗? 为了使调试更容易,我创建了这个 codepen 帖子:https://codepen.io/ogrishman/pen/gObMNWa

var tip = jQuery("<div id='tip' style='display:none;'></div>");
tip.appendTo("body");
jQuery("*").on("mouseover", function (event) {
    event.stopPropagation();
    var thisj = jQuery(this);
    var thisj_pos = thisj.offset();

    thisj.css("border", "2px solid red");
    tip.text(thisj.prop("tagName"));

    $("#tip").css({
        "top": thisj_pos.top + thisj.outerHeight(),
        "left": thisj_pos.left,
        display: "block"
    });
}).on("mouseout", function (event) {
    event.stopPropagation();
    jQuery(this).css("border", "")
});
#b {
  width: 200px;
  height: 200px;
  background: #0fa3e0;
  border: 10px solid grey;
  position: absolute;
  top: 50px;
  left: 100px;
}

#s {
  width: 50px;
  height: 50px;
  background: #ff0000;
  border: 10px solid gold;
  position: absolute;
}

#tip {
  border-radius: 0 0 5px 5px;
  border: 2px solid #000000;
  background-color: #fdf0ca;
  position: absolute;
  color: #000000;
  padding: 3px;
}
<div id="b"></div>
<div id="s"></div>
<div style="position: absolute; top: 300px;">
    <a href="#">Test anchor 1</a>
    <a href="#">Test anchor 2</a>
    <a href="#">Test anchor 3</a>
    <a href="#">Test anchor 4</a>
    <a href="#">Test anchor 5</a>
    <br />
    <span>Test span 1</span>
    <span>Test span 2</span>
    <span>Test span 3</span>
    <span>Test span 4</span>
    <span>Test span 5</span>
    <br />
    <p>test paragraph 1</p>
    <p>test paragraph 2</p>
    <p>test paragraph 3</p>
    <p>test paragraph 4</p>
    <p>test paragraph 5</p>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

最佳答案

这是因为您在获取元素的偏移量后应用边框。由于当涉及内联元素时,边框顶部/底部不会影响布局,因此它不会将元素向下推,并且您将得到一个与边框顶部厚度完全相同的间隙。

之前添加边框以获得正确的偏移并解决问题:

var tip = jQuery("<div id='tip' style='display:none;'></div>");
tip.appendTo("body");
jQuery("a").on("mouseover", function(event) {
  event.stopPropagation();
  var thisj = jQuery(this);
   thisj.css("border", "5px solid red");
  var thisj_pos = thisj.offset();

  tip.text(thisj.prop("tagName"));

  $("#tip").css({
    "top": thisj_pos.top + thisj.outerHeight(),
    "left": thisj_pos.left,
    display: "block"
  });
}).on("mouseout", function(event) {
  event.stopPropagation();
   jQuery(this).css("border", "")
});
#tip {
  border-radius: 0 0 5px 5px;
  border: 2px solid #000000;
  background-color: #fdf0ca;
  position: absolute;
  color: #000000;
  padding: 3px;
}
<a href="#" >Test j anchor 1</a>
<a href="#" >Test anchor 2</a>
<a href="#" >Test anchor 3</a>
<a href="#" >Test anchor 4</a>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

下面是一个代码,可以更好地说明问题:

var tip = jQuery("<div id='tip' style='display:none;'></div>");
tip.appendTo("body");
jQuery("a.before").on("mouseover", function(event) {
  event.stopPropagation();
  var thisj = jQuery(this);
   thisj.css("border", "10px solid red");
  var thisj_pos = thisj.offset();

  tip.text(thisj.prop("tagName"));
  console.log(thisj_pos.top)
  $("#tip").css({
    "top": thisj_pos.top + thisj.outerHeight(),
    "left": thisj_pos.left,
    display: "block"
  });
}).on("mouseout", function(event) {
  event.stopPropagation();
   jQuery(this).css("border", "")
});
jQuery("a.after").on("mouseover", function(event) {
  event.stopPropagation();
  var thisj = jQuery(this);
  var thisj_pos = thisj.offset();
   thisj.css("border", "10px solid red");

  tip.text(thisj.prop("tagName"));
 console.log(thisj_pos.top)
  $("#tip").css({
    "top": thisj_pos.top + thisj.outerHeight(),
    "left": thisj_pos.left,
    display: "block"
  });
}).on("mouseout", function(event) {
  event.stopPropagation();
   jQuery(this).css("border", "")
});
#tip {
  border-radius: 0 0 5px 5px;
  border: 2px solid #000000;
  background-color: #fdf0ca;
  position: absolute;
  color: #000000;
  padding: 3px;
}

a {
 margin: 0 10px;
}
<a href="#" class="before">inline element</a>
<a href="#" class="after">inline element</a>
<a href="#" class="before" style="display:inline-block;">inline block element</a>
<a href="#" class="after" style="display:inline-block;">inline block element</a>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

可以清楚地看到,当你添加border unline inline-block(或block)元素时,内联元素不会向下移动。使用 inline-block 在之前或之后添加边框不会产生任何影响,因为元素将始终具有相同的 top 值,但添加边框后内联元素将具有不同的 top 值:

关于javascript - 为什么内联元素底部有额外的边距?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59323355/

相关文章:

javascript - 向图表添加垂直线

javascript - jQuery 验证表单(检查至少 10 个字符和特定值)

javascript - 跨度元素更改事件

javascript - 从标签输入中获取值到 Twitter typeahead js

javascript - window.scrollTo 在 iOS chrome 中不起作用

php - 一个网站上有三个 Google Analytics 代码?

javascript - 如何从 localhost url 读取图像并在 javascript 中获取其宽度和高度

html - 在 x 属性上显示带有转换的隐藏 div

html - 无法覆盖按钮的引导事件类

javascript - Angular 指令 - 如果未设置范围怎么办?