Khi viền 1 px được thêm vào div, kích thước Div tăng, Đừng muốn làm điều đó


128

Khi nhấp vào tôi đang thêm, viền 1px thành div, vì vậy kích thước Div tăng thêm 2px X 2px. Tôi không muốn tăng kích thước div. Có cách nào đơn giản để làm như vậy?

Giải thích chi tiết lộn xộn
Trên thực tế, tôi đang thêm các DIV với float: left (cùng kích thước, giống như các biểu tượng) vào một container-div, vì vậy tất cả xếp chồng lên nhau và khi (chiều rộng của div là 300px) không có khoảng trống nào có chiều rộng các DIV con đến ở hàng tiếp theo, vì vậy nó giống như danh mục, nhưng do đường viền chỉ chọn kích thước DIV được tăng lên, DIV bên dưới DIV được chọn đi sang phải và tạo khoảng trống bên dưới DIV đã chọn.

EDIT:
Giảm chiều cao / chiều rộng khi chọn, nhưng làm thế nào để tăng trở lại. Sử dụng một số khung bên thứ 3, do đó, không có sự kiện khi DIV mất lựa chọn ..


Câu trả lời:


49

Thuộc tính css viền sẽ tăng tất cả các yếu tố kích thước "bên ngoài", ngoại trừ tds trong bảng. Bạn có thể có được một ý tưởng trực quan về cách thức hoạt động của nó trong Fireorms (đã ngừng ), trong tab bố cục html->.

Chỉ là một ví dụ, một div có chiều rộng và chiều cao 10px và đường viền 1px, sẽ có chiều rộng và chiều cao bên ngoài là 12px.

Đối với trường hợp của bạn, để làm cho nó xuất hiện giống như đường viền nằm ở "bên trong" của div, trong lớp CSS đã chọn của bạn, bạn có thể giảm chiều rộng và chiều cao của phần tử bằng cách nhân đôi kích thước đường viền của mình hoặc bạn có thể làm tương tự cho các yếu tố đệm.

Ví dụ:

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

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

Thnx, tôi đã chọn lớp .dragdrop nhưng nó được sử dụng bởi tất cả các đối tượng có thể kéo và tôi có 3 đối tượng Dragable có kích thước khác nhau, vì vậy tôi tiếp tục đệm giống nhau trong cả 3 VÀ đặt padding trong .dragdrop được chọn. . & nó đã làm việc. :)
Nachiket

Đây không phải là một giải pháp tốt cho các thiết kế đáp ứng. Sử dụng outlinehoặc một đường viền có cùng màu với nền (và thay đổi màu của nó sang màu khác khi được chọn) sẽ linh hoạt hơn.
AliBZ

1
Nhưng giả sử bạn cần tránh mã hóa độ rộng, để cho phần tử chảy hoặc đáp ứng với độ rộng cổng xem: xem câu trả lời của tôi bằng cách sử dụngborder-color: transparent
Edward Newell

Không cần những tính toán này, chỉ cần đặt kích thước hộp thành hộp viền. Xem câu trả lời của ejfrancis bên dưới , và xem bài viết này .
ngày

Bạn có chắc chắn về td trong bảng? Trong Chrome dường như vẫn thêm kích thước.
Người bảo vệ một

105

Điều này cũng hữu ích trong kịch bản này. nó cho phép bạn đặt đường viền mà không thay đổi độ rộng 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+ */
}

Lấy từ http://css-tricks.com/box-sizing/


4
box-sizing: Border-box nên thực sự được đặt trên mọi thứ như một cách thực hành tốt nhất hiện đại. Xem paulirish.com/2012/box-sizing-border-box-ftw
jbyrd

6
Điều này dường như không hoạt động trong một số trường hợp; không chắc chắn chính xác tại sao. Xem: codepen.io/anon/pen/QZaBQG
Wilson

51

đặt đường viền trên nó trước khi bạn nhấp vào cùng màu với nền.

Sau đó, khi bạn nhấp vào chỉ cần thay đổi màu nền và chiều rộng sẽ không thay đổi.


3
Khéo léo! ước gì tôi đã nghĩ về nó
Rijul Gupta

9
Vâng, nhưng nếu bạn không có một nền màu vững chắc? Xem câu trả lời của tôi bằng cách sử dụngborder-color: transparent
Edward Newell

44

Một giải pháp tốt khác là sử dụng outlinethay vì border. Nó thêm một đường viền mà không ảnh hưởng đến mô hình hộp. Điều này hoạt động trên IE8 +, Chrome, Firefox, Opera, Safari.

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


Thật tuyệt, nhưng so với biên giới, không có "phác thảo bên trái, ...", không dành cho trường hợp của tôi.
Imskull

2
Sau đó, tôi khuyên bạn nên sử dụng box-shadowmỗi câu trả lời khác của tôi cho một câu hỏi tương tự. Nó không có cùng hỗ trợ trình duyệt, nhưng đó không phải là vấn đề ngày nay.
chowey

Cảm ơn bạn #chowey, vừa nhận ra box-shadowcó thể hỗ trợ biên giới một phía, giải pháp hoàn hảo.
Imskull

border-color: transparentcó hỗ trợ nhiều trình duyệt tốt hơn --- xem câu trả lời của tôi ...
Edward Newell

1
Nhận xét này được đánh giá thấp. Đó là một cách tuyệt vời để có được một đường viền xung quanh một yếu tố mà không thay đổi kích thước nó!
Sebastian Nemeth

42

Hãy thử đổi borderthành outline:

outline: 1px solid black;

8
Hoạt động trừ khi bạn có bán kính đường viền.
Jean-Marie Dalmasso

28

Đã sử dụng nhiều giải pháp trong số này, tôi thấy việc sử dụng thủ thuật cài đặt border-color: transparentlà linh hoạt nhất và được hỗ trợ rộng rãi:

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

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

Tại sao nó tốt hơn:

  • Không cần mã hóa độ rộng của phần tử
  • Hỗ trợ nhiều trình duyệt tuyệt vời (chỉ IE6 bị bỏ lỡ)
  • Không giống như outline, bạn vẫn có thể chỉ định riêng, ví dụ: viền trên và dưới riêng biệt
  • Không giống như cài đặt màu đường viền thành màu nền, bạn không cần cập nhật màu này nếu bạn thay đổi nền và nó tương thích với nền màu không rắn.

1
Tôi thấy điều này hoạt động tốt nhất với các mục có kích thước động trong UX của tôi. Đã dừng hoàn toàn việc thay đổi kích thước xảy ra trênMouseOver! Cảm ơn ông Newell!
d3r3kk

Thể loại. Cảm ơn bạn!
Harald Hoerwick

Đó là một trong những!
trong khi đúng

transparentđây là những gì cần thiết
dimpiax

Đây là những gì tôi cần (Y)
HaxxanRaxa

20

Thử cái này

box-sizing: border-box;

4
Đây nên là câu trả lời, bụi bẩn đơn giản.
Spets

Tại sao điều này không hoạt động ở khắp mọi nơi? Ví dụ: codepen.io/anon/pen/QZaBQG
Tom

xin chào @Tom, tôi không chắc tại sao nó chưa hoạt động. Nhưng trong trường hợp của bạn, vui lòng xem xét để loại bỏ chiều cao trong container và sử dụng phần đệm thay thế. Có thể giải quyết vấn đề của bạn.
Hoàng Trung

17

Tôi thường sử dụng phần đệm để giải quyết vấn đề này. Phần đệm sẽ được thêm vào khi đường viền biến mất và loại bỏ khi đường viền xuất hiện. Mã mẫu:

.good-border {
  padding: 1px;
}

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

nhập mô tả hình ảnh ở đây

Xem mã mẫu đầy đủ của tôi trên JSFiddle: https://jsfiddle.net/3t7vyebt/4/


1
Bạn có thể cho tôi biết những gì đang thực sự xảy ra, tôi bối rối, tại sao ở biên giới xấu lại di chuyển xuống dưới khi bạn di chuột qua nó?
Suraj Jain

@SurajJain Vì kích thước của div "viền xấu" sẽ bị thay đổi (thêm 1px đường viền) khi bạn di chuột qua nó.
Thổ

6

Chỉ cần giảm chiều rộng và chiều cao gấp đôi chiều rộng đường viền


3

Bạn có thể làm một số điều ưa thích với bóng trong. Ví dụ để đặt đường viền ở dưới cùng của một phần tử mà không thay đổi kích thước của nó:

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

3

Đôi khi bạn không muốn chiều cao hoặc chiều rộng bị ảnh hưởng mà không thiết lập rõ ràng. Trong trường hợp đó, tôi thấy hữu ích khi sử dụng các yếu tố giả.

.border-me {
    position: relative;
}

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

Bạn cũng có thể làm nhiều hơn với phần tử giả vì vậy đây là một mẫu khá mạnh mẽ.


1
Tôi đã có một biên giới 1px mà tôi muốn thay đổi để 2px, và cách duy nhất tôi có thể tìm để làm điều đó là bằng cách loại bỏ widthheightvà thêm một bottomlefttài sản ngoài topleft, tất cả đều phải được thiết lập để chiều rộng đối diện của đường viền gốc (trong trường hợp của tôi -1px). Tuyệt vời hack mặc dù
Chase Sandmann

2

Hãy thử giảm kích thước lề khi bạn tăng đường viền


2

Tôi cần có khả năng "viền" bất kỳ phần tử nào bằng cách thêm một lớp và không ảnh hưởng đến kích thước của nó. Một giải pháp tốt cho tôi là sử dụng bóng hộp. Nhưng trong một số trường hợp, hiệu quả không thể nhìn thấy do anh chị em khác. Vì vậy, tôi đã kết hợp cả bóng hộp điển hình cũng như bóng hộp bên trong. Kết quả là một cái nhìn biên giới mà không thay đổi bất kỳ kích thước.

Các giá trị được phân tách bằng dấu phẩy. Đây là một ví dụ đơn giản:

.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

Điều chỉnh cho giao diện ưa thích của bạn và bạn tốt để đi!


2

Chúng ta cũng có thể sử dụng hàm css calc ()

width: calc(100% - 2px);

trừ 2px cho viền


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

1
Tôi nghĩ rằng nó sẽ hữu ích hơn cho OP và khách truy cập xa hơn, khi bạn thêm một số giải thích cho cường độ của bạn.
Phóng viên

1

Bạn có thể tạo phần tử có viền với cùng màu của nền, sau đó khi bạn muốn viền hiển thị, chỉ cần thay đổi màu của nó.


1
Vâng, nhưng giả sử nền của bạn không phải là màu đặc ... hãy xem phản hồi của tôi dựa trên việc sử dụngborder-color: transparent
Edward Newell

Hoặc tất cả cùng nhau nhưul li a{border-bottom:2px solid transparent;} ul li a:hover{border-bottom:2px solid red;}
stackunderflow 7/2/2017

0

Trong trường hợp nội dung của bạn divđược hiển thị linh hoạt và bạn muốn đặt chiều cao của nó, bạn có thể sử dụng một mẹo đơn giản với outline:

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

button:hover {
    outline-color: transparent;
}

Ví dụ ở đây: https://codepen.io/Happysk/pen/zeQzaZ


Phác thảo không có góc tròn đáng tiếc :(
M3RS

0

Bạn có thể thử một hình hộp bóng

đại loại như thế này: box-Shadow: inet 0px -5px 0px 0px #fff

thêm viền 5px trắng vào dưới cùng của phần tử mà không tăng kích thước

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.