CSS 中圆角点状边框的间距

4
我一直在研究支持webkit和IE9+的虚线边框。
目前,我有一个“简单”的虚线边框效果,如下所示:

.bord {
  height: 200px;
  width: 300px;
  background: gray;
  border-radius: 20px;
  position: relative;
}
.bord:before {
  content: "";
  position: absolute;
  height: calc(90% - 10px);
  width: calc(90% - 10px);
  left: 5%;
  top: 5%;
  border: 5px dotted black;
}
<div class="wrapper">
  <div class="bord"></div>
</div>

这将在Chrome中呈现:

enter image description here


但我想要:

enter image description here

使用纯CSS是否可能实现这一点?

(因为我不能使用border-image,因为Internet Explorer 10及更早版本不支持border-image属性。)

我已经查看了文档,但没有找到任何参考资料,我也看到了这个之类的东西,但显然对我没有帮助。


我是否遗漏了某个CSS属性?或者有其他的可能性吗?(在我看来,这些“点”本应该是圆形的),但“圆形点”也会很有用。



我在这里找到了一个先前的答案:https://dev59.com/v2025IYBdhLWcg3wCxRN - Bitwise Creative
@mattytommo 这个问题已经在问题描述中解答了。 - James Montagne
如果你仔细阅读问题,你就会明白为什么这不是一个选项(提示:阅读第一行)。 - jbutler483
2
虽然@Harry的回答令人印象深刻,但我认为固定宽度和高度可能过于限制,OP应该考虑在>IE9中使用border-image,并使用modernizr或类似工具进行回退。像素完美的跨浏览器设计是通往疯狂之路。 - fontophilic
4个回答

8
这是我能够实现的最接近的效果。它使用单个伪元素的多个盒阴影,将其偏移至所需位置。
通过在伪元素中添加以下行,可以轻松将其转换为点状边框。
border-radius: 50%;

IE9+也支持Box Shadow

注意:如果您有固定的高度和宽度,这种方法可以起作用。虽然不是最理想的方法,但我认为这是使用CSS并具有IE9+支持的最大限度。

.bord {
    height: 185px;
    width: 250px;
    background: gray;
    border-radius: 20px;
    position: relative;
    padding: 25px;
}
.bord:before {
    position: absolute;
    top: 20px;
    left: 20px;
    content:'';
    background: black;
    height: 5px;
    width: 5px;
    box-shadow: 50px 0px 0px black, 100px 0px 0px black, 150px 0px 0px black, 200px 0px 0px black, 250px 0px 0px black, 0px 190px 0px black, 50px 190px 0px black, 100px 190px 0px black, 150px 190px 0px black, 200px 190px 0px black, 250px 190px 0px black, 0px 47.5px 0px black, 0px 95px 0px black, 0px 142.5px 0px black, 0px 47.5px 0px black, 250px 47.5px 0px black, 250px 95px 0px black, 250px 142.5px 0px black;
}
<div class="wrapper">
    <div class="bord">abcd</div>
</div>


以下代码片段严格来说不是当前问题的答案,因为特别提到了IE9+支持。这是我的原始答案(错误的),作为答案的一部分保留下来,以帮助未来可能不需要IE9支持的读者。此选项使用linear-gradientbackground-position(两者都支持百分比值),因此可以更加可扩展。

.bord {
  height: 235px;
  width: 300px;
  background: gray;
  border-radius: 20px;
  position: relative;
}
.bord:before {
  content: "";
  position: absolute;
  height: calc(90% - 10px);
  width: calc(90% - 10px);
  left: 5%;
  top: 5%;
  background: linear-gradient(90deg, black 10%, transparent 10%), linear-gradient(90deg, black 10%, transparent 10%);    
  background-size: 50px 5px;
  background-repeat: repeat-x;
  background-position: 5px 5px, 5px 195px;
}
.bord:after {
  content: "";
  position: absolute;
  height: calc(90% - 10px);
  width: calc(90% - 10px);
  left: 5%;
  top: 5%;
  background: linear-gradient(0deg, black 10%, transparent 10%), linear-gradient(0deg, black 10%, transparent 10%);
  background-size: 5px 50px;
  background-repeat: repeat-y;
  background-position: 5px 0px, 255px 0px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class="wrapper">
  <div class="bord"></div>
</div>


我认为由于所有这些-webkit前缀,这可能在IE9+中无法正常工作? - James Montagne
@JamesMontagne:可能是的,但我认为整体上线性渐变可能会起作用。不过让我检查一下。谢谢你指出 :) - Harry
@JamesMontagne:再次感谢你的指出,老兄。我已经添加了一种备选方案,它应该可以在IE9+上工作,因为它只使用了box-shadow。 - Harry
2
令人印象深刻。我没想到这是可能的。 - HC_

3

CSS3多重背景图片在IE9中可以使用。因此,只需使用一个背景图片并在元素的四个角上平铺即可。就这样。


为了使事情更有趣,您还可以使用SVG图像,例如:

svg {
  background-color: #999;
}
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16px" height="16px"><circle cx="4" cy="4" r="4" fill="#000000"></circle></svg>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16px" height="16px"><circle cx="12" cy="4" r="4" fill="#000000"></circle></svg>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16px" height="16px"><circle cx="12" cy="12" r="4" fill="#000000"></circle></svg>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16px" height="16px"><circle cx="4" cy="12" r="4" fill="#000000"></circle></svg>

SVG图像可以使用data URI嵌入到CSS中。将所有内容放在一起:

.bord {
  width: 320px;
  height: 224px;
  border-radius: 16px;
  position: relative;
  background: #999;
}
.bord:before {
  content: "";
  position: absolute;
  left: 16px;
  top: 16px;
  right: 16px;
  bottom: 16px;
  background:
    url("data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216px%22%20height%3D%2216px%22%3E%3Ccircle%20cx%3D%224%22%20cy%3D%224%22%20r%3D%224%22%20fill%3D%22%23000000%22%3E%3C%2Fcircle%3E%3C%2Fsvg%3E")
      left top repeat-x,
    url("data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216px%22%20height%3D%2216px%22%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%224%22%20r%3D%224%22%20fill%3D%22%23000000%22%3E%3C%2Fcircle%3E%3C%2Fsvg%3E")
      top right repeat-y,
    url("data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216px%22%20height%3D%2216px%22%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2212%22%20r%3D%224%22%20fill%3D%22%23000000%22%3E%3C%2Fcircle%3E%3C%2Fsvg%3E")
      right bottom repeat-x,
    url("data:image/svg+xml,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216px%22%20height%3D%2216px%22%3E%3Ccircle%20cx%3D%224%22%20cy%3D%2212%22%20r%3D%224%22%20fill%3D%22%23000000%22%3E%3C%2Fcircle%3E%3C%2Fsvg%3E")
      bottom left repeat-y;
}
<div class="bord"></div>


0

您可以在 CSS 中使用单个 SVG。

.dotted-bloc {
  width: 200px;
  height: 150px;
  margin: 30px auto;
  background-image: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' fill-rule='evenodd' stroke='%23000000' stroke-width='5' stroke-dasharray='3 10'/%3e%3c/svg%3e");
}
<div class="dotted-bloc">
</div>

stroke='%23000000' 最后6个数字是十六进制颜色代码(000000代表黑色,FF0000代表红色...)

stroke-width='5' 数字值代表边框的宽度

stroke-dasharray='3 10' 第一个数字代表一个点的宽度,第二个数字代表每个点之间的间隔。


0

有一种使用渐变实现此功能的 CSS 技巧。

element {
  background-position: top;
  background-image: linear-gradient(to right, #f8f8f8 20%, rgba(255,255,255,0) 0%);
  background-size: 5px 1px;
  background-repeat: repeat-x;
}

我已经制作了一个 SCSS mixin 来快速实现这个并更改颜色、大小、位置和间距。请查看 github.com/florbraz/Dotted-Border-w-custom-spacing-SCSS-Mixin

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