【问题标题】:How to set border's thickness in percentages?如何以百分比设置边框的粗细?
【发布时间】:2012-11-08 14:40:53
【问题描述】:

如何以百分比设置元素的边框宽度?我尝试了语法

border-width:10%;

但它不起作用。

我想以百分比设置border-width 的原因是我有一个带有width: 80%; 和height: 80%; 的元素,我希望该元素覆盖整个浏览器窗口,所以我想将所有边框设置为10%。我不是用两个元素的方法来做这个的,在这个方法中,一个元素位于另一个元素的后面并充当边框,因为元素的背景是透明的,将元素放在它后面会影响它的透明度。

我知道这可以通过 JavaScript 完成,但如果可能的话,我正在寻找一种纯 CSS 的方法。

【问题讨论】:

  • border-width 不支持百分比作为值。您可以使用 em、px、ex 等。但是为什么要将 border-width 设置为 10%?
  • 什么的百分比?这对于找到解决方法至关重要。简单的方法显然是错误的,因为那里不允许使用百分比。您可能需要设置一个辅助元素并使用背景,但细节取决于“什么的百分比?”问题的答案
  • 屏幕百分比。元素是绝对定位的,所以屏幕的百分比
  • @JukkaK.Korpela:是否存在百分比指的是定位容器以外的任何东西的情况?那为什么要问这个问题呢?
  • @PeeyushKushwaha,你确定你指的是屏幕(宽度),而不是窗口宽度吗?

标签: css


【解决方案1】:

边框不支持百分比...不过还是可以的...

正如其他人指出的CSS specification,边框不支持百分比:

'border-top-width',
'border-right-width',
'border-bottom-width',
'border-left-width'
  Value:          <border-width> | inherit
  Initial:        medium
  Applies to:     all elements
  Inherited:      no
  Percentages:    N/A
  Media:          visual
  Computed value: absolute length; '0' if the border style is 'none' or 'hidden'

您可以see 显示百分比:不适用。

非脚本解决方案

您可以使用包装元素模拟您的百分比边框:

  1. 将包装元素的 background-color 设置为您想要的边框颜色
  2. 以百分比形式设置包装器元素的padding(因为它们受支持)
  3. 将您的元素 background-color 设置为白色(或任何需要的颜色)

这会以某种方式模拟您的百分比边界。 Here's an example 使用此技术的具有 25% 宽度边边框的元素。

示例中使用的 HTML

.faux-borders {
    background-color: #f00;
    padding: 1px 25%; /* set padding to simulate border */
}
.content {
    background-color: #fff;
}
<div class="faux-borders">
    <div class="content">
        This is the element to have percentage borders.
    </div>
</div>

问题:您必须意识到,当您的元素应用了一些复杂的背景时,这将变得更加复杂......尤其是如果该背景是从祖先 DOM 层次结构继承的。但如果你的 UI 足够简单,你可以这样做。

脚本解决方案

@BoltClock mentioned scripted solution,您可以在其中根据元素大小以编程方式计算边框宽度。

This is such an example 使用 jQuery 编写极其简单的脚本。

var el = $(".content");
var w = el.width() / 4 | 0; // calculate & trim decimals
el.css("border-width", "1px " + w + "px");
.content { border: 1px solid #f00; }
<div class="content">
    This is the element to have percentage borders.
</div>

但您必须注意,每次容器大小更改(即浏览器窗口大小调整)时,您都必须调整边框宽度。我使用包装元素的第一个解决方法似乎要简单得多,因为它会在这些情况下自动调整宽度。

脚本解决方案的积极方面是它不会遇到我之前的非脚本解决方案中提到的背景问题。

【讨论】:

  • 非脚本解决方案的问题:set your elements background-color to white (or whatever it needs to be)它是半透明的,以便显示背景图像,使用其他元素会破坏目的。
  • @PeeyushKushwaha:无论如何,我已经在我的回答中指出了这个问题。这就是为什么我还提供了不受此影响的替代 scripted 解决方案。但根据背景情况,无需脚本仍然可以解决此问题。但这在很大程度上取决于个人情况。
  • 如果您需要边框内容的透明度,非脚本解决方案将不起作用(因为包装器背景会显示出来)。
  • 非脚本解决方案的另一个问题:不同的边框颜色是不可能的(例如border-left-color: green)
  • 我以前曾以某种方式考虑过像您这样的解决方案。我不知道带有背景的 div 和使用另一个 div 内部替代的填充是否那么好。现在它似乎验证了它。就我而言,这正是我所需要的。
【解决方案2】:

您也可以使用

border-left: 9vw solid #F5E5D6;
border-right: 9vw solid #F5E5D6;     

或

border: 9vw solid #F5E5D6;

【讨论】:

  • 这是这里唯一合理的解决方案。
  • 这不是 OP 所要求的。 OP 想要当前元素百分比中的边框,而不是视口百分比中的边框。
  • @autra,这正是 OP 所要求的:“我希望元素覆盖整个浏览器窗口”。
  • 哦,好的,好的。这是因为 OP 实际上就他们的问题提出了错误的问题,已经假设以百分比设置边界是他们特定问题的唯一解决方案。我被骗了,对不起:-)
  • 这是最好的答案!
【解决方案3】:

所以这是一个较老的问题,但对于那些仍在寻找答案的人来说,CSS 属性 Box-Sizing 在这里是无价的:

-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit  */
-moz-box-sizing: border-box;    /* Firefox, other Gecko         */
box-sizing: border-box; 

这意味着您可以将 div 的宽度设置为百分比,您添加到 div 的任何边框都将包含在该百分比内。因此,例如,以下内容会将 1px 边框添加到 div 宽度的内侧:

div { box-sizing:border-box; width:50%; border-right:1px solid #000; }         

如果您想了解更多信息:http://css-tricks.com/box-sizing/

【讨论】:

  • 当您不关心边框宽度而只关心覆盖全屏时,这很有用,其他情况则不然。
  • 这就是他最初要求的 - 覆盖整个屏幕,但包括边框的宽度。您可以在此处将边框宽度更改为任何像素量,并且不会影响您的 div 百分比宽度。
  • 我想说这个解决方案解决了原始问题中的一个问题,即覆盖整个屏幕而不会溢出。但是当您想根据屏幕宽度/高度的百分比设置边框时,这没有帮助
  • 这是一个很好的解决方案和方法,感谢 Kimberly!确实有助于对内部透明的元素的外部进行着色。
【解决方案4】:

您可以使用 em 来表示百分比而不是像素,

例子:

border:10PX dotted #c1a9ff; /* In Pixels */
border:0.75em dotted #c1a9ff; /* Exact same as above in Percentage */

【讨论】:

  • em 是一个百分比,但它与字体大小有关,而不是包含框/元素的高度或宽度。
  • Em 至少对我来说四舍五入到全像素。
【解决方案5】:

百分比值不适用于 CSS 中的 border-width。这在spec 中列出。

您将需要使用 JavaScript 计算元素宽度的百分比或您需要的任何长度数量,并将结果应用到 px 或类似元素的边框。

【讨论】:

  • @Robert Koritnik:正是 :) 我觉得我需要在我的回答中澄清这一点,所以我现在已经编辑了它......
  • @Robert:也许我会试一试......如果有必要我会回滚。
【解决方案6】:

Modern browsers support vh and vw units,是窗口视口的百分比。

因此您可以将纯 CSS 边框作为窗口大小的百分比:

border: 5vw solid red;

尝试this example 并更改窗口宽度;边框将随着窗口大小的改变而改变厚度。 box-sizing: border-box; 也可能有用。

【讨论】:

    【解决方案7】:

    盒子尺寸
    将框尺寸设置为边框框box-sizing: border-box; 并将宽度设置为 100% 并为边框设置固定宽度,然后添加一个最小宽度,以便对于小屏幕边框不会超过整个屏幕

    【讨论】:

      【解决方案8】:

      您可以使用跨度制作自定义边框。用一个类(指定边界的方向)和一个 id 创建一个跨度:

      <html>
          <body>
              <div class="mdiv">
                  <span class="VerticalBorder" id="Span1"></span>
                  <header class="mheader">
                      <span class="HorizontalBorder" id="Span2"></span>
                  </header>
              </div>
          </body>
      </html>
      

      然后,转到 CSS 并将类设置为 position:absolute、height:100%(垂直边框)、width:100%(水平边框)、margin:0% 和 background-color:#000000;。添加其他必要的内容:

      body{
          margin:0%;
      }
      
      div.mdiv{
          position:absolute;
          width:100%;
          height:100%;
          top:0%;
          left:0%;
          margin:0%;
      }
      
      header.mheader{
          position:absolute;
          width:100%;
          height:20%; /* You can set this to whatever. I will use 20 for easier calculations. You don't need a header. I'm using it to show you the difference. */
          top:0%;
          left:0%;
          margin:0%;
      }
      
      span.HorizontalBorder{
          position:absolute;
          width:100%;
          margin:0%;
          background-color:#000000;
      }
      
      span.VerticalBorder{
          position:absolute;
          height:100%;
          margin:0%;
          background-color:#000000;
      }
      

      然后将class="VerticalBorder"对应的id设置为top:0%;,left:0%;,width:1%;(由于mdiv的宽度在100%处等于mheader的宽度,所以宽度为100%您设置的内容。如果将宽度设置为 1%,则边框将是窗口宽度的 1%)。将对应于class="HorizontalBorder" 的id 设置为top:99% (因为它在标题容器中,所以顶部指的是它根据标题所处的位置。如果你想要这个+高度应该加起来为100%到达底部),left:0%; 和 height:1%(由于 mdiv 的高度是 mheader 高度的 5 倍 [100% = 100, 20% = 20, 100/20 = 5],因此高度将为 20您设置的百分比。如果将高度设置为 1%,则边框将是窗口高度的 0.2%)。下面是它的外观:

      span#Span1{
          top:0%;
          left:0%;
          width:.4%;
      }
      span#Span2{
          top:99%;
          left:0%;
          width:1%;
      }
      

      免责声明:如果您将窗口调整到足够小的尺寸,边框将会消失。如果窗口被调整到某个点,一个解决方案是限制边框的大小。这是我所做的:

      window.addEventListener("load", Loaded);
      
      function Loaded() {
        window.addEventListener("resize", Resized);
      
        function Resized() {
          var WindowWidth = window.innerWidth;
          var WindowHeight = window.innerHeight;
          var Span1 = document.getElementById("Span1");
          var Span2 = document.getElementById("Span2");
          if (WindowWidth <= 800) {
            Span1.style.width = .4;
          }
          if (WindowHeight <= 600) {
            Span2.style.height = 1;
          }
        }
      }
      

      如果你做的一切都正确,它应该看起来像这个链接中的样子:https://jsfiddle.net/umhgkvq8/12/ 出于某种奇怪的原因,边框将在 jsfiddle 中消失,但如果您将其启动到浏览器则不会。

      【讨论】:

        【解决方案9】:

        看看calc() specification。下面是一个使用示例:

        border-right:1px solid;
        border-left:1px solid;
        width:calc(100% - 2px);
        

        【讨论】:

          猜你喜欢
          • 2020-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-10
          • 2013-02-28
          • 2013-03-24
          • 2012-10-03
          • 1970-01-01
          相关资源
          最近更新 更多