html - "text-align: center;"不应该应用于绝对定位的元素,不对其子元素执行任何操作吗?

标签 html css css-position

我先让你看看代码,然后告诉你我的问题是什么:

Tinkerbin:http://tinkerbin.com/x8iGCFsZ

<style>
  div.container{
    height: 200px;
    width: 200px;
    background-color:red;
    margin-top: 10px;
  }

  div.subContainer{
    position: relative;
    text-align: center;
  }

  div.inner{
   position: absolute;
   background-color:yellow;
   width: 150px;
  }
</style>

<div class="container">
  <div class="subContainer">
    <div class="inner">bananas for breakfast</div>
  </div>
</div>

所以,根据课本,text-align: center; , 当应用于父元素时,仅在其子元素具有 display: inline; 时居中.

因此,如您所料,自从一个 <div>默认显示设置为阻止 ( display:block; ) text-align: center;应用于 parent div.subContainer不对它的 child 做任何事div.inner .

到目前为止一切都很好。没什么奇怪的。

当我尝试使用 <span> 时出现了我的问题, 而不是 <div>.inner 上元素,我将其绝对定位 ( position: absolute; ) — 如您所知,强制将显示从默认内联更改为 block 显示。

看看:

<style>
  div.container{
    height: 200px;
    width: 200px;
    background-color:red;
    margin-top: 10px;
  }

  div.subContainer{
    position: relative;
    text-align: center;
  }

  span.inner{
   position: absolute;
   background-color:yellow;
   width: 150px;
  }
</style>

<div class="container">
  <div class="subContainer">
    <span class="inner">bananas for breakfast</span>
  </div>
</div>

发生的事情很奇怪。尽管具有 block 的强制显示值(感谢 position: absolute; ),跨度仍然居中。更重要的是,居中实际上很奇怪。它采用 block 的左侧并将其与包含元素的中心对齐,而不是像往常一样将两个中心对齐。

当我在 span.inner 上手动设置显示时,行为是固定的 — 开始像 block 一样行事。阻止。

span.inner{
   position: absolute;
   display: block;
   background-color:yellow;
   width: 150px;
}

那么,这里发生了什么?绝对定位不强制改变显示 block 吗?为什么居中很奇怪?

最佳答案

当您将其设置为 position: absolute 时,它确实变成了一个 block ,但是它在它最初出现的地方从内容流中删除了。由于您没有使用 top , left , bottom , 和 right , 这更明显。

使用 <div>:默认情况下,一个分区是 block 级的,将占据整个可能的宽度。因此,默认情况下,它会从框的左侧开始并向右扩展。将其定位为 absolutely 会将其保持在左上角最初出现的位置,唯一明显的区别是框的宽度。

result-with-div

使用 <span>:默认情况下,span 是受 text-align 影响的内联元素。它的 parent 的属性(property)。文本光标从元素的中心 开始,随着文本的输入,字符被添加并重新居中以适应文本的宽度。当您从流中删除 span 时,它会从 text 开始的位置开始。文本光标位于元素的正中心(水平方向),因为现在实际父元素中没有文本。

result-with-span

您已经找到了解决方案:添加 display: block将强制该元素实际上是一个 block 级元素。事情是,仅仅因为 position: absolute “强制”此属性,它不是实际 属性,只是元素的计算 值。也就是说,只有在 CSS 定义中明确设置时,它才会应用于元素的位置。

关于html - "text-align: center;"不应该应用于绝对定位的元素,不对其子元素执行任何操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220202/

相关文章:

html - 当视口(viewport)垂直调整大小时,100% 高度的 Div 会变得比 100% 短

javascript - Jquery 完成回调倒计时

javascript - 在 Ruby on Rails 中包含 Trianglify

javascript - 如何在 HTML 表格中获得这样的布局

html - 为什么这个绝对定位的元素没有相对于它的容器定位?

jQuery Draggable 和 Resizable 冲突

javascript - 单击html超链接时如何用另一个替换一个div

javascript - 使用带有缩放透明元素的 jQuery 突出显示元素

jQuery, CSS - 缩小标题图像并在滚动时保持在顶部

computer-vision - 如果两个图像之间的变换已知,则找到相机位置之间的变换