5

我已将 svg 作为掩码图像应用于某些 div。这样做之后,他们的边界就消失了。

.icon {
  padding:5px;
  border:5px solid #000;
  width: 150px;
  height: 150px;
  display: inline-block;
  -webkit-mask: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) no-repeat 50% 50%;
  -webkit-mask-size: contain;
  mask-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) no-repeat 50% 50%;
  mask-size: contain;
}

.red {
  background-color: red;
}

.blue {
  background-color: blue;
}
<div class="wrap">
  <div class="icon red"></div>
  <div class="icon blue"></div>
</div>

知道为什么会这样吗?任何解决方案都应该完全基于 css。

4

3 回答 3

1

原因的答案很简单:掩码适用于所有元素,包括其边框。元素的任何部分都会受到遮罩的影响,即使您有box-shadow

为了避免这种情况,要么使用另一个元素来创建边框,要么考虑使用多个掩码来保持边框可见:

.icon {
  padding:5px;
  border:5px solid #000;
  width: 150px;
  height: 150px;
  display: inline-block;
  -webkit-mask: 
      linear-gradient(#fff 0 0) top   /100% 5px,
      linear-gradient(#fff 0 0) bottom/100% 5px,
      linear-gradient(#fff 0 0) left  /5px 100%,
      linear-gradient(#fff 0 0) right /5px 100%,
      url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) center/contain;
   -webkit-mask-repeat:no-repeat;
}

.red {
  background-color: red;
}

.blue {
  background-color: blue;
}
<div class="wrap">
  <div class="icon red"></div>
  <div class="icon blue"></div>
</div>

我添加了 4 个渐变。每个都将覆盖一个边框以保持可见。

于 2020-10-09T20:45:43.877 回答
0

所以在搜索了一段时间后,我终于找到了掩码的边框属性,看来你需要使用另一个 svg 作为正方形来制作边框。

我将以下属性添加到.icon

-webkit-mask-box-image: url(https://www.flaticon.com/svg/static/icons/svg/33/33879.svg) 10 repeat;
mask-border: url(https://www.flaticon.com/svg/static/icons/svg/33/33879.svg) 10 repeat;

我实际上在这里找到了诀窍:https ://css-tricks.com/clipping-masking-css/#border-masks并针对您的情况进行了调整。

我想您可以轻松地创建一个带有适合边框的 svg 正方形,然后将其放入。

演示

.icon {
  padding:5px;
  border:5px solid #000;
  width: 150px;
  height: 150px;
  display: inline-block;
  -webkit-mask: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) no-repeat 50% 50%;
  -webkit-mask-size: contain;
  mask-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) no-repeat 50% 50%;
  mask-size: contain;
  -webkit-mask-box-image: url(https://www.flaticon.com/svg/static/icons/svg/33/33879.svg) 10 repeat;
  mask-border: url(https://www.flaticon.com/svg/static/icons/svg/33/33879.svg) 10 repeat;
}

.red {
  background-color: red;
}

.blue {
  background-color: blue;
}
<div class="wrap">
  <div class="icon red"></div>
  <div class="icon blue"></div>
</div>

于 2020-10-09T21:30:15.360 回答
0

我正在使用额外的 div 包装器在包含掩码的 div 周围创建边框。

我在代码中添加了注释来解释我的更改。

.maskborder{
  width: 150px;
  height: 150px;
  border:5px solid #000;
  position: relative;
  float: left;
}

.maskborder.two {
  margin-left: 10px; /* Change this to suit how much gap you want between first and second box */
}

.icon {
  padding:5px;
  border:5px solid #000;
  width: 150px;
  height: 150px;
  display: inline-block;
  mask: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) no-repeat 50% 50%;
  -webkit-mask: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/18515/heart.svg) no-repeat 50% 50%;
  mask-size: contain;
  -webkit-mask-size: contain;
  position: absolute;
  transform: translate(-10px, -10px) /* To offset the 5px border width so that the icons can be centred correctly in middle */
}

.red {
  background-color: red;
}

.blue {
  background-color: blue;
}
<div class="wrap">
  <div class="maskborder">
    <div class="icon red"></div>
  </div>
  <div class="maskborder two">
     <div class="icon blue"></div>
  </div>
</div>

于 2020-10-09T15:22:45.367 回答