div에 1px 테두리가 추가되면 Div 크기가 증가합니다.


128

클릭하면 div에 1px 테두리를 추가하므로 Div 크기가 2px X 2px만큼 증가합니다. div 크기를 늘리고 싶지 않습니다. 그렇게하는 간단한 방법이 있습니까?

지저분한 자세한 설명
실제로 float : left (아이콘과 같은 동일한 크기)를 사용하여 DIV를 container-div에 추가하고 있으므로 모두 차례로 쌓이고 (container-div 너비가 300px) 너비 방향으로 남은 공간이 없을 때 자식 DIV가 다음 행에 오므로 카탈로그와 비슷하지만 테두리 때문에 선택한 DIV 크기 만 증가하고 선택한 DIV 아래의 DIV가 오른쪽으로 이동하여 선택한 DIV 아래에 빈 공간을 만듭니다.

편집 :
선택시 높이 / 너비 감소,하지만 다시 늘리는 방법. 타사 프레임 워크를 사용하므로 DIV가 선택을 잃을 때 이벤트가 발생하지 않습니다.


답변:


49

border css 속성은 테이블의 tds를 제외하고 모든 요소의 "외부"크기를 늘립니다. html-> layout 탭 에서 Firebug ( discontinued ) 에서 이것이 어떻게 작동하는지 시각적으로 알 수 있습니다 .

예를 들어, 너비와 높이가 10px이고 테두리가 1px 인 div는 외부 너비와 높이가 12px입니다.

귀하의 경우 테두리가 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 클래스를 가지고 있었지만 드래그 가능한 모든 객체에서 사용되었으며 Dragable 객체의 3 가지 크기 (3 가지 유형)를 좋아했기 때문에 3 가지 모두에서 패딩을 동일하게 유지하고 .dragdrop-selected에서 패딩을 설정했습니다. . & 작동했습니다. :)
Nachiket 2010-07-15

이것은 반응 형 디자인에 적합한 솔루션이 아닙니다. outline또는 배경과 동일한 색상의 테두리를 사용 하고 선택하면 색상을 다른 것으로 변경하는 것이 더 유연합니다.
AliBZ

1
그러나 당신이보기 포트 폭 요소 흐름 또는 응답을 수 있도록, 하드 코딩 폭을 피할 필요가 가정 : 사용하여 내 대답을 참조border-color: transparent
에드워드 뉴웰

이러한 계산이 필요하지 않으며 상자 크기를 테두리 상자로 설정하기 만하면됩니다. 아래 ejfrancis의 답변 을 참조 하고이 기사를 참조 하십시오 .
jbyrd apr.

테이블의 td에 대해 확신합니까? Chrome에서는 여전히 크기가 추가되는 것 같습니다.
수호자 1

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
Wilson Biggs

51

클릭하기 전에 배경과 동일한 색상으로 테두리를 설정하십시오.

그런 다음 클릭하면 배경색을 변경하면 너비가 변경되지 않습니다.


3
영리한! 내가 직접 생각했으면 좋았을 텐데.
Rijul Gupta 2015 년

9
예,하지만 단색 배경이 없다면? 사용하여 내 대답을 참조하십시오border-color: transparent
에드워드 뉴웰

44

또 다른 좋은 해결책은 사용하는 outline대신 border. 상자 모델에 영향을주지 않고 테두리를 추가합니다. 이것은 IE8 +, Chrome, Firefox, Opera, Safari에서 작동합니다.

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


훌륭하지만 국경과 비교할 때 "외곽선 왼쪽, ..."이 없습니다. 제 경우에는 그렇지 않습니다.
Imskull 2015

2
그럼 내가 사용하는 것이 좋습니다 box-shadow내 다른 대답 비슷한 질문에. 동일한 브라우저 지원은 없지만 요즘에는 문제가되지 않습니다.
chowey

감사합니다 #chowey, 방금 깨달은 box-shadow한 쪽 테두리도 완벽하게 지원할 수 있습니다.
Imskull 2015

border-color: transparent... --- 내 대답을 참조 더 나은 크로스 브라우저 지원이
에드워드 뉴웰

1
이 댓글은 과소 평가되었습니다. 크기를 조정하지 않고 요소 주위에 테두리를 표시하는 좋은 방법입니다!
Sebastian Nemeth


28

이러한 솔루션을 많이 사용 border-color: transparent하면서 가장 유연하고 널리 지원되는 설정 방법 을 사용했습니다 .

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

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

더 나은 이유 :

  • 요소의 너비를 하드 코딩 할 필요가 없습니다.
  • 뛰어난 브라우저 간 지원 (IE6 만 놓 쳤음)
  • 와 달리 outline, 예를 들어 상단 및 하단 테두리를 별도로 지정할 수 있습니다.
  • 테두리 색상을 배경 색상으로 설정하는 것과 달리 배경을 변경하면이를 업데이트 할 필요가 없으며 단색이 아닌 색상 배경과 호환됩니다.

1
내 UX에서 동적으로 크기가 조정 된 항목에서 이것이 가장 잘 작동한다는 것을 알았습니다. onMouseOver에서 발생하는 크기 이동을 완전히 중지했습니다! 감사합니다 Mr. Newell!
d3r3kk

온화한. 감사합니다!
Harald Hoerwick

그게 바로 그 거예요!
사실 동안

transparent이것이 필요한 것입니다!
dimpiax

이것이 내가 필요한 것입니다 (Y)
HaxxanRaxa

20

이 시도

box-sizing: border-box;

4
이것이 답이되어야합니다.
Spets

이것이 모든 곳에서 작동하지 않는 이유는 무엇입니까? 예 : codepen.io/anon/pen/QZaBQG
Tom

안녕하세요 @Tom, 왜 아직 작동하지 않는지 잘 모르겠습니다. 그러나 귀하의 경우에는 용기의 높이를 제거하고 대신 패딩을 사용하십시오. 문제를 해결할 수 있습니다.
Hoang Trung

17

저는 보통이 문제를 해결하기 위해 패딩을 사용합니다. 테두리가 사라지면 패딩이 추가되고 테두리가 나타나면 제거됩니다. 샘플 코드 :

.good-border {
  padding: 1px;
}

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

여기에 이미지 설명 입력

JSFiddle에서 전체 샘플 코드보기 : https://jsfiddle.net/3t7vyebt/4/


1
실제로 무슨 일이 일어나고 있는지 말씀해 주시겠습니까? 혼란 스럽습니다. 왜 잘못된 경계선에 마우스를 올려 놓으면 아래로 이동합니까?
Suraj Jain

@SurajJain 마우스를 올려 놓으면 "나쁜 테두리"div의 크기가 변경되기 때문에 (테두리 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
나는 2 픽셀로 변경을 원하는 1 픽셀의 경계를했고, 내가 찾을 수있는 유일한 방법은은을 제거했다 widthheight과 추가 bottomleft받는 사람뿐만 아니라 재산을 top하고 left모두가 반대 폭으로 설정해야합니다, 원래 테두리 (내 경우 -1px). 그래도 훌륭한 해킹
Chase Sandmann

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

테두리를 위해 2px 빼기


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

0

상자 그림자 삽입을 시도 할 수 있습니다.

다음과 같이 : box-shadow : inset 0px -5px 0px 0px #fff

크기를 늘리지 않고 요소 하단에 흰색 5px 테두리를 추가합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.