【问题标题】: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 在响应式网页设计中描述的技术,在这种技术中,一切都相互缩小,如果使用边框,我会不走运吗?

干杯!

【问题讨论】:

    标签: css fluid-layout responsive-design


    【解决方案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% 左右(使用确切的数字来找到适合您设计的边框)。

          【讨论】:

          • 谢谢你 - 我真的很想避免这样做,但如果我遇到它至少有一个修复。另一种稍微笨拙的方法是为边框设置多个背景图像,但目前这不是跨浏览器。
          • 是的,多背景在旧版浏览器中无法使用;但是,它不会像使用边框框那样破坏任何东西。所以也许这是一个很好的优雅降级选项。
          猜你喜欢
          • 1970-01-01
          • 2012-06-19
          • 2013-08-11
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          • 2013-05-22
          相关资源
          最近更新 更多