用CSS怎样做一个类似win10鼠标移过照亮边框的效果
Admin 2022-06-11 群英技术资讯 1022 次浏览
这篇文章主要介绍“用CSS怎样做一个类似win10鼠标移过照亮边框的效果”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“用CSS怎样做一个类似win10鼠标移过照亮边框的效果”文章能帮助大家解决问题。安装最新 Windows 10 update 之后,注意到系统 UI 里有一个很棒的细节效果,在开始菜单的磁贴里或者 UWP 风格的设置界面中,元素的高亮边框是可以感知鼠标的,边框的高亮部分会跟随鼠标的移动而移动。顿时灵机一动,这个效果用 CSS 可否实现?
分析
拿桌面日历中的效果为例,鼠标移动时附近的边框也渐变性可见。这个效果不就是探照灯效果嘛!这个完全可以用 CSS 中的 mask 蒙版配合一个径向渐变实现。

但问题是,mask 蒙版是作用于整个元素的,没办法只作用于 border 而不影响内容。这个,那只能把 border 和实际内容分离用不同层来表示了。嗯,鼠标移动就更新蒙版位置,应该不成问题。
实现
准备工作
首先,撸好两层日历格子,一层展示日期信息,一层展示探照灯效果的边框。用 flex 布局也好,grid 也好,哪怕 inline-block 也都是没有问题的,这都不重要,重要的是上下两层的格子一定要对齐,然后我们用 relative 的容器把这两层 absolute 层圈起来,固定住。
<div class="calendar">
<div class="calendar-header">
<div class="week-day">一</div>
<div class="week-day">二</div>
<div class="week-day">三</div>
<div class="week-day">四</div>
<div class="week-day">五</div>
<div class="week-day">六</div>
<div class="week-day">日</div>
</div>
<div class="calendar-body">
<div class="grid-container border-layer">
<div class="grid-item"></div>
...
<div class="grid-item"></div>
</div>
<div class="grid-container number-layer">
<div class="grid-item"><span>28</span><span>十四</span></div>
<div class="grid-item"><span>29</span><span>十五</span></div>
...
<div class="grid-item"><span>2</span><span>十九</span></div>
</div>
</div>
</div>
层示意图:

效果就是这样了:

鼠标没有放上去的时候,先把 border 层隐藏掉。
.border-layer {
...
visibility: hidden;
}
.calendar:hover .border-layer {
visibility: visible;
}
CSS Mask
CSS Mask 类似于 Photoshop 中的图层蒙版,可以使用一张图作为蒙版用作在目标元素上,图片的 alpha 通道(也就是透明度信息)决定了目标元素哪部分可见(也可以选择使用亮度信息)。
举个例子,如果蒙版图片是一张半透明图,则作用到实际元素上效果和设置 opacity: 0.5 效果一样;如果蒙版图片是一张中间镂空的五角星,则效果就是元素被裁剪成五角星形状。
Mask 的语法和 background 的语法几乎完全一致,这里我们用径向渐变创建一个半径 80px 从中心白色到边缘透明的渐变圆,配合 mask-repeat 和 mask-size 防止 repeat 和变形。
-webkit-mask-image: radial-gradient(circle at center, white 0%, transparent 80px); -webkit-mask-repeat: no-repeat; -webkit-mask-size: 160px 160px; /* 半径80px 所以 size 需要是 160px */
接下来我们来更新 mask-position 。这里有两个点要注意,一是获取鼠标对目标元素的相对坐标,一是 position 偏移。
MouseEvent 中有一堆的 X/Y,我们用相对 document 的坐标 pageX/pageY,减去目标元素相对 document 的坐标,就能得到我们需要的坐标了。 向量公式: AB = AC - BC :

不过,这里 mask-position 的坐标还需要处理一下。我们定义的 mask 是一张 160x160 的圆形渐变,而 mask-position 和 background-position 一样,定义的是蒙层左上角 (0,0) 的位置实际需要和容器的哪个坐标对齐。因此我们需要把计算得到的坐标再减去 (80, 80) 才能让渐变中心和鼠标的坐标保持一致。
var borderLayer = document.querySelector(".border-layer");
document.querySelector(".calendar").addEventListener("mousemove", function(ev){
var x = ev.pageX;
var y = ev.pageY;
var bounding = borderLayer.getBoundingClientRect();
borderLayer.style.webkitMaskPosition = `${x - bounding.x - 80}px ${y -bounding.y - 80}px`;
});
最终效果:https://codepen.io/liuxiaole-the-sasster/full/OGZgpv
后记
把 border 分层然后应用 mask 的方案只能是在特定场合下有效,分离另一个层增加了很多维护成本。在查阅 MDN 资料的时候,偶然发现居然有个货叫 mask-border ,貌似是作用于 border 的 mask,目前还没有浏览器实现。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了css3 实现圆形旋转倒计时功能,需要的朋友可以参考下
Css3概述从2010年开始,HTML5与CSS3就一直是互联网技术中最受关注的两个话题。从前端技术的角度可以把互联网的发展分为三个阶段:第一阶段是web1.0以内容为主的网络,前端主流技术是HTML和CSS,第二阶段是web2.0的Ajax应用,热门技术是javascrip/DOM/异步数据请求。第三阶段是即将迎来的HTML5+CSS3时代,这两者相辅相成,使互联网又进入一个崭新的时代。什么
书写顺序的意义,减少浏览器reflow(回流),提升浏览器渲染dom的性能。解析html构建dom树,解析css构建css树:将html解析成树形的数据结构,将css解析成树形的数据结构;构建render树:DOM树和CSS树合并之后形成的render树。...
这篇文章主要介绍了css中:focus-within,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
skew函数定义元素在二维平面上的倾斜转换。这种转换是一种剪切映射(横切),在水平和垂直方向上将单元内的每个点扭曲一定的角度。指定一个或两个参数,它们表示在每个方向上应用的倾斜量。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008