Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set border's thickness in percentages?

Tags:

css

How to set border-width of an element in percentages? I tried the syntax

border-width:10%; 

But it doesn't work.

The reason I want to set border-width in percentages is I have an element with width: 80%; and height: 80%;, and I want the element to cover the whole browser window, so I want to set all borders 10%. I am not doing this with the two elements method, in which one would be positioned behind the other and act as the border, because the element's background is transparent, and positioning an element behind it would affect it's transparency.

I know this can be done via JavaScript, but I am looking for an CSS only method, if possible at all.

like image 871
Peeyush Kushwaha Avatar asked Nov 20 '12 13:11

Peeyush Kushwaha


2 Answers

Border doesn't support percentage... but it's still possible...

As others have pointed to CSS specification, percentages aren't supported on borders:

'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' 

As you can see it says Percentages: N/A.

Non-scripted solution

You can simulate your percentage borders with a wrapper element where you would:

  1. set wrapper element's background-color to your desired border colour
  2. set wrapper element's padding in percentages (because they're supported)
  3. set your elements background-color to white (or whatever it needs to be)

This would somehow simulate your percentage borders. Here's an example of an element with 25% width side borders that uses this technique.

HTML used in the example

.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>

Issue: You have to be aware that this will be much more complicated when your element has some complex background applied to it... Especially if that background is inherited from ancestor DOM hierarchy. But if your UI is simple enough, you can do it this way.

Scripted solution

@BoltClock mentioned scripted solution where you can programmaticaly calculate border width according to element size.

This is such an example with extremely simple script using 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>

But you have to be aware that you will have to adjust border width every time your container size changes (i.e. browser window resize). My first workaround with wrapper element seems much simpler because it will automatically adjust width in these situations.

The positive side of scripted solution is that it doesn't suffer from background problems mentioned in my previous non-scripted solution.

like image 199
Robert Koritnik Avatar answered Sep 21 '22 07:09

Robert Koritnik


You can also use

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

OR

border: 9vw solid #F5E5D6; 
like image 42
Ajmal Jamil Avatar answered Sep 19 '22 07:09

Ajmal Jamil