我希望页面上的某些容器具有1px的笔触,带有八个小方块,就像下面的Photoshop选择工具一样(但中间没有十字)。我想复制装饰有正方形的边框,而不是中间的空白蓝色框,因为我的容器可以包含任何类型的内容并且可以是任何大小。

css - 用CSS复制Photoshop变换工具的8个小方块的最佳方法-LMLPHP

一种解决方案是在容器中创建八个绝对定位的元素,然后分别放置每个元素。另一种解决方案是使用多个背景,但是由于我的容器占据了页面的整个宽度,因此需要创建一个稍宽一些的包装来容纳多个背景。不好,因为不简单。

有没有我尚未想到的更好,或更简单的解决方案?

最佳答案

如果您不想使用大量梯度的复杂元素或复杂方法,这里是使用特殊字符的另一种想法:



.box {
  width: 200px;
  height: 200px;
  margin: 20px;
  background: linear-gradient(lightblue, lightblue) 5px 0/calc(100% - 10px) 100% no-repeat;
  position: relative;
  line-height: 180px;
  letter-spacing: 180px;
}

.box:before {
  content: "\25A1\25A1\25A1";
  letter-spacing: 85px;
  display: block;
  line-height: 0px;
}

.box:after {
  content: "\25A1\25A1\25A1";
  position: absolute;
  bottom: 2px;
  letter-spacing: 85px;
  display: block;
  line-height: 0px;
}

<div class="box">
  □□
</div>





这是使用多个背景,SVG和CSS变量使代码更简洁的另一种通用解决方案:



.overlay {
  position: relative;
  pointer-events: none;
  --square: url('data:image/svg+xml;charset=UTF-8,<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 20 20"><rect width="20" height="20" fill="transparent" stroke="%23000" stroke-width="3"/></svg>');
}

.overlay:before {
  content: "";
  position: absolute;
  top: -5px;
  bottom: -5px;
  left: -5px;
  right: -5px;
  background-image:
    var(--square), var(--square), var(--square),
    var(--square),                var(--square),
    var(--square), var(--square), var(--square);
  background-size: 10px 10px;
  background-position:
    top    left, top center   , top    right,
    center left,                center right,
    bottom left, bottom center, bottom right;
  background-repeat: no-repeat;
}

.box {
  height: 200px;
  width: 200px;
  background: lightblue;
  display: inline-block;
  vertical-align: top;
  margin: 10px;
}

p {
  border: 1px solid;
  padding: 50px;
}

<div class="box overlay"></div>

<div class="box overlay" style="width:100px;"></div>
<div class="box overlay" style="height:100px;"></div>

<p class="overlay"> some text</p>

10-04 15:26