如何仅显示角边框?

Posted

技术标签:

【中文标题】如何仅显示角边框?【英文标题】:How can I show only corner borders? 【发布时间】:2013-01-01 12:00:27 【问题描述】:

我想知道是否可以在 CSS 中制作边框但仅用于角。像这样的:

****                         ****
*                               *
*                               *

             CONTENT

*                               *
*                               *
****                         ****

【问题讨论】:

看看border-image:css-tricks.com/understanding-border-image 从 SO ***.com/questions/1011508/…试试这个 【参考方案1】:

到目前为止没有人提到的一个选项是使用多个box-shadow 来模拟这种类型的边框。每个角落都需要一个 box-shadow:

div 
  width: 150px;
  height: 150px;
  padding: 10px;
  box-shadow:
    -80px -80px 0 -70px black,
     80px -80px 0 -70px black,
    -80px  80px 0 -70px black,
     80px  80px 0 -70px black;
<div>I am a box with borders only in the corners.</div>

它的工作原理是有四个阴影(左上、右上、右下、左下)并使用负扩展半径减小它们的大小(模糊半径将保持为零):

box-shadow: offset-x offset-y [blur-radius] [spread-radius] [color];

虽然这是可行的(即使在 IE 上!)并且它是一种简单的方法(不需要额外的元素或伪元素),但它有两个很大的不足:

    您需要知道盒子的大小才能相应地调整 box-shadow 的值(或者至少有一个大致的想法来调整阴影的值,因为它们不接受百分比)。 角不会完全成正方形。相反,它们将与盒子大小成正比。这可以通过使用 8 个阴影而不是 4 个来避免,但是那样事情就会变得一团糟。

最后,使用背景渐变可能是更好的选择,并且可以提供“更多控制”,因为它都在框内。它可以通过 4 个线性梯度来实现(一些答案表示 8 个):

div 
  --size: 32px;
  width: 100px;
  height: 100px;
  padding: 10px;
  background:
    linear-gradient(blue var(--size), transparent 0 calc(100% - var(--size)), blue 0) 0 0 / 4px 100%,
    linear-gradient(blue var(--size), transparent 0 calc(100% - var(--size)), blue 0) 100% 0 / 4px 100%,
    linear-gradient(to right, blue var(--size), transparent 0 calc(100% - var(--size)), blue 0) 0 0 / 100% 4px,
    linear-gradient(to right, blue var(--size), transparent 0 calc(100% - var(--size)), blue 0) 0 100% / 100% 4px
    ;
  background-repeat: no-repeat;
<div>I am a box with borders only in the corners.</div>

【讨论】:

【参考方案2】:

这是一个使用渐变和 CSS 变量的想法,您可以轻松控制边框的形状:

.box 
  --b:5px;   /* thickness of the border */
  --c:red;   /* color of the border */
  --w:20px;  /* width of border */
  

  border:var(--b) solid transparent; /* space for the border */
  --g:#0000 90deg,var(--c) 0;
  background:
    conic-gradient(from 90deg  at top    var(--b) left  var(--b),var(--g)) 0    0,
    conic-gradient(from 180deg at top    var(--b) right var(--b),var(--g)) 100% 0,
    conic-gradient(from 0deg   at bottom var(--b) left  var(--b),var(--g)) 0    100%,
    conic-gradient(from -90deg at bottom var(--b) right var(--b),var(--g)) 100% 100%;
  background-size:var(--w) var(--w);
  background-origin:border-box;
  background-repeat:no-repeat;
  
  /*Irrelevant code*/  
  width:200px;
  height:100px;
  box-sizing:border-box;
  margin:5px;
  display:inline-flex;
  font-size:30px;
  justify-content:center;
  align-items:center;
  line-height:90px;
<div class="box">
some content
</div>

<div class="box" style="--c:blue;--w:40px;--b:2px">
some content
</div>

<div class="box" style="--c:green;--w:30%;--b:8px">
some content
</div>

<div class="box" style="--c:black;--w:50%;--b:3px">
some content
</div>

<div class="box" style="--c:purple;--w:10px;--b:10px">
some content
</div>

<div class="box" style="--c:orange;--w:calc(50% - 10px);--b:4px">
some content
</div>

如果你把它和蒙版结合起来,你也可以有一个复杂的颜色:

.box 
  --b:5px;   /* thickness of the border */
  --c:red;   /* color of the border */
  --w:20px;  /* width of border */
  

  padding:var(--b); /* space for the border */
  
  position:relative;
  /*Irrelevant code*/  
  width:200px;
  height:100px;
  box-sizing:border-box;
  margin:5px;
  display:inline-flex;
  font-size:30px;
  justify-content:center;
  align-items:center;
  line-height:90px;

.box::before 
  content:"";
  position:absolute;
  top:0;
  left:0;
  right:0;
  bottom:0;
  background:var(--c,red);
  --g:#0000 90deg,#000 0;
  -webkit-mask:
    conic-gradient(from 90deg  at top    var(--b) left  var(--b),var(--g)) 0    0,
    conic-gradient(from 180deg at top    var(--b) right var(--b),var(--g)) 100% 0,
    conic-gradient(from 0deg   at bottom var(--b) left  var(--b),var(--g)) 0    100%,
    conic-gradient(from -90deg at bottom var(--b) right var(--b),var(--g)) 100% 100%;
  -webkit-mask-size:var(--w) var(--w);
  background-origin:border-box;
  -webkit-mask-repeat:no-repeat;
  mask:
    conic-gradient(from 90deg  at top    var(--b) left  var(--b),var(--g)) 0    0,
    conic-gradient(from 180deg at top    var(--b) right var(--b),var(--g)) 100% 0,
    conic-gradient(from 0deg   at bottom var(--b) left  var(--b),var(--g)) 0    100%,
    conic-gradient(from -90deg at bottom var(--b) right var(--b),var(--g)) 100% 100%;
  mask-size:var(--w) var(--w);
  mask-repeat:no-repeat;
<div class="box">
some content
</div>

<div class="box" style="--c:repeating-linear-gradient(45deg,red,blue);--w:40px;--b:2px">
some content
</div>

<div class="box" style="--c:repeating-linear-gradient(90deg,#000 0 5px,transparent 5px 10px);--w:30%;--b:8px">
some content
</div>

<div class="box" style="--c:conic-gradient(red,green,yellow);--w:50%;--b:3px">
some content
</div>

<div class="box" style="--c:purple;--w:10px;--b:10px">
some content
</div>

<div class="box" style="--c:repeating-linear-gradient(45deg,orange 0 5px,blue 5px 10px);--w:calc(50% - 10px);--b:4px">
some content
</div>

为什么不用半径:

.box 
  --b:5px;   /* thickness of the border */
  --c:red;   /* color of the border */
  --w:20px;  /* width of border */
  --r:25px;  /* radius */
  

  padding:var(--b); /* space for the border */
  
  position:relative;
  /*Irrelevant code*/  
  width:200px;
  height:100px;
  box-sizing:border-box;
  margin:5px;
  display:inline-flex;
  font-size:30px;
  justify-content:center;
  align-items:center;
  line-height:90px;

.box::before 
  content:"";
  position:absolute;
  top:0;
  left:0;
  right:0;
  bottom:0;
  background:var(--c,red);
  padding:var(--b);
  border-radius:var(--r);
  -webkit-mask:
    linear-gradient(#fff 0 0) top   /calc(100% - 2*var(--w)) var(--b),
    linear-gradient(#fff 0 0) bottom/calc(100% - 2*var(--w)) var(--b),
    linear-gradient(#fff 0 0) left  /var(--b) calc(100% - 2*var(--w)),
    linear-gradient(#fff 0 0) right / var(--b) calc(100% - 2*var(--w)),
    linear-gradient(#fff 0 0) content-box,
    linear-gradient(#fff 0 0);
  -webkit-mask-composite:destination-out;
  -webkit-mask-repeat:no-repeat;
  mask:
    linear-gradient(#fff 0 0) top   /calc(100% - 2*var(--w)) var(--b),
    linear-gradient(#fff 0 0) bottom/calc(100% - 2*var(--w)) var(--b),
    linear-gradient(#fff 0 0) left  /var(--b) calc(100% - 2*var(--w)),
    linear-gradient(#fff 0 0) right / var(--b) calc(100% - 2*var(--w)),
    linear-gradient(#fff 0 0) content-box,
    linear-gradient(#fff 0 0);
  mask-composite:exclude;
  mask-repeat:no-repeat;
<div class="box">
some content
</div>

<div class="box" style="--c:repeating-linear-gradient(45deg,red,blue);--w:40px;--b:2px;--r:40px;">
some content
</div>

<div class="box" style="--c:repeating-linear-gradient(90deg,#000 0 5px,transparent 5px 10px);--w:30%;--b:8px">
some content
</div>

<div class="box" style="--c:conic-gradient(red,green,yellow);--w:50%;--b:3px">
some content
</div>

<div class="box" style="--c:purple;--w:10px;--b:10px;--r:0px">
some content
</div>

<div class="box" style="--c:repeating-linear-gradient(45deg,orange 0 5px,blue 5px 10px);--w:calc(50% - 10px);--b:4px;--r:10px">
some content
</div>

【讨论】:

我喜欢这个。它没有固执己见,并接受参数。太棒了! 我从来没有想过使用内联样式设置变量,这真的很酷! 太棒了!必须是最佳答案【参考方案3】:
.border_coners 
      background:
        linear-gradient(to right, #e5e5e5 1px, transparent 1px) 0 0,
        linear-gradient(to right, #e5e5e5 1px, transparent 1px) 0 100%,
        linear-gradient(to left, #e5e5e5 1px, transparent 1px) 100% 0,
        linear-gradient(to left, #e5e5e5 1px, transparent 1px) 100% 100%,
        linear-gradient(to bottom, #e5e5e5 1px, transparent 1px) 0 0,
        linear-gradient(to bottom, #e5e5e5 1px, transparent 1px) 100% 0,
        linear-gradient(to top, #e5e5e5 1px, transparent 1px) 0 100%,
        linear-gradient(to top, #e5e5e5 1px, transparent 1px) 100% 100%;
      background-repeat: no-repeat;
      background-size: 50px 50px;
               

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案4】:

您绝对可以定位四个&lt;div&gt;s,每个角落一个,每个都有适当的两个边框。

.corners 
  position: relative;
  width: 50px; /* for demo purposes */
  padding: 10px;


.top, .bottom 
  position: absolute;
  width: 20px;
  height: 20px;
  pointer-events: none;


.top 
  top: 0;
  border-top: 1px solid;


.bottom 
  bottom: 0;
  border-bottom: 1px solid;


.left 
  left: 0;
  border-left: 1px solid;


.right 
  right: 0;
  border-right: 1px solid;
<div class="corners">
  <div class="top left"></div>
  <div class="top right"></div>
  <div class="bottom right"></div>
  <div class="bottom left"></div>
  content goes here
</div>

【讨论】:

是的,我就是这么做的,而且效果很好。我可以补充一点,我使用了 css 参数:pointer-events:none;保持角落 div 后面的内容处于活动状态。【参考方案5】:

剪辑路径

在彼此之上使用两个 div。 并在后面的 div 中添加一个剪辑路径,您可以创建类似边框的效果。

.wrapper 
  display: inline-block;
  background-color: black;
  line-height: 0px;
  -webkit-clip-path: polygon(0% 100%, 30% 100%, 30% 70%, 70% 70%, 70% 100%, 100% 100%, 100% 70%, 70% 70%, 70% 30%, 100% 30%, 100% 0%, 70% 0%, 70% 30%, 30% 30%, 30% 0%, 0% 0%, 0% 30%, 30% 30%, 30% 70%, 0% 70%);
    clip-path: polygon(0% 100%, 
                             30% 100%, 
                             30% 70%, 
                             70% 70%, 
                             70% 100%, 
                             100% 100%, 
                             100% 70%, 
                             70% 70%,
                             70% 30%,
                             100% 30%,
                             100% 0%,
                             70% 0%,
                             70% 30%,
                             30% 30%,
                             30% 0%,
                             0% 0%,
                             0% 30%,
                             30% 30%,
                             30% 70%,
                             0% 70%);

.wrapper  .wrapper div 
  display: inline-block;
  height: 150px;
  width: 150px;
  margin: 10px;
  background-color: white;
<div class="wrapper">
  <div></div>
</div>

两个伪元素

使用两个大的伪元素可以创建边框效果。

.cut-border 
  position: relative;
  display: inline-block;
  border: 5px solid black;
  width: 150px;
  height: 150px;

.cut-border::before 
  content: "";
  position: absolute;
  height: calc(100% + 10px);
  width: 50%;
  background-color: white;
  top: -5px;
  left: 25%;

.cut-border::after 
  content: "";
  position: absolute;
  height: 50%;
  width: calc(100% + 10px);
  background-color: white;
  top: 25%;
  left: -5px;
&lt;div class="cut-border"&gt;&lt;/div&gt;

【讨论】:

【参考方案6】:

我采纳了 Majid Laissi 的回答,并修改为更易于理解、简单且易于修改。

img
  width:70px;
  height:70px;
  position:absolute;
  top:50%;
  left:50%;
  transform:translate(-50%,-50%);


.custom-corners 
  position: relative;
  width: 150px;
  height: 150px;
  background-color: white;
  border: 1px solid black;


.custom-corners:before 
  content: '';
  position: absolute;
  top: -1px;
  left: -1px;
  border: 1px solid #fff;
  height: 100%;
  width: 100%;
  border-radius: 10%;


.custom-corners:after 
  content: '';
  position: absolute;
  bottom: -1px;
  right: -1px;
  border: 1px solid #fff;
  height: 100%;
  width: 100%;
  border-radius: 10%;
<div class="custom-corners">
  <img src="https://cdn.logo.com/hotlink-ok/logo-social-sq.png" >
</div>

【讨论】:

【参考方案7】:

我调整了边框半径的方法,但我不想使用绝对定位或必须知道内容的大小。

幸运的是,在各个方向设置负边距提供了我们需要的一切:

.corner-borders 
    border: 1px solid #ccc;


.corner-borders-reveal 
    border-radius: 20%; /* or any other size */
    border: 1px solid white;
    margin: -1px;
    padding: 4px;
 

【讨论】:

【参考方案8】:

我喜欢@Tims 方法,但它迫使我为框设置背景颜色,这是我不想要的,因为我将焦点放在背景图像对象上。 在我的例子中,我也只需要 2 条边,这使得它的结构可以稍微不同。

因此,我对其进行了一些不同的构建,使其更加灵活,并且仍然适用于所有浏览器。

如果您需要 4 个角,则该解决方案不起作用,只是想将其留在这里以供将来的搜索者使用。

:root 
  --border-width: 5px;
  --corner-size: 20px;
  --border-color: red;

    
.box-corners 
  position:relative;


        .box-corners::before,
        .box-corners::after 
            content: "";
            position: absolute;
            width:var(--corner-size);
            height:var(--corner-size);
            border:var(--border-width) solid var(--border-color);
        
    
        .box-corners::before 
            left: 0;
            top: 0;
            border-bottom:none;
            border-right:none;
        
    
        .box-corners::after 
            bottom: 0;
            right: 0;
            border-left:none;
            border-top:none;
        
        
        
/* ############## THIS IS JUST OPTIONAL FOR THE HOVER EFFECT ############# */


    .box-corners 
        transition:background-color 0.3s ease-in-out;
    


    .box-corners:hover 
        background:rgba(0, 0, 0, 0.5)!important;
    

        .box-corners::before,
        .box-corners::after 
            box-sizing:border-box;
            transition:width 0.3s ease-in-out, height 0.3s ease-in-out;
        

        .box-corners:hover::before,
        .box-corners:hover::after 
            width:100%;
            height:100%;
        
&lt;div class="box-corners" style="width:300px;height:300px;background:#f7f7f7;" /&gt;

悬停效果

您只需要 css 代码的第一部分就可以使边缘工作。 第二部分只是允许轻松添加一个漂亮的悬停效果,如果你不需要它,你也可以删除它。

没有 CSS 变量和 Sass

如果您不想使用 css 变量,您可以将变量替换为硬编码值。 如果你想用它制作一个 sass mixin,只需将它包装在一个 @mixin 调用中并将 vars 替换为 sass 变量。

【讨论】:

【参考方案9】:

您可以使用多个线性渐变作为背景图像来实现。

div 
  width: 100px;
  height: 100px;

  background:
    linear-gradient(to right, black 4px, transparent 4px) 0 0,
    linear-gradient(to right, black 4px, transparent 4px) 0 100%,
    linear-gradient(to left, black 4px, transparent 4px) 100% 0,
    linear-gradient(to left, black 4px, transparent 4px) 100% 100%,
    linear-gradient(to bottom, black 4px, transparent 4px) 0 0,
    linear-gradient(to bottom, black 4px, transparent 4px) 100% 0,
    linear-gradient(to top, black 4px, transparent 4px) 0 100%,
    linear-gradient(to top, black 4px, transparent 4px) 100% 100%;

  background-repeat: no-repeat;
  background-size: 20px 20px;
&lt;div&gt;&lt;/div&gt;

【讨论】:

谢谢你,这很好,但他没有显示在打印预览中,为什么?你能帮帮我吗 没关系,我找到了解决方案:-webkit-print-color-adjust:exact!important; 我能想到的唯一缺点是这些行在元素内部,因此不能作为例如打印标记 UPD:解决方案是将这些背景应用于绝对定位的::before 伪元素。完美运行!【参考方案10】:

我认为最好的解决方案是伪元素方法。漂亮干净,不会用(太多)额外元素污染 html

我使用上面的代码创建了这个 sass mixin,用于复制和粘贴解决方案:

@mixin corner-borders($corner-width: 1px, $corner-size: 5px, $color-border: grey, $color-background: white) 
    position: relative;
    border: $corner-width solid $color-border;
    background-color: $color-background;

    &::before 
        content: "";
        z-index: 0;
        position: absolute;
        top: -$corner-width;
        bottom: -$corner-width;
        left: $corner-size;
        right: $corner-size;
        background-color: $color-background;
    

    &::after 
        content: "";
        z-index: 0;
        position: absolute;
        top: $corner-size;
        bottom: $corner-size;
        left: -$corner-width;
        right: -$corner-width;
        background-color: $color-background;
    

那么你可以这样使用它:

html:

<div class="border">
    <div class="content">
        Content
    </div>
</div>

SCSS

.border 
    @include corner-borders;


.content 
    position: relative;
    z-index: 1;

您需要其中的 z-index 和相对位置,以便内容位于伪元素之上。

我在这里做了一个codepen演示:http://codepen.io/timrross/pen/XMwVbV

【讨论】:

【参考方案11】:

假设&lt;div id="content"&gt;CONTENT&lt;/div&gt; 并且CONTENT 至少包含一个HTML 节点。

#content position:relative
#content:before, #content:after, #content>:first-child:before, #content>:first-child:after 
    position:absolute; content:' ';
    width:80px; height: 80px;
    border-color:red; /* or whatever colour */
    border-style:solid; /* or whatever style */

#content:before top:0;left:0;border-width: 1px 0 0 1px
#content:after top:0;right:0;border-width: 1px 1px 0 0
#content>:first-child:before bottom:0;right:0;border-width: 0 1px 1px 0
#content>:first-child:after bottom:0;left:0;border-width: 0 0 1px 1px

这是Fiddle

【讨论】:

不错!一个限制是 #content&gt;:first-child 不能有 position: relative 虽然......【参考方案12】:

这是我最近所做的,内容垂直和水平居中。

HTML

<div class="column">
  <div class="c-frame-wrapper">
    <div class="c-frame-tl"></div>
    <div class="c-frame-tr"></div>
    <div class="c-frame-br"></div>
    <div class="c-frame-bl"></div>
    <div class="c-frame-content">
        &copy; Copyright 2015 - Company name<br /><br />
        St Winifrids St,<br />
        The Saints, Harrogate HG1 5PZ, UK<br />
    </div>
  </div>
</div>

CSS

.c-frame-wrapper 
  width: 250px;
  height: 100px;
  font-size:11px;
  color: $dark-grey-lighten-70;
  /* center align x axis */
  right: auto;
  left: 50%;
  transform: translateX(-50%);


.c-frame-tl 
  top: 0;
  left: 0;
  position: absolute;
  width:10px;
  height:10px;
  border-width: 3px;
  border-style: solid none none solid;
  border-color: #eb0000;


.c-frame-tr 
  top: 0;
  right: 0;
  position: absolute;
  width:10px;
  height:10px;
  border-width: 3px;
  border-style: solid solid none none;
  border-color: #eb0000;


.c-frame-br 
  bottom: 0;
  right: 0;
  position: absolute;
  width:10px;
  height:10px;
  border-width: 3px;
  border-style: none solid solid none;
  border-color: #eb0000;


.c-frame-bl 
  bottom: 0;
  left: 0;
  position: absolute;
  width:10px;
  height:10px;
  border-width: 3px;
  border-style: none none solid solid;
  border-color: #eb0000;


.c-frame-content 
  width:100%;
  text-align: center;
  /*center alignment x and y*/
  position: absolute;
  top: 50%;
  left: 50%;
  bottom: auto;
  right: auto;
  transform: translate(-50%,-50%); 

JSFiddle

【讨论】:

【参考方案13】:

SVG

如果您现在想开始使用向量以实现出色的响应能力,这是另一个不错的选择。

<svg viewBox="0 0 100 100" >
  <path d="M25,2 L2,2 L2,25" fill="none" stroke="black" stroke- />
  <path d="M2,75 L2,98 L25,98" fill="none" stroke="black" stroke- />
  <path d="M75,98 L98,98 L98,75" fill="none" stroke="black" stroke- />
  <path d="M98,25 L98,2 L75,2" fill="none" stroke="black" stroke- />
</svg>

SVG 是一个很棒的工具。在这种情况下使用 SVG 的一些优点是:

曲线控制 填充控制(不透明度、颜色) 描边控制(宽度、不透明度、颜色) 代码量 是时候建立和保持形状了 可扩展 没有 HTTP 请求(如果像示例中那样使用内联)

浏览器支持可追溯到 Internet Explorer 9。有关详细信息,请参阅 canIuse。

【讨论】:

如何将内容放入该框中? 我喜欢这个,因为它最灵活。例如,您可以使用 stroke-linecapstroke-linejoin。 @Julix,您可以将 SVG 放在 DIV 中,删除 widthheight 属性,它会缩放到大小。为了我的使用,我添加了一个负边距,所以它在父 div 之外。【参考方案14】:

这里有几种方法可以不使用任何额外的伪/真实元素来创建这种效果。需要注意的一点是,这两种方法都只适用于现代浏览器,因为它们使用 CSS3 属性。

使用 border-imageborder-image 属性可以很容易地创建这样的效果。方法如下:

创建一个透明图像,该图像的边框刚好在角落,如here。 将此图像设置为border-image-source 并让浏览器处理其余的工作:) 由于border-image-repeat 的默认值为stretch,因此即使容器在容器中放置,浏览器也会拉伸原始图像以适应容器变大。 为border-image-width 属性设置的值决定了边框的粗细。

.bordered 
  background-color: beige;
  border-image-source: url("http://i.stack.imgur.com/s2CAw.png");
  border-image-slice: 1;
  border-image-width: 5px;

.square 
  height: 150px;
  width: 150px;

.large-square 
  height: 350px;
  width: 350px;


/* Just for demo */

div 
  margin-bottom: 10px;
<div class='bordered square'></div>
<div class='bordered large-square'></div>

优点:

不需要额外的元素(伪元素或真实元素),这意味着标记更简洁,伪元素可用于其他需求。 反应灵敏。也就是说,即使容器的尺寸发生变化,浏览器也会调整边框。

缺点:

Relatively lower browser support。如果需要 IE10- 支持,那么这是不行的。

由于边框图像被拉伸,如果原始图像的画布是正方形且容器是矩形,则边框在顶部和底部看起来会比左右更宽。

.bordered 
  background-color: beige;
  border-image-source: url("http://i.stack.imgur.com/s2CAw.png");
  border-image-slice: 2;
  border-image-width: 5px;

.small-square 
  height: 75px;
  width: 75px;

.square 
  height: 150px;
  width: 150px;

.large-square 
  height: 350px;
  width: 350px;

.rectangle 
  height: 150px;
  width: 250px;

.large-rectangle 
  height: 150px;
  width: 350px;


/* Just for demo */

div 
  margin-bottom: 10px;
<div class='bordered small-square'></div>
<div class='bordered square'></div>
<div class='bordered large-square'></div>
<div class='bordered rectangle'></div>
<div class='bordered large-rectangle'></div>

使用 background-imagebackground-image 属性也可以与linear-gradient 图像一起使用以产生效果。方法如下:

创建四个linear-gradient 图像(两个用于顶部、底部和两个用于左侧、右侧)。这些渐变将从所需的颜色开始,并继续是与边框图像的宽度/高度一样多的像素的颜色。之后它应该是透明的。 对于顶部和底部边框,渐变的方向应该是to right。对于左右边框,应该是to bottombackground-size 值确定边框的粗细。对于顶部和底部边框,渐变图像的大小在 X 轴上为 100%,在 Y 轴上为 5px(厚度)。对于左右边框,X 轴大小为 5px(粗细),Y 轴大小为 100%。 background-repeat 应设置为 repeat-x 用于顶部、底部边框,repeat-y 用于左侧和右侧边框。 background-position 在 X 或 Y 轴上酌情设置为(-1 * 渐变颜色大小的一半)。这是为了使颜色区域的一半出现在元素的一侧,而另一半出现在另一侧(因为渐变是重复的)。

.bordered.square 
  height: 150px;
  width: 150px;

.bordered.rectangle 
  height: 150px;
  width: 250px;

.bordered 
  background-color: beige;
  background-image: linear-gradient(to right, black 30px, transparent 30px), linear-gradient(to right, black 30px, transparent 30px), linear-gradient(to bottom, black 30px, transparent 30px), linear-gradient(to bottom, black 30px, transparent 30px);
  background-size: 100% 5px, 100% 5px, 5px 100%, 5px 100%;
  background-position: -15px 0%, -15px 100%, 0% -15px, 100% -15px;
  background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;


/* Just for demo */

div 
  margin-bottom: 10px;
<div class='bordered square'></div>
<div class='bordered rectangle'></div>

优点:

不需要额外的元素(伪元素或真实元素),这意味着标记更简洁,伪元素可用于其他需求。

由于渐变中颜色的宽度是固定的,因此具有合理的响应性。如果边框虚线的宽度需要根据容器的尺寸进行更改,那么我们可以将渐变中的像素值更改为百分比(还有一些小的更改),如下面的 sn-p。

.bordered.square 
  height: 150px;
  width: 150px;

.bordered.large-square 
  height: 250px;
  width: 250px;

.bordered 
  background-color: beige;
  background-image: linear-gradient(to right, black 10%, transparent 10%), linear-gradient(to right, black 10%, transparent 10%), linear-gradient(to bottom, black 10%, transparent 10%), linear-gradient(to bottom, black 10%, transparent 10%);
  background-size: 90% 5px, 90% 5px, 5px 90%, 5px 90%;
  background-position: 0% 0%, 0% 100%, 0% 0%, 100% 0%;
  background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;


/* Just for demo */

div 
  margin-bottom: 10px;
<div class='bordered square'></div>
<div class='bordered large-square'></div>

缺点:

Relatively better browser support。如果需要 IE9- 支持,那么这是不行的。 如果使用基于百分比的渐变,那么与border-image 提到的矩形相同的缺点也将适用于此。

【讨论】:

【参考方案15】:

我发现了这个问题,但是我对border-radius的方法并不满意:因为我使用了更粗的边框,所以效果并没有我想要的那么好。我设法创建了另一个解决方案,没有图像,也没有任何额外的标记:

    .box 
        /* fake border */
        position: relative;
        overflow: hidden;
        box-shadow: inset 0px 0px 0px 10px green;
        padding: 1em;
    

    .box:before 
        /* this element will hide the fake border on the top and bottom */
        content:'';         
        display: block;
        position: absolute;
        border-top:10px solid white;
        border-bottom:10px solid white;
        /* height = border-width x2 */
        height:calc(100% - 20px); 
        top:0;
        /* width = size of fake-border x2 */
        width: calc(100% - 36px);
        /* left = size of fake-border */
        left:18px;
    

    .box:after 
        /* this element will hide the fake border on the left and right */
        /* the rules for width, heigth, top and left will be the opposite of the former element */
        display: block;
        position: absolute;
        content:'';
        border-right:10px solid white;
        border-left:10px solid white;
        height:calc(100% - 36px);
        width: calc(100% - 20px);
        top:18px;
        left: 0;
    

这是一个带有此示例的 JSFiddle:https://jsfiddle.net/t6dbmq3e/ 希望对您有所帮助。

【讨论】:

如果你把它放在图片上就没用了 - 白色是一种颜色。【参考方案16】:

这是上述答案的修改版本,该版本具有相对定位的父级和绝对定位的子级,因此我们可以添加悬停效果。

http://jsfiddle.net/3jo5btxd/

HTML:
<div id="div1"><div id="div2"><img src="http://placekitten.com/g/82/82"></div></div>

CSS:

#div1 
    position: relative;
    height: 100px;
    width: 100px;
    background-color: white;
    border: 1px solid transparent;


#div2 
    position: absolute;
    top: -2px;
    left: -2px;
    height: 84px;
    width: 84px;
    background-color: #FFF;
    border-radius: 15px;
    padding: 10px;


#div1:hover 
    border: 1px solid red;

【讨论】:

【参考方案17】:

我会使用重叠的 div。

一个有方角的。 另一个是圆角的(所以它不会隐藏第一个的角)。

<div id="div1" />
<div id="div2" />


#div1 
  position:absolute;
  top:9px;
  left:9px;
  height:100px;
  width:100px;
  background-color:white;
  border:1px solid black;


#div2 
  position:relative;
  top:-1px;
  left:-1px;
  height:102px;
  width:102px;
  background-color:white;
  border-radius: 15px;

http://jsfiddle.net/y3EfP/

结果:


@web-tiki 提供的增强解决方案:

http://jsfiddle.net/webtiki/y3EfP/147/

【讨论】:

聪明的方法,我用伪元素改进了解决方案,以最小化标记并使其响应:jsfiddle.net/webtiki/y3EfP/147。要单独设置每个“角落”的样式,您可以看看这个答案:***.com/a/24453271/1811992 @web-tiki 我不确定“响应式”到底是什么意思,但该解决方案不是很兼容跨浏览器。大多数浏览器在放大/缩小时都会出现问题。 IE11 从一开始就显示灰色边框。 Aynway 不错的解决方案。 @Kyborek 这在缩放时看起来更好:jsfiddle.net/webtiki/y3EfP/161 尚未在 IE 中测试,但它也应该可以正常工作 这个方案有个问题,边框尺寸越大圆角越明显。 我知道这是一个旧线程,但我只是在做类似的事情,这个答案对我有帮助,但这是一个改进的线程,所以边框不是圆角jsfiddle.net/y3EfP/463【参考方案18】:

这是你的照片:

HTML:

<div class="shell">

    <div class="top">

        <div class="clear">
            <div class="left">
              &#42;&#42;&#42;&#42;
            </div>
            <div class="right">
              &#42;&#42;&#42;&#42;
            </div>
        </div>

        <div class="clear"> 
            <div class="left">
              &#42;
            </div>
            <div class="right">
              &#42;
            </div>
        </div>

        <div class="clear">
            <div class="left">
              &#42;
            </div>
            <div class="right">
              &#42;
            </div>
        </div>

    </div>

    <div class="content">
        <p>CONTENT</p>
    </div>

    <div class="bottom">

        <div class="clear"> 
            <div class="left">
              &#42;
            </div>
            <div class="right">
              &#42;
            </div>
        </div>

        <div class="clear">
            <div class="left">
              &#42;
            </div>
            <div class="right">
              &#42;
            </div>
        </div>

      <div class="clear">
            <div class="left">
              &#42;&#42;&#42;&#42;
            </div>
            <div class="right">
              &#42;&#42;&#42;&#42;
            </div>
        </div>
    </div>

和 CSS:

.shell  width: 200px;
.left float:left; 
.rightfloat:right; 
.clear  clear: both; line-height: 10px; 
.content  line-height: 10px; text-align: center; 

【讨论】:

【参考方案19】:

没有干净的 css 方法可以只给角落一个边框,但你可以尝试模仿效果。可能是这样的:http://jsfiddle.net/RLG4z/

<div id="corners">
  <div id="content">
    content
  </div>
</div>

#corners 
    width: 200px;
    height: 50px;
    border-radius: 10px;
    background-color: red;
    margin: 10px;

#content 
  background-color: white;
  border-radius: 15px;
  height: 30px;
  padding: 10px;

由于边框半径的不同,底层div的背景颜色呈现出低谷,在边角处呈现出边框的效果。

我个人认为我会使用背景图像来实现这一点,以便更好地控制结果。

【讨论】:

【参考方案20】:

好吧,因为我在 CSS 中很烂,我想我自己无法做到,但我做到了,而且似乎可行:

<div id="half" style="position:absolute; top:0; left:0; width:30px; height:30px; overflow:visible; border-top:3px solid #F00; border-left:3px solid #06F;"></div>

<div id="half" style="position:absolute; bottom:0; right:0; width:30px; height:30px; overflow:visible; border-bottom:3px solid #F00; border-right:3px solid #06F;"></div>

它似乎正在工作 ;-) 抱歉打扰并感谢您的帮助。

【讨论】:

以上是关于如何仅显示角边框?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PySide2 中添加边框或设置透明 QLayout?

IOS:UIImageView边框白色,半径在4个角显示一条奇怪的暗线

UIView 的圆顶角并添加边框

css实现盒子的四个角高亮边框显示

如何:当鼠标位于 WPF 边框的边和角之一时触发事件

如何修复仅在 ios 而不是 android 上发生的虚线边框错误?