是否可以用单个 div 制作十字准线?

Is it possible to make a crosshair with a single div?

我正在尝试创建这样的十字准线:

<div class="crosshair"></div>

使用单一元素和纯css?

我想将 ::after & ::before 与 div
一起使用 但这只会导致 3 个条,而图像有 4 个条,

我不确定这是否可能,但也许我错过了什么?

编辑

顺便说一句,十字准线的透明度作为一个整体发生了变化,以便看到它背后的东西

编辑 2

根据@tacoshy 在评论中的请求,我也添加了我的“研究”

:root{
  --bar_thickness:0.5rem;
  --bar_length:5rem;
}

.crosshair::before{
  content:"";
  display:block;
  background-color:black;
  height:var(--bar_length);
  width:var(--bar_thickness);
  position:relative;
  transform:rotate(90deg);
}

.crosshair {
  margin:3rem;
  background-color:black;
  height:var(--bar_length);
  width:var(--bar_thickness);
}

.crosshair::after{
  content:"";
  display:block;
  background-color:white;
  height:calc( var(--bar_length) * 0.4);
  width:calc( var(--bar_length) * 0.4);
  position:relative;
  bottom:50%;
  left:50%;
  transform:translate(-50%,-50%)
}
<div class="crosshair"></div>

但是我的方法的问题是,当我需要它像第一次编辑中提到的那样透明时,它失败了:

:root{
  --bar_thickness:0.5rem;
  --bar_length:5rem;
}

.crosshair::before{
  content:"";
  display:block;
  background-color:black;
  height:var(--bar_length);
  width:var(--bar_thickness);
  position:relative;
  transform:rotate(90deg);
}

.crosshair {
  
  position:absolute;
  opacity:50%;
  margin:3rem;
  background-color:black;
  height:var(--bar_length);
  width:var(--bar_thickness);
}

.crosshair::after{
  content:"";
  display:block;
  background-color:white;
  height:calc( var(--bar_length) * 0.4);
  width:calc( var(--bar_length) * 0.4);
  position:relative;
  bottom:50%;
  left:50%;
  transform:translate(-50%,-50%)
}
<div id="background" style="background-color:red;height:10rem;width:10rem">
  <div class="crosshair"></div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitatio

</div>

你可以用 box-shadow 做一些事情:

#el {
  position: relative;
}

#el::after, #el::before {
  content: "";
  background: black;
  border-radius: 2px;
  position: absolute;
}

#el::after {
  left: 30px;
  width: 10px;
  height: 20px;
  box-shadow: 0 50px black;
}

#el::before {
  top: 30px;
  width: 20px;
  height: 10px;
  box-shadow: 50px 0 black;
}
<div id=el></div>

或者您可以使用边框而不是 box-shadow:

#el {
  position: relative;
  margin-top: 40px;
  height: 10px;
  width: 30px;
  border-left: 20px solid black;
  border-right: 20px solid black;
}

#el::after, #el::before {
  content: "";
  width: 10px;
  height: 20px;
  background: black;
  position: absolute;
  left: 10px;
}

#el::before {
  top: -30px;
}

#el::after {
  top: 20px;
}
<div id=el></div>

或仅使用 ::before 和 ::after 边框:

#el {
  position: relative;
}

#el::after, #el::before {
  content: "";
  position: absolute;
  box-sizing: border-box;
}

#el::before {
  width: 10px;
  height: 70px;
  left: 30px;
  border-top: 20px solid black;
  border-bottom: 20px solid black;
}

#el::after {
  width: 70px;
  height: 10px;
  top: 30px;
  border-left: 20px solid black;
  border-right: 20px solid black;
}
<div id=el></div>

或者使用渐变代替边框:

#el {
  position: relative;
}

#el::after, #el::before {
  content: "";
  position: absolute;
}

#el::before {
  width: 10px;
  height: 70px;
  left: 30px;
  background: linear-gradient(0deg, rgba(0,0,0,1) 28.57%, rgba(0,0,0,0) 28.57%, rgba(0,0,0,0) 71.43%, rgba(0,0,0,1) 71.43%);
}

#el::after {
  width: 70px;
  height: 10px;
  top: 30px;
  background: linear-gradient(90deg, rgba(0,0,0,1) 28.57%, rgba(0,0,0,0) 28.57%, rgba(0,0,0,0) 71.43%, rgba(0,0,0,1) 71.43%);
}
<div id=el></div>

使用字符作为条形图有效并且是透明的。但是你也可以使用包含十字准线的字体,就像 FontAwesome 做图标一样。 FontAwesome 可能包含十字准线。

.crosshair {
    position: relative;
}

.crosshair:before, .crosshair:after {
    content: "— —";
    display: inline-block;
    width: 3em;
    height: 3em;
    line-height: 2.9em;
    text-align: center;
    position: absolute;
    top: 0;
    left: 0;
}

.crosshair:after {
    transform-origin: center;
    transform: rotate(90deg);
}
<div class="crosshair"></div>

我更喜欢使用 box-shadow 且没有 ::before 或 ::after 伪元素的较短解决方案。如果 div 需要封装整个十字准线,那么这个样式也可以应用在 ::before 伪元素上。

.crosshair{
  margin:30px;
  width:6px;
  height:6px;
  box-shadow: 15px 0,20px 0,25px 0,-15px 0,-20px 0,-25px 0,0 15px,0 20px,0 25px,0 -15px,0 -20px,0 -25px
}
<div class="crosshair"></div>

具有 3 属性 和一个梯度的解决方案:

.cross {
  width:100px;
  aspect-ratio:1;
  --c: linear-gradient(#000 0 0) 50%;
  background:
    var(--c)/34% 10% space no-repeat,
    var(--c)/10% 34% no-repeat space;
}
<div class="cross"></div>

还有一个:

.cross {
  --b: 30%; /* length */
  --t: 10%; /* thickness */

  width: 100px;
  aspect-ratio: 1;
  --c: #000 var(--b),#0000 0 calc(100% - var(--b)),#000 0;
  background:
    linear-gradient( 0deg,var(--c)) 50%/var(--t) 100% no-repeat,
    linear-gradient(90deg,var(--c)) 50%/100% var(--t) no-repeat;
}
<div class="cross"></div>