如何实现部分透明的 CSS 覆盖?

How to implement a CSS overlay which is partially transparent?

这是我想要的东西:

我有一个扫描仪组件(回放相机看到的内容),但我需要以某种方式将其包装起来,以直接在屏幕中央创建一个带有透明矩形的半透明覆盖层。

如何做到这一点?

您可以使用 clip-path 尝试此解决方法。

您可以通过编辑

来调整突出显示的尺寸
style="--left: 30%; --top: 30%; --width: 40%; --height: 40%;"

.frame 元素的一部分。

.frame {
  position: relative;
  display: inline-block;
}

.frame::after {
  content: '';
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 1;
  
  clip-path: polygon(
    0% 0%, 
    0% 100%, 
    var(--left) 100%,
    var(--left) var(--top),
    calc(var(--left) + var(--width)) var(--top),
    calc(var(--left) + var(--width)) calc(var(--top) + var(--height)),
    var(--left) calc(var(--top) + var(--height)),
    var(--left) 100%,
    100% 100%,
    100% 0
  );
}
<div class="frame" style="--left: 30%; --top: 30%; --width: 40%; --height: 40%;">
  <img src="https://picsum.photos/id/16/640/320" />
</div>

您可以使用 border 生成 'overlay' 部分 - 这样您就有了一个真正的 'transparent' 块,可以使它之外的所有内容变暗。诀窍是让边框延伸到元素(或屏幕)的边缘 - 您可以通过以视口单位指定边框宽度来做到这一点,如下所示:

.container {
  position: relative;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
}

.container img{
  margin: auto;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.loupe {
  width: 24rem;
  height: 18rem;
  border: 0 solid rgba(0,0,0,0.5);
  border-width: 50vh 50vw;
  position: absolute;
  top: -9rem; /* Half of height */
  bottom: 0;
  right: 0;
  left: -12rem;  /* Half of width */
  margin: auto;
}

/* Optional - apply a shadow effect under the loupe */
.loupe::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  box-shadow: 0 0.1rem 1.5rem rgba(0,0,0,0.25);
}
    <div class="container">
      <img src="https://images.unsplash.com/photo-1621135177072-57c9b6242e7a?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=1534&q=80"/>
      <div class="loupe">
      </div>
    </div>

如果需要微调放大镜的位置,可以使用transform: translate();调整位置。

与“边框”解决方案类似,您可以使用内嵌框阴影,一些有效。

.wrap {
  position: relative;
}

.wrap::before {
  position: absolute;
  height: 100%;
  width: 100%;
  overflow: hidden;
  box-shadow: inset 0 0 0 150px rgb(0 0 0 / 70%);
  content: '';
}

body {
  margin: 0;
}
<div class="wrap">
  <img src="https://www.fillmurray.com/1000/1000">
</div>