当前位置: 首页 > Web前端 > CSS

镂空覆盖层效果研究

时间:2023-03-31 11:42:37 CSS

上图是“QQ截图”中选中区域时的画面。可以看到除了中间框选中的部分,其他区域都被半透明层(背景)覆盖。这种作用不知专业名称,这里称之为“中空覆盖层”。实际业务需求中很少见。比较常见的有“页面新手引导”、“视频网站熄灯模式”等,就用到了这种效果。一般简单的方法就是设置content元素的z-index大于overlay的,使得元素显示在overlay之上。接下来分享其他方法,可能对一些特殊场景有用。下面介绍的方法是:多个DIV拼接,单个DIV是通过CSS属性border、outline、box-shadow和mix-blend-mode实现的。下面分别从角度和动作上进行讲解。VisualFirst,使用styles给内容罩上一层半透明的罩子,并镂空一定区域。最原始的DIV拼接方法是在镂空区域周围拼接4个div。拼接的方式有很多种。比如上图中,用不同的颜色来表示4个div。

例子:https://jsfiddle.net/0ast5u2j/优点是兼容性好,缺点是使用多个DOM元素构造封面layer,计算起来比较麻烦,而且镂空的区域只能是矩形。边框模型包括内容和边框。可以用content表示镂空区域,用border表示覆盖层,用border-width定位镂空区域的位置。类似于上面的方法。例子:https://jsfiddle.net/708vngj1/使用该方法需要计算,部分情况需要JS,镂空区域只能是矩形(当然,不使用渐变)。outlineoutline不占空间,不影响自身元素和其他元素,设置足够大的值可以作为覆盖层。示例:https://jsfiddle.net/8561js9L/与上述方法相比的优点是元素设置border-radius是有效的,所以镂空区域可以是圆角矩形、椭圆、圆形等。通过使用混合模式,可以将元素与父元素重叠的部分做成透明,摆脱单一元素的限制,让镂空区域更加自由。更复杂的图形,例如语音气球。例子:https://jsfiddle.net/bxjo306z/其他的,比如用Canvas和SVG,比较麻烦,就不过多介绍了。Canvas示例:https://jsfiddle.net/3dbcvLp2/SVG示例:https://jsfiddle.net/6wvdja2h/很多场景下,需要点击选中镂空区域下的DOM。采用DIV拼接的方式,镂空区域本身就是空的,可以直接对下方的DOM进行操作。在其他方法中,因为有真实的DOM覆盖内容,所以使用了pointer-events:none,这样鼠标事件就可以“穿透”元素,作用于下面的内容。大部分场景需要阻止覆盖部分下DOM的操作,只“穿透”镂空部分,所以不能直接在镂空覆盖层上设置pointer-events:none,应该设置pointer-events:none当鼠标移动到镂空区域时,保留镂空区域设置pointer-events:auto。注意mosuemove在空心覆盖层是不能监听的,因为当设置为pointer-events:none时,是监听不到的。https://jsfiddle.net/02e64ndr/对于outline和box-shadow,由于不占空间,鼠标事件对它们没有影响,具有“穿透”效果,所以除了镂空遮罩层设置pointer-events:none,需要再覆盖一层透明覆盖层,同样监听父容器的mousemove事件,在透明层上动态设置pointer-eventshttps://jsfiddle.net/4dfagcmr/混合模式方法,本以为通过监听空心元素的mouseenter和mouseleave来控制pointer-events就可以了,但是当pointer-events:none时,无法监听鼠标事件,只能通过鼠标判断坐标。https://jsfiddle.net/c1aoe0dg/有些场景,比如模仿Snipaste截图效果,需要监听mask层下所有元素的鼠标进出事件。此时,为整个镂空遮罩层设置pointer-events:none。.抱歉,语言不清晰。