Як надати межу будь-якому елементу за допомогою css, не додаючи межі ширини на всю ширину елемента?


101

Як надати межу будь-якому елементу за допомогою css, не додаючи межі ширини на всю ширину елемента?

Як і у Photoshop, ми можемо надавати штрихи - всередині, у центрі та зовні

Я думаю, що властивості кордону CSS за замовчуванням є центром, як центр у фотошопі, я прав?

Я хочу дати рамку всередині поля, а не зовні. і не хочуть включати ширину рамки в ширину поля.

Відповіді:


221
outline:1px solid white;

Це не додасть додаткової ширини та висоти.


10
Помічено: контур не визначає сторони, тому це працює лише в тому випадку, якщо всі сторони стилізовані.
— Screenack

1
Я додав відповідь, яка дозволяє обмежувати лише одну сторону.
— mikevoermans

1
Лише зауваження, що не буде слідувати кривим будь-якого радіуса кордону, який у вас може бути на елементі, тож ви отримаєте квадратну межу.
— безмежний

2
Але це не підтримує радісного.
— Небо

29

Перевірте розмір коробки для CSS ...

Властивість CSS3 розміру коробки може це зробити. Значення рамки рамки (на відміну від типового поля вмісту) робить остаточне віконечне поле оголошеною шириною, а будь-яке обрізання рамки та прокладки всередині поля. Тепер ви можете сміливо оголосити, що ваш елемент має ширину 100%, включаючи накладку на основі пікселів та облямівку, і досконало виконати свою мету.

  • -webkit-box-розмір: border-box; / * Safari / Chrome, інші WebKit * /
  • -moz-box-розмір: border-box; / * Firefox, інший Gecko * /
  • розмір коробки: бордюр; / * Opera / IE 8+ * /

Я б запропонував створити міксин для вирішення цього питання. Додаткову інформацію про розмір коробки ви можете знайти на W3c http://www.w3schools.com/cssref/css3_pr_box-sizing.asp


1
Це найкраща відповідь, хоча я не думаю, що вам справді потрібні всі префікси. caniuse.com/#feat=css3-boxsizing
— Джастін

2
^ Правильний Джастін, префікси вам більше не потрібні. box-sizingбуде достатньо
— Чад

26

Залежно від призначеної підтримки браузера, ви можете використовувати box-shadowвластивість.

Ви можете встановити значення розмиття на 0, а розкинути на будь-яку товщину, яку ви шукаєте. Чудова річ у тіні поля - це те, що ви можете контролювати, чи вона намальована зовні (за замовчуванням) або всередині (використовуючи insetвластивість).

Приклад:

box-shadow: 0 0 0 1px black; // Outside black border 1px

або

box-shadow: 0 0 0 1px white inset; // Inside white border 1px

Однією з найважливіших переваг використання тіні для коробки є те, що ви можете проявити творчість за допомогою декількох тіньових коробок:

box-shadow: 0 0 0 3px black, 0 0 0 1px white inset;

Єдине, що я не можу сказати - це яка різниця зробить ефективність візуалізації мудрою. Я б припустив, що це може стати проблемою, якби у вас одразу було сотні елементів, що використовують цю техніку на екрані.


16

Я зіткнувся з тим же питанням.

.right-border {
    position: relative;
}

.right-border:after {
    content: '';
    display: block;
    position: absolute;
        top: 0; right: 0;
    width: 1px;
    height: 100%;
    background: #e0e0e0;
}

Ця відповідь дозволяє вказати одну окрему сторону. І працював би в IE8 + - на відміну від використання box-shadow.

Звичайно, змініть властивості псевдоелементів, як вам потрібно виділити певну сторону.

* Нове та вдосконалене *

&:before {
content: '';
display: block;
position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
border: 1px solid #b7b7b7;
}

Це дозволяє використовувати рамки та натискати декілька сторін коробки.


8

Використовуйте box-sizing: border-boxдля того, щоб створити межу INSIDE div без зміни ширини div.

Використовуйте, outlineщоб створити межу OUTSIDE div, не змінюючи ширину div.

Ось приклад: https://jsfiddle.net/4000cae9/1/

Примітки: в border-boxданий час він не підтримується IE

Підтримка:

http://caniuse.com/#feat=outline

http://caniuse.com/#search=border-box

#test, #test2 {
    width: 100px;
    height:100px;
    background-color:yellow;
}
#test {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    border: 10px dashed blue;
}
#test2 {
    outline: 10px dashed red;
}


<p>Use box-sizing: border-box to create a border INSIDE a div without modifying div width.</p>
<div id="test">border-box</div>
<p>Use outline to create a border OUTSIDE a div without modifying div width.</p>
<div id="test2">outline</div>

6

Як сказав Абенсон, ви можете використовувати контур, але одна думка полягає в тому, що Opera може малювати "не прямокутну форму". Інший варіант, який, здається, працює - це використовувати негативні поля, наприклад, цей css:

div {
  float:left;
  width: 50%;
  border:1px solid black;
  margin: -1px;

}

З цим html:

<body>
  <div>A block</div>
  <div>Another block</div>
</body>

Ще один менш чистий варіант - додати додаткову розмітку до html. Наприклад, ви встановлюєте ширину зовнішнього елемента і додаєте рамку до внутрішнього. CSS:

.outer { width: 50%; float: left;}
.inner { border: 1px solid black; }

І html:

<body>
  <div class="outer">
    <div class="inner">A block</div>
  </div>
  <div class="outer">
    <div class="inner">Another block</div>
  <div>
</body>

3

Використовуйте прокладки, коли немає меж. Видаліть прокладки, коли є бордюр.

.myDiv {
    width: 100px;
    height: 100px;
    padding-left: 2px;
    padding-right: 2px;
}

.myDiv:hover {
    padding-left: 0;
    padding-right: 0;
    border-left: 2px solid red;
    border-right: 2px solid red;
}

По суті, просто замініть накладку 2px рамками 2px. Розмір Div залишається колишнім.


2

У вашому випадку ви можете виправити це, віднявши половину межі від прокладки? (-2,5 від прокладки, якщо ваша рамка шириною 5 пікселів, ви не можете мати негативну підкладку, щоб зменшити загальну ширину поля). Ви можете додати додаткові 2,5 пікселя до поля, щоб загальний розмір поля був однаковим.

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


1

Таким чином, ви намагаєтесь досягти того самого, як добре відома помилка IE box ? Це неможливо. Або ви хочете , щоб підтримувати клієнтів з IE на Windows , тільки і вибрати тип документа , який змушує IE в Quirksmode .


0

Ще один варіант, якщо колір тла суцільний:

body { background-color: #FFF; }

.myDiv {
    width: 100px;
    height: 100px;
    border: 3px solid #FFF;  // Border is essentially invisible since background is also #FFF;
}

.myDiv:hover {
    border-color: blue;  // Just change the border color
}

Ви можете замінити #FFFпрозорим, і тоді вам не потрібно пам'ятати, щоб змінити два значення. Ваша пропозиція приносить користь, що якщо вам потрібна пунктирна межа, це діятиме там, де цього box-shadowне вистачає.
— безмежний

0

контур: 3px суцільний чорний || межа: 3px суцільний чорний

div{
height:50px;
width:150px;
text-align:center;

}

div{    /*this is what you need ! */
outline:1px solid black
}
<div>
hello world
</div>

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