如何水平对齐'n'div与边距/填充?

时间:2013-02-04 21:08:43

标签: css html alignment

我有以下HTML:

 <div class="top_buttons">

    <div class="top_button">
        <img src="img/image1.png">
    </div>

    <div class="top_button">
        <a href="#">
            <img src="img/image2.png">
        </a>
    </div>

    <div class="top_button">
        <a href="#">
            <img src="img/image3.png">
        </a>
    </div>

</div>

以下CSS完美运行:

.top_buttons{

    width: 100%;
    height: auto;

    margin: 0 auto;

    overflow: hidden;
}

 .top_button{

     float: left;
     width: 33.333%;/*Because I have 3 images with the same width, I want each to have 1/3 of the total width space available (mobile website)*/
 }

当我想为内部div(即图像的父级)添加一些边距和/或填充时,问题就出现了。如果我为这些div添加边框/填充/边距,我设置的上述33.333%将不再起作用,因为显然每个“top_button”div不仅包含图像,而且还包含添加到div的边框/填充/边距。

所以,我的临时解决方案是将这个百分比降低到31%。但是,根据手机的不同,屏幕右侧会留下更多或更少的像素,因为我只想用百分比来猜测div与额外边框/填充/边距的长度。我想要的是一个解决方案,即使我将边框/填充/边距设置为内部div,我仍然可以使用33.333%,因此我可以使用像素完美的水平对齐。

简而言之,如何知道div还有边框/填充/边距并且我 <水平对齐'n'div / strong>知道“top_button * s *”div的总宽度(因为显示器的宽度因手机屏幕而异)。

3 个答案:

答案 0 :(得分:2)

您在问题中描述的当前标准盒型行为。如果定义宽度,则并不意味着元素只会与宽度值一样宽。而是填充等等。

为了实现更直观的行为,您需要一个备用的盒子模型。现在,如果你定义宽度,你真的可以定义所有可能的填充,边框等宽度。

以下CSS正是您需要的。请注意,此CSS将为所有元素启用备用框模型。你也可以只为你需要的元素定义它们,尽管你不必在一个项目中混淆两种不同的方法。

*, ::before, ::after {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

答案 1 :(得分:2)

使用box-sizing。 Box-sizing允许您添加填充和边框,而无需担心打破宽度。但是,保证金仍然会打破对齐。为了计算保证金,您需要从元素的宽度中减去边距量。

.top_button{
     float: left;
     width: 33.333%;
     -moz-box-sizing: border-box;      
     -webkit-box-sizing: border-box; 
     box-sizing: border-box; 
 }

答案 2 :(得分:0)

如果您遇到使用box-sizing的跨浏览器兼容性问题,可以选择其他方法。它需要为每个按钮添加一个额外的“内部”div,你可以应用你的边距。

HTML:

    <div class="top_button">
      <div class="top_button_contents">
        <a href="#">
          <img src="img/image2.png" /> some button text for testing
        </a>
      </div>
    </div>

CSS:

.top_button {
  float: left;
  width: 33.333%;
}

.top_button .top_button_contents {
  position:relative;
  margin:0px 10px 0px 0px;
  background-color:#CCC;
}

.top_button.last .top_button_contents {
 margin:0px;
}

这是jFiddle