像素边框和比例宽度

Posted

技术标签:

【中文标题】像素边框和比例宽度【英文标题】:Pixel Border and Percentage width in Proportion 【发布时间】:2011-12-30 11:15:08 【问题描述】:

我想我可能已经知道了这个问题的答案,但我需要进行全面检查!

说我有

#gridtest
width:590px;

我可以使用 RESULT=TARGET/CONTEXT 将宽度更改为百分比。在这种情况下,上下文是一个最大宽度设置为 1000px 的容器,所以我可以这样做:

#gridtestpercent
width:59%; /*590/1000*/

如果我将窗口缩小,则 div 将始终与其容器成比例。但是如果我想做呢

#gridtest
width:570px;
border:10px solid red;

我可以根据现在的目标 570 来计算宽度,但是随着窗口的缩小,所有比例都会不同步。

#gridtestpercentnoborder
width:57%; /*570/1000*/
border:10px solid red;

我不能使用百分比边框。我不想使用 JS 继续检查上下文,我还不能使用 CSS3 box-border 声明。

如果我想使用 Ethan Marcotte 在响应式网页设计中描述的技术,在这种技术中,一切都相互缩小,如果使用边框,我会不走运吗?

干杯!

【问题讨论】:

【参考方案1】:

在 CSS3 中,您还可以使用新的 box-sizing 属性将像素和填充计数包含到元素的 width 中:

box-sizing: border-box;

【讨论】:

【参考方案2】:

接受的答案不正确。你实际上有两个选择:

使用box-sizing 属性,因此所有的内边距和边框都被视为大小的一部分:

.column 
    width: 16%;
    float: left;
    margin: 0 2% 0 2%;
    background: #03a8d2;
    border: 2px solid black;
    padding: 15px;
    font-size: 13px;

    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;

或者,使用outline 属性而不是边框​​属性。您仍然会遇到填充问题,但添加起来更容易。示例:

.column 
    width: 16%;
    float: left;
    margin: 0 2% 0 2%;
    background: #03a8d2;

    outline: 2px solid black;

完整解释:http://designshack.net/articles/css/beating-borders-the-bane-of-responsive-layout/

【讨论】:

这非常适合我正在做的事情 - 使用基于百分比的容器在移动视口上进行响应式设计。虽然我通常不使用 box-sizing 因为它不是最受支持的属性 - 它对于我需要它工作的平台上的流体容器来说足够好。完美!【参考方案3】:

如果可能,根据您的设计,我喜欢将边框设置为绝对 div,宽度为 3px(例如),高度高于其父 div。然后我在父 div 上设置溢出隐藏。

【讨论】:

【参考方案4】:

您可以使用 CSS3 calc() 函数,

.selector
  border: 5px solid black;
  width: -moz-calc(50% - 10px);
  width: -webkit-calc(50% - 10px);
  width: calc(50% - 10px);

SASS 混合

@mixin calc($property, $expression) 
  #$property: -moz-calc(#$expression);
  #$property: -webkit-calc(#$expression);
  #$property: calc(#$expression);

article 
  border: 1px solid red;
  @include calc( width, '100% - 2px')

【讨论】:

这太棒了!谢谢朋友的提示!【参考方案5】:

您可以使用插入框阴影代替边框:

box-shadow: 0px 0px 0px 10px red inset;

只需填充容器内部即可补偿。

编辑:我写的是“pad”,但当然,如果你使用 padding,它会抛弃盒子的尺寸。而是将内容放在里面。

【讨论】:

box-shadow 有性能开销,应谨慎使用 - 特别是在低端和移动设备上【参考方案6】:

如果你想保持语义,你可以使用div box-sizing:border-box; 或一些绝对定位的:after 元素。见帖子How do I add 1px border to a div whose width is a percentage?

【讨论】:

【参考方案7】:

很遗憾,是的,你运气不好。解决此问题的一种巧妙方法是使用包装器div 来创建边框。因此,外部div 将是 57%(在您的示例中),背景是您所需边框的颜色。然后,内部div 的宽度将达到 96% 左右(使用确切的数字来找到适合您设计的边框)。

【讨论】:

谢谢你 - 我真的很想避免这样做,但如果我遇到它至少有一个修复。另一种稍微笨拙的方法是为边框设置多个背景图像,但目前这不是跨浏览器。 是的,多背景在旧版浏览器中无法使用;但是,它不会像使用边框框那样破坏任何东西。所以也许这是一个很好的优雅降级选项。

以上是关于像素边框和比例宽度的主要内容,如果未能解决你的问题,请参考以下文章

移动端的1px边框问题

移动端1像素边框问题

泰山OFFICE技术讲座:叶边框影响底纹高亮宽度的原因及选择

泰山OFFICE技术讲座:叶边框影响底纹高亮宽度的原因及选择

边框和填充宽度javascript

移动端1像素边框问题