CSS外边框

108
我想要在我的Div外面画一个边框!所以如果我的div是20像素乘以20像素,我想要一个1像素的边框(因此实质上,我得到一个22x22像素大的div)。
我知道我可以从一开始就让div变成22x22,但基于某些原因,我需要把边框放在外面。
CSS的outline功能可用,但我只想要底部或顶部的边框,例如outline-bottom,但这不起作用。
有没有办法做到这一点?
谢谢。

开始阅读:http://www.w3.org/TR/CSS2/box.html - Madara's Ghost
2
当您拥有虚线或透明边框并且不想看到其后面的<div>的背景,而是父容器的背景时,使用outline属性而不是border特别有用。 - BarryCap
8个回答

108
我认为您对这两个属性的理解有误。Border影响元素的外边缘,使元素在大小上不同。Outline不会改变元素的大小或位置(不占用空间),并且位于边框之外。根据您的描述,您需要使用border属性。
请在浏览器中查看下面的简单示例:

<div style="height: 100px; width: 100px; background: black; color: white; outline: thick solid #00ff00">SOME TEXT HERE</div>

<div style="height: 100px; width: 100px; background: black; color: white; border-left: thick solid #00ff00">SOME TEXT HERE</div>

注意边框如何将底部的div顶出去,但轮廓不会移动顶部的div,而实际上轮廓会重叠在底部的div上。

您可以在此处阅读更多信息:
Border(边框)
Outline(轮廓)


不是死了,只是错了,从地址栏中删除引用的单词。 - aleation

27

尝试使用轮廓属性CSS Outline

轮廓不会干扰元素/ div的宽度和长度!

请点击我在底部提供的链接查看工作演示不同的边框方式、内部/内联边框,甚至不会破坏元素尺寸大小的边框!无需像其他答案中提到的那样每次都添加额外的divs!

您还可以将边框与轮廓组合使用,并且如果需要,可以使用盒子阴影(也通过链接显示)

<head>
   <style type="text/css" ref="stylesheet">
      div {
        width:22px;
        height:22px;
        outline:1px solid black;
      }
   </style>
</head>
<div>
    outlined
</div>

通常情况下,默认情况下,'border:'会将边框放在宽度、尺寸的外部,增加整体尺寸,除非您使用'inset'值:

div {border: inset solid 1px black};

但是'outline:'是边框外的额外边框,当然仍会给元素添加额外的宽度/长度。

希望这可以帮到您

附注:我还受到启发为您制作了这个使用边框、轮廓和盒子阴影


4
概述是一种无障碍功能,以这种方式劫持它可能不是最好的选择。它的作用是为视力受损者突出显示活动元素。 - Mike Earley
box-shadow没有模糊是一个很好的解决方案 +1 - Itai Spector
一个没有模糊的盒子阴影,例如 box-shadow: 0 0 0 1px black; 是解决 Safari 上边框半径不起作用(它们是方形而不是圆角)的绝佳方案。这是一个相当普遍的问题,看起来将在16.4中得到解决 https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes 。我看到的其他解决方案可能会比较混乱 https://medium.com/@jeandesravines/use-border-radius-and-outline-simultaneously-on-safari-14ce92889e1f - nonethewiser

16

IsisCode提供了一个很好的解决方案。另一个方法是将边框div放置在父div中的内部。查看这个示例http://jsfiddle.net/A2tu9/

UPD: 您还可以使用伪元素:after (:before),在这种情况下,HTML不会因额外的标记而变得混乱:

.my-div {
    position: relative;
    padding: 4px;
    ...
}
.my-div:after {
    content: '';
    position: absolute;
    top: -3px;
    left: -3px;
    bottom: -3px;
    right: -3px;
    border: 1px #888 solid;
}

演示:http://jsfiddle.net/A2tu9/191/


如果想要使用处理程序捕获.my-div上的点击事件,请在.my-div:after上添加pointer-events:none; - Marecky

14

智能且简单! - Antonio Brandao

11

根据您的需求,我分享了两种解决方案:

<style type="text/css" ref="stylesheet">
  .border-inside-box {
    border: 1px solid black;
  }
  .border-inside-box-v1 {
    outline: 1px solid black; /* 'border-radius' not available */
  }
  .border-outside-box-v2 {
    box-shadow: 0 0 0 1px black; /* 'border-style' not available (dashed, solid, etc) */
  }
</style>

示例:https://codepen.io/danieldd/pen/gObEYKj


3
box-shadow 的运用很棒!对于底边线,可以使用 box-shadow: 0 1px 0 0 black; - Nanoo

10

我来晚了,但我遇到了类似的问题。
我的解决方案是伪元素-没有额外的标记,并且你可以绘制边框而不影响宽度。
绝对定位伪元素(相对于主要元素进行定位),然后设置。

请参见以下内容,在这里查看JSFiddle

.hello {
    position: relative;
    /* Styling not important */
    background: black;
    color: white;
    padding: 20px;
    width: 200px;
    height: 200px;
}

.hello::before {
    content: "";
    position: absolute;
    display: block;
    top: 0;
    left: -5px;
    right: -5px;
    bottom: 0;
    border-left: 5px solid red;
    border-right: 5px solid red;
    z-index: -1;
}

4
将您的div放在另一个div中,对外部div应用边框,并使用n个填充/外边距,其中n是您想要它们之间的空间。

0
尝试添加。
box-sizing: content-box;

(而不是box-sizing: border-box;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接