Làm thế nào để đặt độ dày của đường viền theo phần trăm?


85

Làm cách nào để đặt chiều rộng đường viền của một phần tử theo tỷ lệ phần trăm? Tôi đã thử cú pháp

border-width:10%;

Nhưng nó không hoạt động.

Lý do tôi muốn đặt border-widththeo tỷ lệ phần trăm là tôi có một phần tử với width: 80%;height: 80%;và tôi muốn phần tử này bao phủ toàn bộ cửa sổ trình duyệt, vì vậy tôi muốn đặt tất cả các đường viền là 10%. Tôi không làm điều này với phương pháp hai phần tử, trong đó một phần tử sẽ được đặt phía sau phần tử kia và hoạt động như đường viền, vì nền của phần tử là trong suốt và việc định vị một phần tử phía sau nó sẽ ảnh hưởng đến độ trong suốt của nó.

Tôi biết điều này có thể được thực hiện thông qua JavaScript, nhưng tôi đang tìm kiếm một phương pháp chỉ CSS, nếu có thể.


border-widthkhông hỗ trợ phần trăm dưới dạng giá trị. Bạn có thể sử dụng em, px, ex, v.v. Nhưng tại sao bạn muốn đặt border-width10%?
Sentencio

2
Phần trăm của cái gì? Đây là điều cần thiết để tìm ra cách giải quyết. Cách tiếp cận đơn giản rõ ràng là sai, vì tỷ lệ phần trăm không được phép ở đó. Bạn có thể sẽ cần thiết lập một yếu tố phụ trợ và chơi với nền, nhưng chi tiết phụ thuộc vào câu trả lời cho câu hỏi "phần trăm của cái gì?"
Jukka K. Korpela

2
phần trăm màn hình. nguyên tố này là hoàn toàn vị trí, vì vậy tỷ lệ màn hình
Peeyush Kushwaha

@ JukkaK.Korpela: Có trường hợp tỷ lệ phần trăm đề cập đến bất kỳ thứ gì khác ngoài vùng chứa được định vị không? Tại sao câu hỏi sau đó?
Robert Koritnik

@PeeyushKushwaha, bạn có chắc ý của bạn là màn hình (chiều rộng), không phải chiều rộng cửa sổ không?
Jukka K. Korpela

Câu trả lời:


82

Border không hỗ trợ tỷ lệ phần trăm ... nhưng vẫn có thể ...

Như những người khác đã chỉ ra đặc tả CSS , tỷ lệ phần trăm không được hỗ trợ trên đường viền:

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

Như bạn có thể thấy nó nói phần trăm: N / A .

Giải pháp không theo kịch bản

Bạn có thể mô phỏng đường viền phần trăm của mình bằng phần tử trình bao bọc mà bạn sẽ:

  1. đặt phần tử trình bao bọc thành background-colormàu đường viền mong muốn của bạn
  2. đặt phần tử trình bao bọc paddingtheo tỷ lệ phần trăm (vì chúng được hỗ trợ)
  3. đặt các phần tử của bạn thành background-colormàu trắng (hoặc bất cứ thứ gì nó cần)

Điều này bằng cách nào đó sẽ mô phỏng đường viền phần trăm của bạn. Đây là một ví dụ về phần tử có đường viền bên chiều rộng 25% sử dụng kỹ thuật này.

HTML được sử dụng trong ví dụ

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

Vấn đề: Bạn phải lưu ý rằng điều này sẽ phức tạp hơn nhiều khi phần tử của bạn có một số nền phức tạp được áp dụng cho nó ... Đặc biệt nếu nền đó được kế thừa từ phân cấp DOM tổ tiên. Nhưng nếu giao diện người dùng của bạn đủ đơn giản, bạn có thể làm theo cách này.

Giải pháp theo kịch bản

@BoltClock đã đề cập đến giải pháp tập lệnh nơi bạn có thể lập trình tính toán chiều rộng đường viền theo kích thước phần tử.

Đây là một ví dụ với script cực kỳ đơn giản bằng 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>

Nhưng bạn phải lưu ý rằng bạn sẽ phải điều chỉnh độ rộng đường viền mỗi khi kích thước vùng chứa của bạn thay đổi (tức là thay đổi kích thước cửa sổ trình duyệt). Cách giải quyết đầu tiên của tôi với phần tử wrapper có vẻ đơn giản hơn nhiều vì nó sẽ tự động điều chỉnh chiều rộng trong những trường hợp này.

Mặt tích cực của giải pháp có tập lệnh là nó không bị các vấn đề nền được đề cập trong giải pháp không tập lệnh trước đây của tôi.


1
vấn đề với giải pháp không theo tập lệnh: set your elements background-color to white (or whatever it needs to be) Nó là nửa trong suốt để hiển thị hình nền, sử dụng phần tử khác sẽ phá hủy mục đích.
Peeyush Kushwaha

@PeeyushKushwaha: Dù sao thì tôi cũng đã chỉ ra vấn đề này trong câu trả lời của mình. Đó là lý do tại sao tôi cũng cung cấp thay thế Scripted giải pháp mà không bị này. Nhưng tùy thuộc vào nền, vẫn có thể giải quyết vấn đề này mà không cần lệnh. Nhưng điều này phụ thuộc rất nhiều vào tình hình cá nhân.
Robert Koritnik

Giải pháp không có tập lệnh sẽ không hoạt động nếu bạn cần độ trong suốt của nội dung được bao quanh (vì nền của trình bao bọc sẽ hiển thị xuyên suốt).
cmeeren

1
Một vấn đề khác với các giải pháp phi kịch bản: khác màu đường viền là không thể (ví dụ border-left-color: green)
Aloso

Tôi đã nghĩ cách nào đó về một giải pháp như của bạn trước đây. Tôi không biết liệu div có nền và đệm với một div bên trong khác có tốt như vậy không. Bây giờ nó dường như xác nhận nó. Trong trường hợp của tôi, nó chính xác là những gì tôi cần.
cram2208

37

Bạn cũng có thể dùng

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

HOẶC LÀ

border: 9vw solid #F5E5D6;

6
Đây là giải pháp duy nhất ở đây là hợp lý từ xa.
serraosays

1
Đây không phải là những gì OP yêu cầu. OP muốn có một đường viền trong phần trăm phần tử hiện tại, không phải trong phần trăm khung nhìn.
autra

2
@autra, đó chính xác là những gì OP yêu cầu: "Tôi muốn phần tử bao phủ toàn bộ cửa sổ trình duyệt".
Qwertiy

Ồ đúng rồi. Đó là bởi vì OP thực sự đã đặt câu hỏi sai về vấn đề của họ, đã giả sử đặt biên giới theo phần trăm là giải pháp duy nhất cho vấn đề cụ thể của họ. Tôi đã bị lừa bởi điều đó, xin lỗi :-)
autra

1
đó là câu trả lời tốt nhất!
Damien Romito

24

Vì vậy, đây là một câu hỏi cũ hơn, nhưng đối với những người vẫn đang tìm kiếm câu trả lời, thuộc tính CSS Box-Sizing ở đây là vô giá:

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

Điều đó có nghĩa là bạn có thể đặt chiều rộng của Div thành phần trăm và bất kỳ đường viền nào bạn thêm vào div sẽ được bao gồm trong phần trăm đó. Vì vậy, ví dụ, sau đây sẽ thêm đường viền 1px vào bên trong chiều rộng của div:

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

Nếu bạn muốn biết thêm thông tin: http://css-tricks.com/box-sizing/


2
Điều này hữu ích khi bạn không quan tâm đến chiều rộng của viền và chỉ quan tâm đến việc bao phủ toàn màn hình, nhưng không phải cách khác.
Peeyush Kushwaha

2
đó là những gì anh ấy yêu cầu ban đầu - bao phủ toàn bộ màn hình, nhưng bao gồm cả chiều rộng của đường viền. Bạn có thể thay đổi chiều rộng đường viền ở đây thành bất kỳ số lượng pixel nào và nó sẽ không ảnh hưởng đến chiều rộng phần trăm div của bạn.
Kimberly Fox

4
Tôi đang cố gắng nói rằng giải pháp này giải quyết một trong những vấn đề trong câu hỏi ban đầu, đó là bao phủ toàn bộ màn hình mà không bị tràn. Nhưng điều này không phải là hữu ích khi bạn muốn thiết lập biên giới của bạn về tỷ lệ phần trăm của chiều rộng màn hình / chiều cao
Peeyush Kushwaha

Đây là một giải pháp và cách tiếp cận tuyệt vời, cảm ơn Kimberly! Thực sự đã giúp che bóng bên ngoài của một phần tử mà bên trong là trong suốt.
Travis J

4

Giá trị phần trăm không được áp dụng border-widthtrong CSS. Điều này được liệt kê trong thông số kỹ thuật .

Bạn sẽ cần sử dụng JavaScript để tính toán tỷ lệ phần trăm chiều rộng của phần tử hoặc bất kỳ số lượng chiều dài nào bạn cần và áp dụng kết quả trong pxhoặc tương tự cho các đường viền của phần tử.


@Robert Koritnik: Chính xác :) Tôi cảm thấy mình cần phải làm rõ điều đó trong câu trả lời của mình nên tôi đã chỉnh sửa nó ngay bây giờ ...
BoltClock

@Robert: Có lẽ tôi sẽ thử ... và nếu cần tôi sẽ quay lại.
BoltClock

4

Bạn có thể sử dụng em cho tỷ lệ phần trăm thay vì pixel,

Thí dụ:

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

6
em là phần trăm, nhưng nó liên quan đến kích thước phông chữ, không phải chiều cao hoặc chiều rộng của hộp / phần tử chứa.
efreed

Em làm tròn đến pixel đầy đủ ít nhất đối với tôi.
aksu

4

Các trình duyệt hiện đại hỗ trợ các đơn vị vh và vw , là một tỷ lệ phần trăm của khung nhìn cửa sổ.

Vì vậy, bạn có thể có đường viền CSS thuần túy theo tỷ lệ phần trăm của kích thước cửa sổ:

border: 5vw solid red;

Hãy thử ví dụ này và thay đổi chiều rộng cửa sổ; đường viền sẽ thay đổi độ dày khi cửa sổ thay đổi kích thước. box-sizing: border-box;cũng có thể hữu ích.


2

Hộp Sizing
thiết lập các hộp kích thước đến hộp biên giới box-sizing: border-box;và thiết lập chiều rộng đến 100% và có chiều rộng cố định cho biên giới sau đó thêm một min-width như vậy cho một màn hình nhỏ biên giới sẽ không vượt qua toàn bộ màn hình


0

Bạn có thể tạo đường viền tùy chỉnh bằng cách sử dụng một khoảng. Tạo một khoảng với một lớp (Chỉ định hướng mà đường viền sẽ đi) và một 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>

Sau đó, chuyển đến CSS của bạn và đặt lớp thành position:absolute, height:100%(Đối với Đường viền dọc), width:100%(Đối với Đường viền Ngang), margin:0%background-color:#000000;. Thêm mọi thứ khác cần thiết:

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;
}

Sau đó thiết lập id tương ứng với class="VerticalBorder"tới top:0%;, left:0%;, width:1%;(Từ chiều rộng của mdiv là tương đương với chiều rộng của mheader ở mức 100%, chiều rộng sẽ là 100% những gì bạn thiết lập nó. Nếu bạn đặt chiều rộng tới 1% các đường viền sẽ là 1% chiều rộng của cửa sổ). Đặt id tương ứng với giá trị class="HorizontalBorder"đến top:99%(Vì nó nằm trong vùng chứa tiêu đề nên phần trên cùng đề cập đến vị trí của nó theo tiêu đề. Cái này + chiều cao phải cộng thêm 100% nếu bạn muốn nó ở dưới cùng) left:0%;height:1%(Vì chiều cao của mdiv lớn hơn 5 lần so với chiều cao của tiêu đề [100% = 100, 20% = 20, 100/20 = 5] nên chiều cao sẽ bằng 20% ​​so với những gì bạn đặt. Nếu bạn đặt chiều cao đến 1% đường viền sẽ là .2% chiều cao của cửa sổ). Đây là cách nó sẽ trông như thế nào:

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

KHUYẾN CÁO: Nếu bạn thay đổi kích thước cửa sổ thành kích thước đủ nhỏ, các đường viền sẽ biến mất. Một giải pháp sẽ là giới hạn kích thước của đường viền nếu cửa sổ được thay đổi kích thước đến một điểm nhất định. Đây là những gì tôi đã làm:

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;
    }
  }
}

Nếu bạn đã làm đúng mọi thứ, nó sẽ trông như thế nào trong liên kết này: https://jsfiddle.net/umhgkvq8/12/ Vì một số lý do kỳ lạ, đường viền sẽ biến mất trong jsfiddle nhưng không phải nếu bạn khởi chạy nó lên trình duyệt .


-2

Hãy xem đặc tả calc () . Đây là một ví dụ về cách sử dụng:

border-right:1px solid;
border-left:1px solid;
width:calc(100% - 2px);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.