当将1 px边框添加到div时,div的大小会增加,不想这样做


128

单击时,我要添加1px边框到div,因此Div大小将增加2px X 2px。我不想增加div的大小。有没有简单的方法可以做到这一点?

混乱的详细说明
实际上,我正在将带有float:left(大小相同,如图标)的DIV添加到容器div中,因此所有容器都一个接一个地堆叠,并且当(container-div宽度为300px)没有横向宽度时,子DIV排在下一行,因此类似于目录,但由于边框的缘故,所选DIV的大小只会增加,因此所选DIV下的DIV会向右移动并在所选DIV下创建空白空间。

编辑:
在选择上减少高度/宽度,但是如何增加它。使用某些第三者框架,因此当DIV失去选择时不会发生任何事件。


Answers:


49

border css属性将增加所有元素的“外部”大小,表中的tds除外。您可以在html-> layout标签下直观了解Firebug的工作原理(已停产)。

举个例子,一个div的宽度和高度为10px,边框为1px,其外部宽度和高度为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类,但是所有可拖动对象都使用它,并且我有3种不同大小(3种不同类型)的Dragable对象,因此我在所有3种中保持填充相同,并在.dragdrop-selected中设置填充。 。 & 有效。:)
Nachiket

对于响应式设计,这不是一个好的解决方案。使用outline或边框颜色与背景相同(并在选择时将其颜色更改为其他颜色)更灵活。
AliBZ

1
但是,假设您需要避免对宽度进行硬编码,以使元素流动或响应视口宽度:请参阅我的回答border-color: transparent
Edward Newell,2016年

无需进行这些计算,只需将box-sizing设置为border-box。请参阅下面的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
box-sizing:应该将边界框设置为所有现代最佳实践。参见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


太好了,但是与border相比,没有“ outline-left,...”,这不是我的情况。
Imskull 2015年

2
然后,我建议使用box-shadow我对方的回答上一个类似的问题。它没有相同的浏览器支持,但是如今这已不再是一个问题。
chowey 2015年

谢谢#chowey,刚刚意识到 box-shadow也可以支持单边边界,完美的解决方案。
Imskull

border-color: transparent具有更好的跨浏览器支持---请参阅我的答案...
Edward Newell

1
此评论被低估。这是在不调整元素大小的情况下获得边框的好方法!
塞巴斯蒂安·内梅斯


28

使用了许多这些解决方案后,我发现使用设置的技巧border-color: transparent是最灵活和得到广泛支持的:

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

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

为什么更好:

  • 无需对元素的宽度进行硬编码
  • 强大的跨浏览器支持(仅缺少IE6)
  • 与相比outline,您仍然可以分别指定顶部和底部边框
  • 与将边框颜色设置为背景的颜色不同,如果更改背景,则无需更新此颜色,并且它与非纯色背景兼容。

1
我发现这与UX中动态调整大小的项目配合使用效果最佳。完全停止了onMouseOver发生的大小移动!谢谢纽厄尔先生!
d3r3kk

和可亲 谢谢!
Harald Hoerwick '17

就是那个!
虽然是真实的

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边框)。
芹苴


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,我能找到这样做的唯一方式是通过除去widthheight并添加bottomleft除财产topleft,所有这些都应该被设置为相反的宽度原始边框(在我的情况下为-1px)。大劈虽然
大通海圣德曼


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

调整以适应您的偏爱外观,您就该做好了!



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
Edward Newell

或全部一起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边框,而无需增加大小

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.