Коли до розділу div додається 1 px межа, розмір Div збільшується, не хочу цього робити


128

Після натискання я додаю, 1px межа до div, тому розмір Div збільшується на 2px X 2px. Я не хочу збільшувати розмір div. Чи є простий спосіб зробити це?

Брудний докладний пояснення
Насправді я додаю DIV з float: зліва (такого ж розміру, як іконки) в контейнер-div, тому всі стеки одна за одною, і коли (ширина-div контейнера становить 300 пікселів) не залишається місця на ширину, так що дочірні DIV поставляються в наступному ряду, тому його каталог подобається, але через вибраний розмір DIV збільшується лише розмір, DIV під обраним DIV переходить вправо і створює порожній простір нижче вибраного DIV.

EDIT:
Зменшення висоти / ширини при виборі, але як збільшити його назад. Використовуючи якісь сторонні рамки, тому не майте події, коли DIV втрачає вибір.


Відповіді:


49

Властивість border css збільшуватиме всі елементи "зовнішнього" розміру, виключаючи tds у таблицях. Ви можете отримати наочне уявлення про те, як це працює в Firebug ( припинено) ), на вкладці html-> layout.

Так само, як приклад, div із шириною та висотою 10px та рамкою 1px матиме зовнішню ширину та висоту 12px.

У вашому випадку, щоб він виглядав так, що межа є на внутрішній стороні діва, у вибраному вами класі CSS ви можете зменшити ширину та висоту елемента вдвічі, ніж ваш розмір межі, або ви можете зробити те ж саме для елементи підкладки.

Наприклад:

div.navitem
{
    width: 15px;
    height: 15px;
    /* padding: 5px; */
}

div.navitem .selected
{
    border: 1px solid;
    width: 13px;
    height: 13px;
    /* padding: 4px */
}

thnx, у мене був обраний клас .dragdrop, але його використовували всі об'єкти, що перетягуються, і мені було подобається 3 різних розміру (3 різних типу) об'єкта Dragable, тому я продовжував живлення однаково у всіх 3 AND set padding у .dragdrop-вибраному. . & це спрацювало. :)
Nachiket

Це не гарне рішення для чуйних конструкцій. Використання outlineабо рамка з тим самим кольором, що і фон (і зміна його кольору на щось інше, коли вибрано) є більш гнучким.
AliBZ

1
Але припустимо, що вам потрібно уникати жорсткого кодування ширини, щоб дозволити елементу перетікати або відповідати на ширину порту перегляду: дивіться мою відповідь за допомогоюborder-color: transparent
Едвард Ньюелл

Немає необхідності в цих обчисленнях, просто встановіть розмір коробки для рамки. Дивіться відповідь ejfrancis нижче та дивіться цю статтю .
jbyrd

Ви впевнені в td у таблицях? У Chrome це все ще здається, що він додає розмір.
Захисник один

105

Це також корисно в цьому сценарії. це дозволяє встановлювати межі без зміни ширини Div

textarea { 
  -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
  -moz-box-sizing: border-box;    /* Firefox, other Gecko */
  box-sizing: border-box;         /* Opera/IE 8+ */
}

Взято з http://css-tricks.com/box-sizing/


4
розмір ящиків: рамка рамки дійсно повинна бути встановлена ​​на все як сучасна найкраща практика. Дивіться paulirish.com/2012/box-sizing-border-box-ftw
jbyrd

6
Мабуть, у деяких випадках це не працює; не зовсім впевнений, чому. Дивіться: codepen.io/anon/pen/QZaBQG
Вілсон Біггс

51

встановіть рамку на ній, перш ніж натиснути, щоб бути того ж кольору, що і фон.

Потім при натисканні просто змініть колір фону і ширина не зміниться.


3
Геніальний! якби я сам про це думав.
Rijul Gupta

9
Так, але якщо у вас немає суцільного кольорового фону? Дивіться мою відповідь, використовуючиborder-color: transparent
Едвард Ньюелл

44

Ще одне хороше рішення - використовувати outlineзамість цього border. Він додає облямівку, не впливаючи на модель коробки. Це працює в IE8 +, Chrome, Firefox, Opera, Safari.

( https://stackoverflow.com/a/8319190/2105930 )


Це чудово, але, порівнюючи з кордоном, немає "контуру-ліворуч, ...", не для мого випадку.
Імскулл

2
Тоді я рекомендую використовувати box-shadowза моєю іншою відповіддю на подібне питання. У нього немає такої ж підтримки в браузері, але це питання менше в наші дні.
chowey

Дякую #chowey, щойно зрозумів, що box-shadowможе підтримувати односторонній кордон, префект рішення.
Імскулл

border-color: transparentмає кращу підтримку крос-браузера --- дивіться мою відповідь ...
Едвард Ньюелл

1
Цей коментар недооцінений. Це прекрасний спосіб обшити межу навколо елемента, не змінюючи його розмір!
Себастьян Немет


28

Використовуючи багато цих рішень, я вважаю, що трюк налаштування border-color: transparentє найбільш гнучким та широко підтримуваним:

.some-element {
    border: solid 1px transparent;
}

.some-element-selected {
    border: solid 1px black;
}

Чому краще:

  • Не потрібно жорстко кодувати ширину елемента
  • Відмінна підтримка крос-браузера (лише IE6 пропущено)
  • На відміну від outline, ви все одно можете вказати, наприклад, верхню та нижню межі окремо
  • На відміну від встановлення кольору рамки таким, як фоновий, вам не потрібно оновлювати це, якщо ви зміните фон, і він сумісний з кольорами без кольорів.

1
Я виявив, що це найкраще працює з елементами динамічного розміру в моєму UX. Зупинення зміни розміру відбувається наMouseOver повністю! Дякую містере Ньюелл!
d3r3kk

Геніальний. Дякую тобі!
Харальд Хервік


transparentось у чому потреба!
dimpiax

Це те, що мені потрібно (Y)
HaxxanRaxa

20

Спробуйте це

box-sizing: border-box;

4
Це має бути відповідь, бруд простий.
Spets

Чому це не працює скрізь? Наприклад codepen.io/anon/pen/QZaBQG
Том

привіт @ Том, я не впевнений, чому це ще не працює. Але у вашому випадку, будь ласка, подумайте про те, щоб зняти висоту в контейнері та використовувати замість неї. Може вирішити вашу проблему.
Hoang Trung

17

Зазвичай я використовую прокладки для вирішення цієї проблеми. Прокладка буде додана, коли рамка зникає, і видаляється, коли з'являється межа. Приклад коду:

.good-border {
  padding: 1px;
}

.good-border:hover {
  padding: 0px;
  border: 1px solid blue;
}

введіть тут опис зображення

Переглянути мій повний зразок коду на JSFiddle: https://jsfiddle.net/3t7vyebt/4/


1
Чи можете ви сказати мені, що насправді відбувається, я розгублений, чому внаслідок поганого обертання кордону тут зрушення вниз, коли ви наближаєтесь до нього?
Сурай Джайн

@SurajJain Оскільки розмір "поганої межі" буде змінено (додайте 1px межі), коли ви наведіть на нього курсор.
Чт

6

Просто зменшіть ширину і висоту вдвічі більше ширини облямівки


3

Ви можете зробити якісь химерні речі із вставними тінями. Приклад, щоб розмістити рамку на нижній частині елемента, не змінюючи його розмір:

.bottom-border {
  box-shadow:inset 0px -3px 0px #000;
}

3

Іноді ви не хочете, щоб на них впливали висота чи ширина, не встановлюючи явно. У цьому випадку я вважаю корисним використовувати псевдоелементи.

.border-me {
    position: relative;
}

.border-me::after {
    content: "";
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    border: solid 1px black;
}

Ви також можете зробити набагато більше з псевдоелементом, так що це досить потужна модель.


1
У мене була межа 1px , що я хотів змінити в 2px, і єдиний спосіб , яким я міг знайти , щоб зробити це було шляхом видалення widthі heightі додавання bottomі leftвластивості на додаток до topі left, всі з яких мають бути встановлені по ширині протилежністю оригінальна рамка (в моєму випадку -1px). Хоч великий хак
Чейз Сандманн

2

Спробуйте зменшити розмір поля при збільшенні межі


2

Мені потрібно було вміти "обмежувати" будь-який елемент, додаючи клас, а не впливати на його розміри. Хорошим рішенням для мене було використання коробки-тіні. Але в деяких випадках ефект не був помітний через інших братів і сестер. Тож я поєднав як типову тінь для коробки, так і тінь для вставки. В результаті виходить облямівка без зміни розмірів.

Значення, розділені комою. Ось простий приклад:

.add_border {
    box-shadow:-1px 0 1px 1px rgba(0, 0, 0, 0.75), inset -1px 0 0 1px rgba(0, 0, 0, 0.75);
}

jsfiddle

Відрегулюйте свій бажаний вигляд, і ви готові йти!


2

Ми також можемо використовувати функцію css calc ()

width: calc(100% - 2px);

віднімання 2px для меж


1
.filter_list_button_remove {
    border: 1px solid transparent; 
    background-color: transparent;
}
.filter_list_button_remove:hover {
    border: 1px solid; 
}

1
Я думаю, що було б кориснішим для ОП та для подальших відвідувачів, коли ви додасте пояснення щодо свого наміру.
Репортер

1

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


1
Так, але припустимо, що ваш фон не є однотонним кольором ... дивіться мою відповідь на основі використанняborder-color: transparent
Едвард Ньюелл

Або всі разом, якul li a{border-bottom:2px solid transparent;} ul li a:hover{border-bottom:2px solid red;}
stackunderflow

0

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

button {
    padding: 10px;
    border: 4px solid blue;
    border-radius: 4px;
    outline: 2px solid white;
    outline-offset: -4px;
}

button:hover {
    outline-color: transparent;
}

Приклад тут: https://codepen.io/Happysk/pen/zeQzaZ


Контур, на жаль, не має закруглених кутів :(
M3RS

0

Ви можете спробувати вставку з тіньовою коробкою

щось подібне: box-shadow: вставка 0px -5px 0px 0px #fff

додає білу рамку в 5 пікселів в нижній частині елемента, не збільшуючи розмір

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