javascript - 如何将绝对定位的 div 水平居中于其相对定位的父级之上?

标签 javascript html css

我有一个语音气泡类,它具有动态大小并且绝对定位。我希望它始终水平居中在其相对定位的父元素之上,无论语音气泡的大小是多少。我希望它看起来像这样(其中字母“O”是相对定位的父元素):

enter image description here

目前,如果我将 left 属性设置为 0,则效果如下:

enter image description here

如果我能保证气泡的大小是固定的,这是一个很容易解决的问题,但它绝对不是。我无法通过在具有 bubble 类的元素上设置 widthleftmargin-left 来解决此问题。它需要比这更强大。

如果有的话,我更喜欢 css 解决方案。但是,如果唯一的解决方案是 JavaScript,我也会考虑这一点。

这就是代码的样子。请注意,smart-bubble-wrapper 上的边距并不是真正需要的,它们的存在只是为了让您可以在代码示例中看到气泡:

.bubble-wrapper {
  position: relative;
  margin-top: 100px;
  margin-left: 100px;
}

.bubble {
  display: block;
  position: absolute;
  padding: 10px;
  background: #FFFFFF;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  border: solid 1px #bababf;
  box-shadow: 0px 0px 5px #6bcded;
  left: 0;
  color: #333333;
}

.bubble-bottom {
  bottom: 30px;
}

.bubble-middle-after {
  left: calc(50% - 8px);
}

.bubble-middle-before {
  left: calc(50% - 10px);
}

.bubble-bottom-before {
  bottom: -8px;
}

.bubble-bottom-after {
  bottom: -12px;
  border-width: 12px 12px 0;
  border-style: solid;
  border-color: #FFFFFF transparent;
}

.bubble-after {
  content: '';
  position: absolute;
  display: block;
}

.bubble-before {
  content: '';
  position: absolute;
  border-style: solid;
  border-color: #bababf;
  border-width: 13px 13px 0;
  background-color: white;
  display: block;
  box-shadow: 0px 0px 5px #6bcded;
  width: 0px;
  height: 10px;
  z-index: -1;
  transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
}
<div class="bubble-wrapper">
  O
  <div class="bubble bubble-middle bubble-bottom" arrow-horizontal="middle" arrow-vertical="bottom">
    <div class="bubble-before bubble-middle-before bubble-bottom-before"></div>
    <span class="ng-scope">How do I center this bubble</span>
    <div class="bubble-after bubble-middle-after bubble-bottom-after"></div>
  </div>
</div>

最佳答案

你可以使用

  1. 选择足够大的长度x
  2. left设置为某个负值-x
  3. right 设置为 calc(100% - x)
  4. 假设x足够大,绝对定位的元素将在左侧居中。
  5. 但其宽度将为2*x。使用 width: fit-contentwidth: max-content 来修复此问题。
  6. 但现在它受到过度限制。将 margin-leftmargin-right 设置为 auto 以保持居中。

例如,选择x = 100%

left: -100%;
right: 0;
width: fit-content; /* may need vendor prefixes */
margin: 0 auto;

.bubble-wrapper {
  position: relative;
  margin-top: 100px;
  margin-left: 100px;
}
.bubble {
  display: block;
  position: absolute;
  padding: 10px;
  background: #FFFFFF;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  border: solid 1px #bababf;
  box-shadow: 0px 0px 5px #6bcded;
  color: #333333;

  left: -100%;
  right: 0;
  width: -webkit-fit-content;
  width: -moz-fit-content;
  width: fit-content; /* may need vendor prefixes */
  margin: 0 auto;
}
.bubble-bottom {
  bottom: 30px;
}
.bubble-middle-after {
  left: calc(50% - 8px);
}
.bubble-middle-before {
  left: calc(50% - 10px);
}
.bubble-bottom-before {
  bottom: -8px;
}
.bubble-bottom-after {
  bottom: -12px;
  border-width: 12px 12px 0;
  border-style: solid;
  border-color: #FFFFFF transparent;
}
.bubble-after {
  content: '';
  position: absolute;
  display: block;
}
.bubble-before {
  content: '';
  position: absolute;
  border-style: solid;
  border-color: #bababf;
  border-width: 13px 13px 0;
  background-color: white;
  display: block;
  box-shadow: 0px 0px 5px #6bcded;
  width: 0px;
  height: 10px;
  z-index: -1;
  transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
}
<div class="bubble-wrapper">
  O
  <div class="bubble bubble-middle bubble-bottom" arrow-horizontal="middle" arrow-vertical="bottom">
    <div class="bubble-before bubble-middle-before bubble-bottom-before"></div>
    <span class="ng-scope">How do I center this bubble</span>
    <div class="bubble-after bubble-middle-after bubble-bottom-after"></div>
  </div>
</div>

对于不支持width: fit-content的浏览器,您可以添加一个内联 block 内部包装器,可以使用text-align: center居中.

.bubble-wrapper {
  position: relative;
  margin-top: 100px;
  margin-left: 100px;
}
.bubble {
  display: block;
  position: absolute;
  left: -100%;
  right: 0;
  text-align: center;
  margin: 0 auto;
}
.bubble-inner-wrapper {
  position: relative;
  display: inline-block;
  vertical-align: middle;
  padding: 10px;
  background: #FFFFFF;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  border: solid 1px #bababf;
  box-shadow: 0px 0px 5px #6bcded;
  color: #333333;
}
.bubble-bottom {
  bottom: 30px;
}
.bubble-middle-after {
  left: calc(50% - 8px);
}
.bubble-middle-before {
  left: calc(50% - 10px);
}
.bubble-bottom-before {
  bottom: -8px;
}
.bubble-bottom-after {
  bottom: -12px;
  border-width: 12px 12px 0;
  border-style: solid;
  border-color: #FFFFFF transparent;
}
.bubble-after {
  content: '';
  position: absolute;
  display: block;
}
.bubble-before {
  content: '';
  position: absolute;
  border-style: solid;
  border-color: #bababf;
  border-width: 13px 13px 0;
  background-color: white;
  display: block;
  box-shadow: 0px 0px 5px #6bcded;
  width: 0px;
  height: 10px;
  z-index: -1;
  transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
}
<div class="bubble-wrapper">
  O
  <div class="bubble bubble-middle bubble-bottom" arrow-horizontal="middle" arrow-vertical="bottom">
    <div class="bubble-inner-wrapper">
      <div class="bubble-before bubble-middle-before bubble-bottom-before"></div>
      <span class="ng-scope">How do I center this bubble</span>
      <div class="bubble-after bubble-middle-after bubble-bottom-after"></div>
    </div>
  </div>
</div>

关于javascript - 如何将绝对定位的 div 水平居中于其相对定位的父级之上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36925925/

相关文章:

javascript - 如何在javascript中基于字符串数组创建嵌套数组?

php - 根据从数据库中动态加载的图像更改 DIV 大小

javascript - 为什么我无法获取 $sceProvider?

html - 使用 Zurb foundation 4 在导航栏中为站点标题/ Logo 添加图像/图标

javascript - 在浏览器滚动之前滚动不可见元素

javascript - 将 html 渲染到 View MVC

html - 仅选择 xpath 列表中的元素

html - 位置 : fixed Background DIV with images makes scrolling slow: How to make conditional CSS rules for browser-compatibility?

javascript - <IMG> 不保持内联 - Javascript

html - anchor 标签不起作用