Маска SVG или стиль CSS, чтобы выбить центр SVG, чтобы он был прозрачным
У меня есть SVG, который по сути представляет собой коробку с закругленными краями и границами по углам каждого края:
<div class="container">
</div>
<svg width="258" height="258" viewBox="0 0 258 258" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M257 211.489L257 245C257 251.627 251.627 257 245 257L211.489 257" stroke="white" stroke-width="2" />
<path d="M211.489 0.999998L245 0.999999C251.627 1 257 6.37258 257 13L257 46.5111" stroke="white" stroke-width="2" />
<path d="M46.5111 257L13 257C6.37258 257 1 251.627 1 245L1.00001 211.489" stroke="white" stroke-width="2" />
<path d="M1 46.5111V13C1 6.37258 6.37258 1 13 1H46.5111" stroke="white" stroke-width="2" />
</svg>
Он помещается над контейнером div с цветным фоном:
body{background: white}
.container {
margin-top: 70px;
height: 400px;
margin: 0 auto;
background-color: black;
opacity: 0.55;
}
svg {
position: absolute;
top: 50px;
left: 300px;
}
Я хочу, чтобы центр SVG (вся центральная область внутри границ с белыми краями) был прозрачным. Итак, в этом примере вы увидите белый фон тела.
Вот его CodePen: https://codepen.io/lance-p/pen/mdrwyyN
Мне сказали, что я могу использовать маску для этого, но так и не смог заставить ее работать. Любые предложения (с маской или без) будут оценены!
Ответы
Это альтернативное решение, в котором я использую очень широкую тень вместо .container
фона.
Также я упростил svg, но вы можете оставить здесь свой код.
*{margin:0;padding:0}
body {
background: white;
}
.container {
margin-top: 70px;
height: 400px;
margin: 0 auto;
overflow: hidden;
opacity: 0.55;
}
#hole {/*I want the hole to be slightly smaller than the svg element hence the calc*/
width:calc(258px - 8px);
height:calc(258px - 8px);
border-radius:20px;
position: relative;
top: calc(50px + 4px);
left: calc(300px + 4px);
background:transparent;
box-shadow:0 0 0 200vmax #000;
}
svg{
width:258px;
height:258px;
position: absolute;
top: 50px;
left: 300px;
}
<div class="container">
<div id="hole"></div>
</div>
<svg width="258" height="258" viewBox="0 0 258 258" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="256" height="256" rx="20" id="r" stroke="white" stroke-width="2" stroke-dasharray="80 168" stroke-dashoffset="58" fill="none" />
</svg>
@alexandr_TT комментирует:
Можете как-то выделить в описании основное решение для позиционирования белых углов stroke-dasharray = "80 168" stroke-dashoffset = "58"
Для начала нужно узнать общую длину прямоугольника со скругленными углами. let l = r.getTotalLength();
. Вы разделите это значение на 4, чтобы узнать общую сумму штриха и промежутка. let stroke_gap = l/4;
Затем вы выбираете, например, одно значение штриха let stroke = 80
. let gap = stroke_gap - stroke;
Я округлил числа, чтобы восполнить пробел . Может, не стоит. Это дает мне что - то вроде stroke-dasharray="80 168"
Если вы используете только этот первый удар будет начинаться на расстоянии 20 единиц (гх = «20») от угла (х = «1» у = «1») , Вам необходимо будет stroke-dashoffset
к сместите штрихи и сделайте их загнутыми по углам.
Вы можете рассчитать длину угловой части пути: это длина 1/4 периметра круга с радиусом = 20 (rx = 20): let corner = 2 * Math.PI * radius/4;
значение для смещения штрих-тире должно бытьlet sdo = stroke/2 + corner/2
let l = r.getTotalLength();
let radius = 20;
let stroke_gap = l/4;
let stroke = 80;
let gap = stroke_gap - stroke;
let corner = 2 * Math.PI * radius/4;
let sdo = stroke/2 + corner/2;
r.setAttribute("stroke-dasharray",`${stroke} ${gap}`)
r.setAttribute("stroke-dashoffset",sdo)
<svg viewBox="0 0 258 258" xmlns="http://www.w3.org/2000/svg">
<rect x="1" y="1" width="256" height="256" rx="20" stroke="gold" stroke-width="5" fill="none" />
<rect x="1" y="1" width="256" height="256" rx="20" id="r" stroke="black" stroke-width="2" fill="none" />
<path d="M1,21A20 20 0 0 1 21,1" stroke="red" fill="none" id="corner" />
</svg>