我有一些街区,有一些设计:
我有一些svg代码:
.box {
position: relative;
margin: .75em auto 0;
max-width: 255px;
min-height: 56px;
}
svg {
position: absolute;
width: 100%; height: 100%;
}
<div class='box'>
<svg>
<mask id='m' fill='#fff'>
<rect id='r' width='256' height='56'/>
<circle id='c' r='10' fill='#000'/>
<use xlink:href='#c' x='100%'/>
<use xlink:href='#c' y='100%'/>
<use xlink:href='#c' x='100%' y='100%'/>
</mask>
<mask id='m2' fill='#fff'>
<rect id='r2' width='248' height='50' x="4" y="4" />
<circle id='c2' r='14' fill='#000' stroke='#000'/>
<use xlink:href='#c2' x='100%' />
<use xlink:href='#c2' y='100%'/>
<use xlink:href='#c2' x='100%' y='100%'/>
</mask>
<use xlink:href='#r' fill='red' mask='url(#m)'/>
<use xlink:href='#r2' fill='none' stroke="#000" mask='url(#m2)'/>
</svg>
</div>
问题:如何在具有相同圆角切割角但不具有实心填充和笔触的块内制作?
PS::应该保留编辑圆角半径vn的功能。块。也许在css(最大跨浏览器)上有一个简单的实现也很合适。
答案 0 :(得分:4)
这个怎么样?只要更改<div class="box">
的尺寸,它就可以适用于任何大小。
.box {
position: relative;
margin: .75em auto 0;
width: 255px;
height: 56px;
}
.box svg {
position: absolute;
width: 100%;
height: 100%;
}
.size2 {
width: 455px;
height: 256px;
}
<div class="box">
<svg width="100%" height="100%">
<mask id="m" fill="#fff">
<rect width="100%" height="100%"/>
<rect width="100%" height="100%" fill="none" stroke="#000" stroke-width="12"/>
<circle r="16" fill="#000"/>
<circle cx="100%" r="16" fill="#000"/>
<circle cy="100%" r="16" fill="#000"/>
<circle cx="100%" cy="100%" r="16" fill="#000"/>
<rect width="100%" height="100%" fill="none" stroke="#fff" stroke-width="8"/>
<circle r="14" fill="#fff"/>
<circle cx="100%" r="14" fill="#fff"/>
<circle cy="100%" r="14" fill="#fff"/>
<circle cx="100%" cy="100%" r="14" fill="#fff"/>
<circle r="10" fill="#000"/>
<circle cx="100%" r="10" fill="#000"/>
<circle cy="100%" r="10" fill="#000"/>
<circle cx="100%" cy="100%" r="10" fill="#000"/>
</mask>
<rect width="100%" height="100%" mask="url(#m)"/>
</svg>
</div>
答案 1 :(得分:3)
我会使用具有多个背景的纯CSS解决方案。操作起来有点技巧,但是使用一些CSS变量,您可以轻松进行调整:
.box {
--th:2px; /*thickness of the transparent part*/
--l:4px; /*height of border*/
--r:25px; /*radius*/
--rad:transparent 50%,#000 50%,#000 64%,transparent 65%,transparent calc(66% + var(--th)),#000 calc(66% + var(--th));
--rad-s:var(--r) var(--r);
--border:#000 calc(var(--l)),transparent calc(var(--l)),transparent calc(var(--l) + var(--th));
--w:calc(100% - 2*var(--r) + 2*var(--th));
--h:calc(var(--l) + var(--th));
margin:10px;
display:inline-block;
padding:40px 20px;
background:
/*The 4 corners*/
linear-gradient(to bottom,var(--border)) center top/var(--w) var(--h),
linear-gradient(to top,var(--border)) center bottom/var(--w) var(--h),
linear-gradient(to right,var(--border)) center left/var(--h) var(--w),
linear-gradient(to left,var(--border)) center right/var(--h) var(--w),
/*The 4 borders */
radial-gradient(circle at top right,var(--rad)) top right/var(--rad-s),
radial-gradient(circle at top left,var(--rad)) top left/var(--rad-s),
radial-gradient(circle at bottom right,var(--rad)) bottom right/var(--rad-s),
radial-gradient(circle at bottom left,var(--rad)) bottom left/var(--rad-s),
/*The main background*/
linear-gradient(#000,#000) center/calc(100% - 2*var(--r)) calc(100% - 2*var(--h)),
linear-gradient(#000,#000) center/calc(100% - 2*var(--h)) calc(100% - 2*var(--r));
background-repeat:no-repeat;
color:#fff;
text-align:center;
}
body {
background:pink;
}
<div class="box">
Some text inside
</div>
<div class="box" style="--th:3px;--r:20px">
Some text inside
</div>
<div class="box" style="--th:4px;--r:40px;--l:8px">
Some text inside
</div>
<div class="box" style="--th:5px;--r:30px">
Some text inside
</div>
<div class="box" style="--th:1px;--r:15px;--l:3px">
Some text inside
</div>
答案 2 :(得分:2)
这是我的答案:我使用的是文本边框的大小,因此您可以根据需要更改文本。 对于切出的角,我使用弧线。 您也可以更改“填充”,即文本和边框之间的距离。
let bb = txt.getBBox();
function drawShape(path, padding){
let d = `M${bb.x},${bb.y - padding}
L${bb.x + bb.width},${bb.y - padding}
A${padding}, ${padding} 0 0 0 ${bb.x + bb.width + padding},${bb.y}
L${bb.x + bb.width + padding},${bb.y + bb.height}
A${padding}, ${padding} 0 0 0 ${bb.x + bb.width},${bb.y + bb.height + padding}
L${bb.x},${bb.y + bb.height + padding}
A${padding}, ${padding} 0 0 0 ${bb.x - padding},${bb.y + bb.height}
L${bb.x - padding},${bb.y}
A${padding}, ${padding} 0 0 0 ${bb.x},${bb.y - padding}z
`
path.setAttributeNS(null,"d",d)
}
drawShape(pth, 10);
drawShape(pth1, 10);
<svg viewBox="0 0 200 100">
<path id="pth" fill="black" stroke="black" stroke-width="4" d="" />
<path id="pth1" stroke="white" stroke-width="2" d="" />
<text id="txt" fill="white" dominant-baseline="central" text-anchor="middle" x="100" y="50">
some text inside
</text>
</svg>