CSS内嵌边框


74

我需要创建一个单色插入边框。这是我正在使用的CSS:

border: 10px inset rgba(51,153,0,0.65);

不幸的是,这会创建3D脊状边框(忽略正方形和深色说明框)


4
CSS中定义的边框始终添加到框的外部,它永远不会折叠到框内并在框后重叠内容。您必须在其顶部添加另一个框。
animuson

4
图片链接已消失...
Matthieu

Answers:


155

您可以使用box-shadow,可能是:

#something {
    background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
    min-width: 300px;
    min-height: 300px;
    box-shadow: inset 0 0 10px #0f0;
}

这样的好处是它将覆盖的背景图像div,但是当然会模糊(正如您希望从box-shadow属性中看到的那样)。要建立density阴影的阴影,您当然可以添加其他阴影:

#something {
    background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
    min-width: 300px;
    min-height: 300px;
    box-shadow: inset 0 0 20px #0f0, inset 0 0 20px #0f0, inset 0 0 20px #0f0;
}


编辑因为我意识到,我是个白痴,忘了提供简单的解决方案首先,它是使用,否则空的子元素应用在背景的边界:

#something {
  background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
  min-width: 300px;
  min-height: 300px;
  padding: 0;
  position: relative;
}
#something div {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  border: 10px solid rgba(0, 255, 0, 0.6);
}
<div id="something">
  <div></div>
</div>


@CoryDanielson的评论之后进行编辑,如下所示

jsfiddle.net/dPcDu/2中,您可以为其添加第4个px参数,以box-shadow进行传播并更轻松地反映其图像。

#something {
  background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
  min-width: 300px;
  min-height: 300px;
  box-shadow: inset 0 0 0 10px rgba(0, 255, 0, 0.5);
}
<div id="something"></div>


10
jsfiddle.net/dPcDu/2,您可以为框阴影添加第4 px参数,以进行扩散并更轻松地反映他的图像
Cory Danielson

1
@CoryDanielson:哦..!我从来没有意识到该text-shadow属性有第四个(大概)“宽度(但不模糊...)”选项!太棒了!=)在中编辑,谢谢。
大卫说,请恢复莫妮卡(Monica)

2
是的,一些关于盒子阴影的教程在记录它方面做得很糟糕...盒子阴影上的大多数“覆盖率”非常不一致且很差...它因自身的优点而太受欢迎了...在我之前了解了第4个扩散参数后,我会做10个1px阴影...这太可怕了。框阴影和文本阴影应该更加一致...等等。x,y,blur,spread
科里·丹尼尔森

1
您的空div示例是好东西,我不知道您可以将top,left,right,bottom都指定为0,它会那样工作.. soooo窃取了它。。。 [该死的。
科里·丹尼尔森

1
@CoryDanielson:position: absolute;带有全零的可以在IE中正常工作,不起作用的是background-color(IE无法理解rgba()表示法):请参见最新的Fiddle
大卫说恢复莫妮卡(Monica)

36

我建议使用box-sizing

*{
  -webkit-box-sizing:border-box;
  -moz-box-sizing:border-box;
  -ms-box-sizing:border-box;
  box-sizing:border-box;
}

#bar{
  border: 10px solid green;
  }

1
据我所知,这不适用于任何盒子大小的模型。
podperson

1
为我工作。(由于SO是幼稚的,所以添加了注释)
Glenn Maynard

这对于我来说很有效,在这种情况下,一个框被划分为两个平行元素,每个平行元素分别占框的一半,并且边框的宽度使内联显示更加混乱。
Mike Lyons 2013年

考虑*{box-sizing: border-box;}未来的项目。来源-paulirish.com/2012/box-sizing-border-box-ftw
Stefan Hans Schonert 2013年

2
这没有实现所需的功能。询问者正在寻找可以覆盖的边界。该解决方案仅确保在应用边框时,整体大小不会增加。
user1275105 '16

17

要在元素中产生边框插图,我发现的唯一解决方案(并且我尝试了该线程中的所有建议都无济于事)是使用伪元素,例如:before

例如

.has-inset-border:before {
  content: "foo"; /* you need something or it will be invisible at least on Chrome */
  color: transparent;
  position: absolute;
  left: 10px;
  right: 10px;
  top: 10px;
  bottom: 10px;
  border: 4px dashed red;
}

box-sizing属性将不起作用,因为边框总是在所有内容之外。

box-shadow选项具有双重缺点,即不能真正起作用并且不能得到广泛支持(如果需要的话,将花费更多的CPU周期渲染)。


1
这在span等上效果很好; 我看到Facebook也使用这种技术。请注意,在大多数浏览器中,:before和:after不适用于IMG元素。
Louis Ameline 2014年

只是想说好工作:)
Wes Duff,2015年

@Evan:好点(而且没有伪元素的img标签是
不计其数的

1
很好的解决方案-效果很好。这应该在页面上方!
Liran H 2015年

谢谢!轻松解决此问题的最佳方法!
clayRay

13

这是一个老把戏,但我仍然发现最简单的方法是使用负值的轮廓偏移量(以下示例使用-6px)。这是一个小玩意儿-我将外部边界设为红色,将轮廓设为白色,以区分两者:

.outline-offset {
width:300px;
height:200px;
background:#333c4b;
border:2px solid red;
outline:2px #fff solid;
outline-offset:-6px;
}

<div class="outline-offset"></div>

1
可以,只是不会在插入轮廓上添加曲线(请参见更新的小提琴jsfiddle.net/vf2daLqe/4)。它在很多情况下都很容易使用,但是如果您想要更复杂的东西,那么另一种方法会更好-感谢指出这一点!
凡妮莎·金

5

如果要确保边框位于元素的内部,则可以使用

box-sizing:border-box;

这将在元素的内部放置以下边框:

border: 10px solid black;

(您会inset在box-shadow上使用additonal参数得到类似的结果,但是这是针对真实边框的,您仍然可以将阴影用于其他内容。)

请注意上面的另一个答案:一旦insetbox-shadow某个元素上使用任意一个,则该元素上最多只能有2个框阴影,并且需要使用wrapper div进行进一步的阴影处理。

两种解决方案都应该使您摆脱不必要的3D效果。还要注意两个解决方案都是可堆叠的(请参阅我在2018年添加的示例)

.example-border {
  width:100px;
  height:100px;
  border:40px solid blue;
  box-sizing:border-box;
  float:left;
}

.example-shadow {
  width:100px;
  height:100px;
  float:left;
  margin-left:20px;
  box-shadow:0 0 0 40px green inset;
}

.example-combined {
  width:100px;
  height:100px;
  float:left;
  margin-left:20px;
  border:20px solid orange;
  box-sizing:border-box;
  box-shadow:0 0 0 20px red inset;
}
<div class="example-border"></div>
<div class="example-shadow"></div>
<div class="example-combined"></div>


3

我不知道您要比较什么。

但是,一个超级简单的方法,具有边框的外观插图相对于其他非接壤的项目是将添加border: ?px solid transparent;到任何项目都没有边框。

它将使带边框的项目看起来像嵌入式的。

http://jsfiddle.net/cmunns/cgrtd/


1

具有伪元素的简单SCSS解决方案

现场演示:https : //codepen.io/vlasterx/pen/xaMgag

// Change border size here
$border-width: 5px;

.element-with-border {
	display: flex;
	height: 100px;
	width: 100%;
	position: relative;
	background-color: #f2f2f2;
	box-sizing: border-box;
	
	// Use pseudo-element to create inset border
	&:before {
		position: absolute;
		content: ' ';
		display: flex;
		border: $border-width solid black;
		left: 0;
		right: 0;
		top: 0;
		bottom: 0;
		border: $border-width solid black;
		// Important: We must deduct border size from width and height
		width: calc(100% - $border-width); 
		height: calc(100% - $border-width);
	}
}
<div class="element-with-border">
  Lorem ipsum dolor sit amet
</div>


0

如果box-sizing不是一种选择,那么执行此操作的另一种方法是使其成为size元素的子元素。

演示版

的CSS

.box {
  width: 100px;
  height: 100px;
  display: inline-block;
  margin-right: 5px;
}
.border {
  border: 1px solid;
  display: block;
}
.medium { border-width: 10px; }
.large  { border-width: 25px; }


的HTML

<div class="box">
  <div class="border small">A</div>
</div>
<div class="box">
  <div class="border medium">B</div>
</div>
<div class="box">
  <div class="border large">C</div>
</div>

0

您可以使用background-clip:border-box;

例:

.example {
padding: 2em;
border: 10px solid rgba(51,153,0,0.65);
background-clip: border-box;
background-color: yellow;
}

<div class="example">Example with background-clip: border-box;</div>

0

所以我试图在边框上显示一个边框,但是它移动了主菜单的整个底部栏,看起来好像不太好,我通过以下方法进行了修复:

#top-menu .menu-item a:hover {
    border-bottom:4px solid #ec1c24;
    padding-bottom:14px !important;
}
#top-menu .menu-item a {
    padding-bottom:18px !important;
}

我希望这会对外面的人有所帮助。



-1

我知道这已经三岁了,但是认为这可能对某人有所帮助。

概念是使用:after(或:before)选择器在父元素内放置边框。

    .container{
        position:relative; /*Position must be set to something*/
    }

    .container:after{
        position:relative;
        top: 0;
        content:"";
        left:0;
        height: 100%; /*Set pixel height and width if not defined in parent element*/
        width: 100%; 

        -webkit-box-sizing:border-box;
        -moz-box-sizing:border-box;
        -ms-box-sizing:border-box;
        box-sizing:border-box;

        border:1px solid #000; /*set your border style*/

    }

我不明白为什么这个答案有负数,这是一个完全有效的解决方案,尽管您不需要伪元素中的相对位置,也不需要top和left属性,但这仍然是一个非常有效的解决方案
Miguel SánchezVillafán20年
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.