我有一个语音气泡类,它具有动态大小并且绝对定位。我希望它始终水平居中在其相对定位的父元素之上,无论语音气泡的大小是多少。我希望它看起来像这样(其中字母“O”是相对定位的父元素):
目前,如果我将 left
属性设置为 0,则效果如下:
如果我能保证气泡的大小是固定的,这是一个很容易解决的问题,但它绝对不是。我无法通过在具有 bubble
类的元素上设置 width
或 left
或 margin-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>
最佳答案
你可以使用
- 选择足够大的长度
x
- 将
left
设置为某个负值-x
- 将
right
设置为calc(100% - x)
- 假设
x
足够大,绝对定位的元素将在左侧居中。 - 但其宽度将为
2*x
。使用width: fit-content
或width: max-content
来修复此问题。 - 但现在它受到过度限制。将
margin-left
和margin-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/