是否可以用单个 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>
我正在尝试创建这样的十字准线:
<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>