在 CSS 中制作加号
Make plus symbol in CSS
我有下面的 CSS 代码,它给出了 + 符号,但与设计不匹配,基本上它需要很薄。查看代码段和 codpen
.plus {
position:relative;
border: 1px dotted white;
width: 3px;
height: 3px;
background-color: black;
box-sizing: border-box;
transform: scale(11);
}
<div class="plus"></div>
应该看起来像下面的符号:
任何其他样式也适合我,但应该看起来像快照。
我们可以使用如下的一个渐变来实现这一点:
.plus {
--b: 4px; /* the thickness */
width: 40px; /* the size */
aspect-ratio: 1;
border: 10px solid #000; /* the outer space */
background:
conic-gradient(from 90deg at var(--b) var(--b),#000 90deg,#fff 0)
calc(100% + var(--b)/2) calc(100% + var(--b)/2)/
calc(50% + var(--b)) calc(50% + var(--b));
display: inline-block;
}
.alt {
border-color: #fff;
background:
conic-gradient(from 90deg at var(--b) var(--b),#fff 90deg,#000 0)
calc(100% + var(--b)/2) calc(100% + var(--b)/2)/
calc(50% + var(--b)) calc(50% + var(--b));
}
.radius {
border-radius: 50%;
}
<div class="plus">
</div>
<div class="plus alt">
</div>
<div class="plus radius">
</div>
旧答案
像下面这样使用多个背景:
.plus {
display:inline-block;
width:50px;
height:50px;
background:
linear-gradient(#fff 0 0),
linear-gradient(#fff 0 0),
#000;
background-position:center;
background-size: 50% 2px,2px 50%; /*thickness = 2px, length = 50% (25px)*/
background-repeat:no-repeat;
}
.alt {
background:
linear-gradient(#000 0 0),
linear-gradient(#000 0 0);
background-position:center;
background-size: 50% 2px,2px 50%; /*thickness = 2px, length = 50% (25px)*/
background-repeat:no-repeat;
}
.radius {
border-radius:50%;
}
<div class="plus">
</div>
<div class="plus alt">
</div>
<div class="plus radius">
</div>
这里是透明的:
.plus {
width:50px;
height:50px;
display:inline-block;
background:
linear-gradient(#000 0 0) top left,
linear-gradient(#000 0 0) top right,
linear-gradient(#000 0 0) bottom left,
linear-gradient(#000 0 0) bottom right;
background-size: calc(50% - 1px) calc(50% - 1px); /*thickness = 2px (2*1px) */
background-repeat:no-repeat;
border:10px solid #000; /*length = 30px (50px - 2x10px) */
box-sizing:border-box;
}
.radius {
border-radius:50%;
}
body {
background:pink;
}
<div class="plus">
</div>
<div class="plus radius">
</div>
我们可以添加CSS变量来轻松控制整体形状:
.plus {
--t:2px; /* Thickness */
--l:40px; /* size of the symbol */
--s:10px; /* space around the symbol */
--c1:#fff; /* Plus color*/
--c2:#000; /* background color*/
display:inline-block;
width:var(--l);
height:var(--l);
padding:var(--s);
box-sizing:border-box; /*Remove this if you don't want space to be included in the size*/
background:
linear-gradient(var(--c1) 0 0) content-box,
linear-gradient(var(--c1) 0 0) content-box,
var(--c2);
background-position:center;
background-size: 100% var(--t),var(--t) 100%;
background-repeat:no-repeat;
}
.radius {
border-radius:50%;
}
<div class="plus"></div>
<div class="plus" style="--l:35px;--t:3px;--c2:green"></div>
<div class="plus" style="--l:50px;--t:1px;--s:5px;--c1:red;"></div>
<div class="plus" style="--l:35px;--t:5px;--s:0px;--c1:blue;--c2:orange;"></div>
<br>
<div class="plus radius"></div>
<div class="plus radius" style="--l:35px;--t:3px;--c2:green"></div>
<div class="plus radius" style="--l:50px;--t:1px;--s:5px;--c1:red;"></div>
<div class="plus radius" style="--l:35px;--t:5px;--s:0px;--c1:blue;--c2:orange;"></div>
我建议使用前后伪元素来实现这一点。
基本上我只使用div作为黑色背景,使用前元素作为垂直线,使用后元素作为水平线。
.plus {
position: relative;
width:20px;
height:20px;
background:#000;
}
.plus:before,
.plus:after {
content: "";
position:absolute;
background:#fff;
}
/* the vertical line */
.plus:before {
left:50%;
top:4px; /* this defines how much black "border" there should be */
bottom:4px;
width:2px;
transform:translateX(-50%);
}
/* the horizontal line */
.plus:after {
top:50%;
left:4px;
right:4px;
height:2px;
transform:translateY(-50%);
}
这是一个完整的例子:https://codepen.io/Fitzi/pen/zbMBVw
您可以使用 CSS 的 content
属性 来做到这一点:
.plus {
height: 24px;
width: 24px;
display: inline-block;
background-color: black;
color: white;
font-size: 24px;
line-height: 24px;
text-align: center;
}
.plus::before {
content: "+";
}
这里 Fiddle 显示了上面的代码。
我还建议使用实际符号:
.plus {
display: block;
height: 0.6em;
width: 0.6em;
font-size: 100px;
text-align: center;
line-height: 0.5em;
margin: 0;
padding: 0;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
font-family: Frutiger, "Frutiger Linotype", Univers, Calibri, "Gill Sans", "Gill Sans MT", "Myriad Pro", Myriad, "DejaVu Sans Condensed", "Liberation Sans", "Nimbus Sans L", Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: lighter;
color: #ffffff;
background-color: #000000;
}
.plus::before {
display: block;
content: '+';
}
<div class="plus"></div>
Fiddle: https://jsfiddle.net/m5de0ycL/
然后只需更改字体大小即可,如果它对您来说不够细,则可以将字体系列更改为更窄的字体。
编辑:@Temani-Afif 的解决方案更加多样化。根据您的兼容性需求,我会推荐他的而不是我的:
我有下面的 CSS 代码,它给出了 + 符号,但与设计不匹配,基本上它需要很薄。查看代码段和 codpen
.plus {
position:relative;
border: 1px dotted white;
width: 3px;
height: 3px;
background-color: black;
box-sizing: border-box;
transform: scale(11);
}
<div class="plus"></div>
应该看起来像下面的符号:
任何其他样式也适合我,但应该看起来像快照。
我们可以使用如下的一个渐变来实现这一点:
.plus {
--b: 4px; /* the thickness */
width: 40px; /* the size */
aspect-ratio: 1;
border: 10px solid #000; /* the outer space */
background:
conic-gradient(from 90deg at var(--b) var(--b),#000 90deg,#fff 0)
calc(100% + var(--b)/2) calc(100% + var(--b)/2)/
calc(50% + var(--b)) calc(50% + var(--b));
display: inline-block;
}
.alt {
border-color: #fff;
background:
conic-gradient(from 90deg at var(--b) var(--b),#fff 90deg,#000 0)
calc(100% + var(--b)/2) calc(100% + var(--b)/2)/
calc(50% + var(--b)) calc(50% + var(--b));
}
.radius {
border-radius: 50%;
}
<div class="plus">
</div>
<div class="plus alt">
</div>
<div class="plus radius">
</div>
旧答案
像下面这样使用多个背景:
.plus {
display:inline-block;
width:50px;
height:50px;
background:
linear-gradient(#fff 0 0),
linear-gradient(#fff 0 0),
#000;
background-position:center;
background-size: 50% 2px,2px 50%; /*thickness = 2px, length = 50% (25px)*/
background-repeat:no-repeat;
}
.alt {
background:
linear-gradient(#000 0 0),
linear-gradient(#000 0 0);
background-position:center;
background-size: 50% 2px,2px 50%; /*thickness = 2px, length = 50% (25px)*/
background-repeat:no-repeat;
}
.radius {
border-radius:50%;
}
<div class="plus">
</div>
<div class="plus alt">
</div>
<div class="plus radius">
</div>
这里是透明的:
.plus {
width:50px;
height:50px;
display:inline-block;
background:
linear-gradient(#000 0 0) top left,
linear-gradient(#000 0 0) top right,
linear-gradient(#000 0 0) bottom left,
linear-gradient(#000 0 0) bottom right;
background-size: calc(50% - 1px) calc(50% - 1px); /*thickness = 2px (2*1px) */
background-repeat:no-repeat;
border:10px solid #000; /*length = 30px (50px - 2x10px) */
box-sizing:border-box;
}
.radius {
border-radius:50%;
}
body {
background:pink;
}
<div class="plus">
</div>
<div class="plus radius">
</div>
我们可以添加CSS变量来轻松控制整体形状:
.plus {
--t:2px; /* Thickness */
--l:40px; /* size of the symbol */
--s:10px; /* space around the symbol */
--c1:#fff; /* Plus color*/
--c2:#000; /* background color*/
display:inline-block;
width:var(--l);
height:var(--l);
padding:var(--s);
box-sizing:border-box; /*Remove this if you don't want space to be included in the size*/
background:
linear-gradient(var(--c1) 0 0) content-box,
linear-gradient(var(--c1) 0 0) content-box,
var(--c2);
background-position:center;
background-size: 100% var(--t),var(--t) 100%;
background-repeat:no-repeat;
}
.radius {
border-radius:50%;
}
<div class="plus"></div>
<div class="plus" style="--l:35px;--t:3px;--c2:green"></div>
<div class="plus" style="--l:50px;--t:1px;--s:5px;--c1:red;"></div>
<div class="plus" style="--l:35px;--t:5px;--s:0px;--c1:blue;--c2:orange;"></div>
<br>
<div class="plus radius"></div>
<div class="plus radius" style="--l:35px;--t:3px;--c2:green"></div>
<div class="plus radius" style="--l:50px;--t:1px;--s:5px;--c1:red;"></div>
<div class="plus radius" style="--l:35px;--t:5px;--s:0px;--c1:blue;--c2:orange;"></div>
我建议使用前后伪元素来实现这一点。
基本上我只使用div作为黑色背景,使用前元素作为垂直线,使用后元素作为水平线。
.plus {
position: relative;
width:20px;
height:20px;
background:#000;
}
.plus:before,
.plus:after {
content: "";
position:absolute;
background:#fff;
}
/* the vertical line */
.plus:before {
left:50%;
top:4px; /* this defines how much black "border" there should be */
bottom:4px;
width:2px;
transform:translateX(-50%);
}
/* the horizontal line */
.plus:after {
top:50%;
left:4px;
right:4px;
height:2px;
transform:translateY(-50%);
}
这是一个完整的例子:https://codepen.io/Fitzi/pen/zbMBVw
您可以使用 CSS 的 content
属性 来做到这一点:
.plus {
height: 24px;
width: 24px;
display: inline-block;
background-color: black;
color: white;
font-size: 24px;
line-height: 24px;
text-align: center;
}
.plus::before {
content: "+";
}
这里 Fiddle 显示了上面的代码。
我还建议使用实际符号:
.plus {
display: block;
height: 0.6em;
width: 0.6em;
font-size: 100px;
text-align: center;
line-height: 0.5em;
margin: 0;
padding: 0;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
font-family: Frutiger, "Frutiger Linotype", Univers, Calibri, "Gill Sans", "Gill Sans MT", "Myriad Pro", Myriad, "DejaVu Sans Condensed", "Liberation Sans", "Nimbus Sans L", Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: lighter;
color: #ffffff;
background-color: #000000;
}
.plus::before {
display: block;
content: '+';
}
<div class="plus"></div>
Fiddle: https://jsfiddle.net/m5de0ycL/
然后只需更改字体大小即可,如果它对您来说不够细,则可以将字体系列更改为更窄的字体。
编辑:@Temani-Afif 的解决方案更加多样化。根据您的兼容性需求,我会推荐他的而不是我的: