我需要将 ul 水平居中,但使用 position:absolute、left 和 transform 会导致 width/margin 出现奇怪的行为

I need to horizontally center a ul but using position:absolute, left and transform is causing a weird behaviour on width/margin

我正在处理一个简单的多语言网页的语言导航。 在大视口上一切正常,但一旦我们减小视口的大小,宽度或边距就会发生一些奇怪的事情,不确定哪个受到影响,因为应该定义 none 但肯定是干扰。

编辑:奇怪的行为是 ul 过早开始中断。当它的宽度超过父级的 50% 而不是常规的 100% 时,它似乎会崩溃。造成它的是左和变换。位置和底部按预期工作。

如果我只显示它会更容易,所以我制作了一个 fiddle,只需压缩视口,您就会看到:

http://jsfiddle.net/ricardojcmarques/vrfvjmdr/

显然我需要 post 代码所以这里是 html:

<ul id="languageHolder">
    <li class="ColumnDevider">
        <svg x="0px" y="0px" width="2px" height="1px" viewBox="0 0 2 1">
             <rect x="0" y="0" fill="#000000" width="2" height="1"></rect>
         </svg>
    </li>
    <li class="Column">
        <a class="button" id="pt">Português</a>
    </li>
    <li class="ColumnDevider">
        <svg x="0px" y="0px" width="2px" height="1px" viewBox="0 0 2 1">
             <rect x="0" y="0" fill="#000000" width="2" height="1"></rect>
        </svg>
    </li>
    <li class="Column">
        <a class="button" id="es">Español</a>
    </li>
    <li class="ColumnDevider">
        <svg x="0px" y="0px" width="2px" height="1px" viewBox="0 0 2 1">
             <rect x="0" y="0" fill="#000000" width="2" height="1"></rect>
        </svg>
    </li>
    <li class="Column">
        <a class="button" id="de">Deutsch</a>
    </li>
    <li class="ColumnDevider">
        <svg x="0px" y="0px" width="2px" height="1px" viewBox="0 0 2 1">
             <rect x="0" y="0" fill="#000000" width="2" height="1"></rect>
        </svg>
    </li>
</ul>

和 css:

html,body,div,h1,h2,p,a,img,ul,li,form,label{
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}

html {
    font-size: 100%;
    -ms-text-size-adjust: 100%; 
    -webkit-text-size-adjust: 100%; 
}

body{
    line-height: 1;
    background: #FFFFFF;
    color: ##000000;
    padding:0;
    margin:30px
}

a:visited{
    color:#000000;
}

ul{
    padding:0;
    margin:0;
    list-style-type: none;
}

#languageHolder{
    list-style: none;
    position:absolute;
    bottom:30px;
    left:50%;
    transform: translateX(-50%);
    -ms-transform: translateX(-50%);
    -webkit-transform: translateX(-50%);
}

#languageHolder li{
    float:left;
    padding:0;
    height:18px;
}

.Column{
    text-align:center;
    font-family:"PTSans_Regular";
    margin:0 10px;
    cursor:pointer;
}

.ColumnDevider{
    background-color:#000000;
    background:#000000;
}

我不知道该多试试什么。欢迎提出任何建议。先谢谢了。

ps:objective是为了保持宽度动态,因为显示语言是根据几个因素动态显示的,以后可以添加更多语言。

我不确定我们是否理解对方,但是"something weird happend"意味着线开始断了,对吧?

所以,首先要简化一些事情 - 您不需要任何开发人员,为 li 标签使用边框。

<ul id="languageHolder">
    <li>
        <a class="button" id="pt">Português</a>
    </li>
    <li>
        <a class="button" id="es">Español</a>
    </li>
    <li>
        <a class="button" id="de">Deutsch</a>
    </li>
</ul>

而不只是更改 css(我用过你的,最后一个未更改的 css 用于 "ul")

#languageHolder{
    list-style: none;
    position:absolute;
    bottom:30px;
    left:50%;
    transform: translateX(-50%);
    -ms-transform: translateX(-50%);
    -webkit-transform: translateX(-50%);
     width: 100%;
    text-align: center;
}

#languageHolder li{
    height:18px;
    text-align:center;
    font-family:"PTSans_Regular";
    padding:0 10px; 
    cursor:pointer;
    border-right: 2px solid #000;
    display: inline-block;
}
#languageHolder li:first-child{
    border-left: 2px solid #000;
}

@media (max-width: 200px){ /*small sizes = set your "small size"*/
    #languageHolder li{
        border-left:0px !important;
        border-right:0px;
        display: block;
    }
}

媒体查询可帮助您针对某些 width/height 特定情况定制 css,在您的情况下它太窄了。现在边框消失了,项目不再浮动,所以一个放在另一个下面。

这里是 JSFIDDLE(更新):http://jsfiddle.net/kybernaut/pkeepkgd/2/

关于 CSS 变换的要点是它们是 视觉上的 变化...它们实际上并没有改变元素的物理位置。

因此,尽管该元素在视觉上位于中间,但浏览器会记住它的实际位置,并且当左侧到达父级边缘时,换行符开始出现。

为了解决这个问题,您应该通过将 white-space:nowrap; 添加到 ul 来禁用换行。

我也会为 inline-block 切换掉浮动,然后隐藏 "border" li 因为它们不会很好地破坏。

然后使用媒体查询(根据需要)将 li 分成一列。

html,body,
ul,
li {
  margin: 0;
  padding: 0;
  border: 0;
  font-size: 100%;
  font: inherit;
  vertical-align: baseline;
}
html {
  font-size: 100%;
  -ms-text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
}
body {
  line-height: 1;
  background: #FFFFFF;
  color: ##000000;
  padding: 0;
  margin: 30px
}
a:visited {
  color: #000000;
}
ul {
  padding: 0;
  margin: 0;
  list-style-type: none;
  background: lightblue;
}
#languageHolder {
  list-style: none;
  position: absolute;
  bottom: 30px;
  left: 50%;
  transform: translateX(-50%);
  -ms-transform: translateX(-50%);
  -webkit-transform: translateX(-50%);
  white-space: nowrap;
}
#languageHolder li {
  display: inline-block;
  padding: 0;
  height: 18px;
}
.Column {
  text-align: center;
  font-family: "PTSans_Regular";
  margin: 0 10px;
  cursor: pointer;
}
.ColumnDevider {
  background-color: #000000;
  background: #000000;
}
@media screen and (max-width: 480px) {
  #languageHolder li {
    display: block;
  }
  #languageHolder li.ColumnDevider {
    display: none;
  }
}
<ul id="languageHolder">
  <li class="ColumnDevider">
    <svg x="0px" y="0px" width="2px" height="1px" viewBox="0 0 2 1">
      <rect x="0" y="0" fill="#000000" width="2" height="1"></rect>
    </svg>
  </li>
  <li class="Column"> <a class="button" id="pt">Português</a>

  </li>
  <li class="ColumnDevider">
    <svg x="0px" y="0px" width="2px" height="1px" viewBox="0 0 2 1">
      <rect x="0" y="0" fill="#000000" width="2" height="1"></rect>
    </svg>
  </li>
  <li class="Column"> <a class="button" id="es">Español</a>

  </li>
  <li class="ColumnDevider">
    <svg x="0px" y="0px" width="2px" height="1px" viewBox="0 0 2 1">
      <rect x="0" y="0" fill="#000000" width="2" height="1"></rect>
    </svg>
  </li>
  <li class="Column"> <a class="button" id="de">Deutsch</a>

  </li>
  <li class="ColumnDevider">
    <svg x="0px" y="0px" width="2px" height="1px" viewBox="0 0 2 1">
      <rect x="0" y="0" fill="#000000" width="2" height="1"></rect>
    </svg>
  </li>
</ul>

JSfiddle Demo