Когда к div добавляется граница в 1 пиксель, размер Div увеличивается, не хочу этого делать


128

При щелчке я добавляю границу 1px к div, поэтому размер Div увеличивается на 2px X 2px. Я не хочу увеличивать размер div. Есть ли простой способ сделать это?

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

РЕДАКТИРОВАТЬ:
уменьшение высоты / ширины при выборе, но как увеличить ее обратно. Использование какой-либо сторонней структуры, поэтому не будет события, когда DIV теряет выбор.


Ответы:


49

Свойство border css увеличит "внешний" размер всех элементов, кроме tds в таблицах. Вы можете получить визуальное представление о том, как это работает в Firebug (поддержка прекращена ), на вкладке html-> layout.

Как пример, div с шириной и высотой 10 пикселей и границей в 1 пиксель будет иметь внешнюю ширину и высоту 12 пикселей.

В вашем случае, чтобы он выглядел так, как будто граница находится «внутри» div, в выбранном вами классе CSS вы можете уменьшить ширину и высоту элемента, удвоив размер границы, или вы можете сделать то же самое для обивка элементов.

Например:

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

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

thnx, у меня был класс .dragdrop-selected, но он использовался всеми перетаскиваемыми объектами, и у меня было 3 разных размера (3 разных типа) Dragable объекта, поэтому я сохранил отступы во всех 3 И установил отступы в .dragdrop-selected. . & это сработало. :)
Начикет

Это не лучшее решение для адаптивного дизайна. Использование outlineграницы или границы того же цвета, что и фон (и изменение ее цвета на другой, когда она выбрана) более гибкая.
AliBZ

1
Но предположим, что вам нужно избегать жесткого кодирования ширины, чтобы позволить элементу течь или реагировать на ширину окна просмотра: см. Мой ответ, используяborder-color: transparent
Эдвард Ньюэлл,

Нет необходимости в этих вычислениях, просто установите для размера поля значение border-box. См. Ответ Эйфрансиса ниже и эту статью .
jbyrd

Вы уверены в тд в таблицах? В Chrome все еще кажется, что размер увеличивается.
Protector one

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
box-sizing: border-box действительно должен быть установлен для всего в соответствии с современной передовой практикой. См. Paulirish.com/2012/box-sizing-border-box-ftw
jbyrd

6
В некоторых случаях это не работает; не совсем уверен, почему. См .: codepen.io/anon/pen/QZaBQG
Уилсон Биггс

51

установите на нем границу, прежде чем щелкнуть, чтобы она была того же цвета, что и фон.

Затем при нажатии просто измените цвет фона, а ширина не изменится.


3
Гениальный! Хотел бы я сам подумать об этом.
Риджул Гупта,

9
Ага, а если у вас нет сплошного фона? См. Мой ответ с помощьюborder-color: transparent
Эдвард Ньюэлл

44

Еще одно хорошее решение - использовать outlineвместо border. Он добавляет границу, не затрагивая блочную модель. Это работает в IE8 +, Chrome, Firefox, Opera, Safari.

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


Это здорово, но по сравнению с границей здесь нет «контура-слева, ...», не для меня.
Imskull

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

Спасибо, #chowey, только что реализовано, box-shadowможет также поддерживать одностороннюю границу, идеальное решение.
Imskull

border-color: transparentимеет лучшую кроссбраузерную поддержку --- см. мой ответ ...
Эдвард Ньюэлл

1
Этот комментарий недооценен. Это отличный способ создать рамку вокруг элемента, не изменяя его размер!
Себастьян Немет


28

Пользуясь многими из этих решений, я считаю, что уловка настройки border-color: transparentявляется наиболее гибкой и широко поддерживаемой:

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

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

Почему лучше:

  • Нет необходимости жестко задавать ширину элемента
  • Отличная кроссбраузерная поддержка (отсутствует только IE6)
  • В отличие от with outline, вы можете указать, например, верхнюю и нижнюю границы отдельно.
  • В отличие от настройки цвета границы как фона, вам не нужно обновлять это, если вы меняете фон, и он совместим с не сплошным цветным фоном.

1
Я обнаружил, что это лучше всего работает с элементами динамического размера в моем UX. Полностью остановлено изменение размера на MouseOver! Спасибо, мистер Ньюэлл!
d3r3kk

Гениальное. Спасибо вам!
Harald Hoerwick

Это тот самый!
пока верно

transparentвот какая необходимость!
dimpiax

Это то, что мне нужно (Y)
HaxxanRaxa

20

Попробуй это

box-sizing: border-box;

4
Это должен быть ответ, просто грязь.
Spets

Почему это не везде работает? Например, codepen.io/anon/pen/QZaBQG
Том

привет @Tom, я не уверен, почему это еще не работает. Но в вашем случае, пожалуйста, подумайте об удалении высоты в контейнере и вместо этого используйте заполнение. Могу решить вашу проблему.
Хоанг Чунг

17

Обычно я использую отступы, чтобы решить эту проблему. Отступ будет добавлен, когда граница исчезнет, ​​и удален, когда граница появится. Образец кода:

.good-border {
  padding: 1px;
}

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

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

Посмотреть мой полный пример кода на JSFiddle: https://jsfiddle.net/3t7vyebt/4/


1
Можете ли вы сказать мне, что на самом деле происходит, я сбит с толку, почему при плохом наведении границы здесь смещается вниз, когда вы наводите на нее курсор?
Сурадж Джайн

@SurajJain Потому что размер div с "плохой границей" будет изменен (добавлен 1 пиксель границы) при наведении на него курсора.
Tho

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

Мне нужно было иметь возможность «ограничивать» любой элемент, добавляя класс, и не влиять на его размеры. Хорошим решением для меня было использование box-shadow. Но в некоторых случаях эффект не был заметен из-за других братьев и сестер. Итак, я объединил как типичную тень блока, так и вставку тени блока. В результате получается рамка без изменения размеров.

Значения разделены запятой. Вот простой пример:

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

вычитание 2 пикселей для границ


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

1
Я думаю, что было бы более полезно для OP и других посетителей, если бы вы добавили некоторые пояснения к своему намерению.
Репортер

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 05

0

Вы можете попробовать вставку box-shadow

примерно так: box-shadow: inset 0px -5px 0px 0px #fff

добавляет белую рамку 5 пикселей в нижнюю часть элемента без увеличения размера

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.