Як встановити товщину межі у відсотках?


85

Як встановити ширину межі елемента у відсотках? Я спробував синтаксис

border-width:10%;

Але це не працює.

Причиною, яку я хочу встановити border-widthу відсотках, є те, що у мене є елемент із width: 80%;і height: 80%;, і я хочу, щоб елемент охоплював усе вікно браузера, тому я хочу встановити всі межі 10%. Я не роблю цього за допомогою методу двох елементів, при якому один буде розташовуватися позаду іншого і діятиме як межа, оскільки фон елемента прозорий, і розташування елемента за ним вплине на його прозорість.

Я знаю, що це можна зробити за допомогою JavaScript, але я шукаю метод лише CSS, якщо це можливо.


border-widthне підтримує відсоток як значення. Ви можете використовувати em, px, ex тощо. Але чому ви хочете встановити border-widthзначення 10%?
Sentencio

2
Відсоток чого? Це важливо для пошуку обхідного шляху. Простий підхід, очевидно, неправильний, оскільки відсотки там не дозволені. Ймовірно, вам потрібно буде встановити допоміжний елемент і пограти з фонами, але деталі залежать від відповіді на питання "відсоток від чого?"
Jukka K. Korpela

2
відсоток екрану. елемент абсолютно позиціонований, тому відсоток екрану
Peeyush Kushwaha

@ JukkaK.Korpela: Чи є випадок, коли відсоток стосується чогось іншого, крім розміщеного контейнера? Чому тоді питання?
Роберт Коритник,

@PeeyushKushwaha, ти впевнений, ти маєш на увазі екран (ширину), а не ширину вікна?
Jukka K. Korpela

Відповіді:


82

Кордон не підтримує відсоток ... але це все одно можливо ...

Як інші вказували на специфікацію CSS , відсотки не підтримуються на межах:

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

Як бачите, там написано " Відсотки": Не застосовується .

Рішення без сценарію

Ви можете змоделювати відсотки меж за допомогою елемента-обгортки, де:

  1. встановіть елементи обгортки background-colorна бажаний колір межі
  2. встановити елементи обгортки paddingу відсотках (оскільки вони підтримуються)
  3. встановіть для своїх елементів background-colorбілий (або що завгодно це потрібно)

Це якимось чином змоделює ваші відсотки. Ось приклад елемента з бічними межами шириною 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-предка. Але якщо ваш інтерфейс досить простий, ви можете зробити це таким чином.

Рішення за сценарієм

@BoltClock згадав сценарій, де ви можете програмно обчислити ширину меж відповідно до розміру елемента.

Це такий приклад з надзвичайно простим сценарієм, що використовує 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>

Але ви повинні знати, що вам доведеться регулювати ширину меж кожного разу, коли змінюється розмір вашого контейнера (тобто зміна розміру вікна браузера). Моє перше обхідне рішення з елементом обгортки здається набагато простішим, оскільки воно автоматично регулює ширину в цих ситуаціях.

Позитивною стороною сценарійного рішення є те, що воно не страждає від фонових проблем, згаданих у моєму попередньому некриптовому рішенні.


1
проблема з некриптовим рішенням: set your elements background-color to white (or whatever it needs to be)воно напівпрозоре, щоб показати фонове зображення, використання іншого елемента зруйнує ціль.
Peeyush Kushwaha

@PeeyushKushwaha: Я все одно вказав на це питання у своїй відповіді. Ось чому я також запропонував альтернативне сценарійне рішення, яке від цього не страждає. Але залежно від передісторії все ще можна було вирішити цю проблему без сценаріїв. Але це надзвичайно залежить від конкретної ситуації.
Роберт Коритник,

Рішення без сценарію не буде працювати, якщо вам потрібна прозорість облямованого вмісту (оскільки фон обгортки відображатиметься).
cmeeren

1
Ще одне питання із сценарійним рішенням: різні кольори меж неможливі (наприклад border-left-color: green)
Алосо

Я вже якось думав про таке рішення, як ваше. Я не знав, чи div з фоном та відступ до іншого div всередині альтернативи настільки хороший. Тепер це, здається, підтверджує. У моєму випадку це саме те, що мені було потрібно.
cram2208

37

Ви також можете використовувати

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

АБО

border: 9vw solid #F5E5D6;

6
Це єдине тут рішення, яке є віддалено обґрунтованим.
serraosays

1
Це не те, що запитував ОП. OP бажає межі у поточному відсотковому елементі, а не у відсотковому вікні.
autra

2
@autra, саме про це запитав ОП: "Я хочу, щоб елемент охоплював усе вікно браузера".
Квертій,

О, так, добре Це тому, що ОП насправді задало неправильне питання щодо їх проблеми, вже припускаючи, що встановлення межі у відсотках було єдиним рішенням їхньої конкретної проблеми. Мене це обдурило, вибачте :-)
autra

1
це найкраща відповідь!
Демієн

24

Отже, це давнє запитання, але для тих, хто все ще шукає відповіді, властивість 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/


2
Це корисно, коли ви не дбаєте про ширину кордону і лише про те, щоб покрити весь екран, але не інакше.
Peeyush Kushwaha

2
це те, про що він просив спочатку - охоплюючи весь екран, але включаючи ширину межі. Тут ви можете змінити ширину межі на будь-яку кількість пікселів, і вона не скине ваші відсотки ширини div.
Кімберлі Фокс,

4
Я намагався сказати, що це рішення вирішує одну з проблем у вихідному питанні, тобто охоплює весь екран без переповнення. Але це не корисно, коли ви хочете встановити межу з урахуванням процентного співвідношення ширини / висоти екрану
Peeyush Kushwaha

Це чудове рішення та підхід, дякую Кімберлі! Дійсно допомогло затінення зовнішньої частини елемента, де внутрішня частина була прозорою.
Тревіс Дж.

4

Значення відсотків не застосовуються до border-widthCSS. Це вказано в специфікації .

Вам потрібно буде використовувати JavaScript для обчислення відсоткового співвідношення ширини елемента або будь-якої кількості довжини, яка вам потрібна, і застосувати результат до pxабо подібного до меж елемента.


@ Роберт Корітнік: Саме так :) Я відчув, що мені потрібно це пояснити у своїй відповіді, тому я відредагував це зараз ...
BoltClock

@ Роберт: Можливо, я спробую ... і при необхідності відкачу назад.
BoltClock

4

Ви можете використовувати em для відсотків замість пікселів,

Приклад:

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

6
em - це відсоток, але це відносно розміру шрифту, а не висоти або ширини вміщуваного вікна / елемента.
efreed

Em округляє до повних пікселів принаймні для мене.
aksu,

4

Сучасні браузери підтримують модулі vh та vw , які становлять відсоток від області перегляду вікна.

Отже, ви можете мати чисті межі CSS як відсоток від розміру вікна:

border: 5vw solid red;

Спробуйте цей приклад і змініть ширину вікна; межа буде змінювати товщину, коли вікно змінює розмір. box-sizing: border-box;також може бути корисним.


2

Розмір
вікна встановіть розмір вікна на поле межі box-sizing: border-box;та встановіть ширину на 100% та фіксовану ширину межі, а потім додайте мінімальну ширину, щоб на маленькому екрані межа не перегнала весь екран


0

Ви можете зробити власну межу за допомогою прольоту. Зробіть проміжок з класом (вказуючи напрямок, в якому рухається межа) та ідентифікатором:

<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"до top:0%;, left:0%;, width:1%;(Так як ширина mdiv дорівнює ширині mheader на 100%, то ширина буде 100% того , що ви встановите його. Якщо ви встановите ширину на 1% , то межа складатиме 1% від ширини вікна). Встановіть ідентифікатор , який відповідає class="HorizontalBorder"до top:99%(Оскільки це в контейнері заголовка у верхній відноситься до позиції , яку він знаходиться у відповідності з заголовком. Це + висота повинна становити 100% , якщо ви хочете, щоб досягти дна), left:0%;і height:1%(Оскільки висота mdiv у 5 разів перевищує висоту mheader [100% = 100, 20% = 20, 100/20 = 5], висота становитиме 20% від того, що ви встановили. Якщо ви встановите висоту до 1% межа буде складати .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 зникне, але ні, якщо ви запустите її у браузері .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.