15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > CSS3为网页打造丝滑鼠标效果

CSS3为网页打造丝滑鼠标效果

时间:2023-07-20 03:51:01 | 来源:网站运营

时间:2023-07-20 03:51:01 来源:网站运营

CSS3为网页打造丝滑鼠标效果:可能各位经常能看到一个画面:在一个网站首页右下角的地方有两个图标,分别是QQ和微信字样,当鼠标划入时,会在上方以极其流利的动画显示出一个二维码、或提示。

就像这样:







而本文实现的就是这个效果!


html部分很简单 —— 就是一个div下包着的两个a链接(section没什么意义,请忽略它吧),每个a中都有一个图标 —— 开始时显示的图标,和一个span标签 —— 鼠标移入时在周围弹出的内容。

<div class="container"> <section> <a href="javascript:void(0);"> <i class="iconfont icon-qq"></i> <span> <img src="img/qq.png" /> 优C体验咨询群 </span> </a> <a href="javascript:void(0);"> <i class="iconfont icon-wangzhan"></i> <span class="span_two"> <img src="img/hub.png" /> 优C·技术封推 </span> </a> </section></div>这里用父子结构的原因在于:要实现“紧跟着i图标周围弹出内容”需要用到 “父相子绝” 的position模式。

  1. 所用图标来自 阿里图标库iconfont,推荐大家在项目中使用它;



  1. 其实原本笔者想直接用“伟大的”focus-within,它可以避开“父相子绝”的限制。但是它是focus系列,用在PC端总没有hover流畅!



然后是css样式:

从上演示可以看出:弹出框将从链接的顶部以动画弹出。这意味着你按本文代码所示网页底部bottom区域必须“足够大”(或者不能有 overflow:hidden; )—— 这是最基础的。否则你的网页将会很难看!

/** 这里为了方便演示将div居中 */div.container { display: inline-block; position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%);}接下来,我们对链接进行样式设置,创建简单的背景悬停效果,并定位社交媒体图标:

a { color: #fff; background: #8a938b; border-radius: 4px; text-align: center; text-decoration: none; position: relative; display: inline-block; box-sizing: border-box; padding: 12px; -o-transition: all .3s; -webkit-transition: all .3s; -moz-transition: all .3s; transition: all .3s; -webkit-font-smoothing: antialiased;}a:hover { background: #5a665e;}.iconfont { font-size: 36px; vertical-align: middle; display: inline-block; position: relative; top: 20%;}接下来,我们将对弹出文本进行样式设置和动画处理:

a span { max-width: 200px; max-height: 147px; color: #666; position: absolute; bottom: 0; left: -30px; right: 0; padding: 10px 6px; z-index: -1; font-size: 11px; border-radius: 5px; background: #fff; visibility: hidden; opacity: 0; -o-transition: all .4s cubic-bezier(0.68, -0.55, 0.265, 1.55); -webkit-transition: all .4s cubic-bezier(0.68, -0.55, 0.265, 1.55); -moz-transition: all .4s cubic-bezier(0.68, -0.55, 0.265, 1.55); transition: all .4s cubic-bezier(0.68, -0.55, 0.265, 1.55);}a span.span_two { left: 0; right: -30px;}span img{ max-width: 100%; max-height: 100%; width: initial; height: initial;}/* 当图标处于悬停状态时,文本将弹出 */a:hover span { bottom: 70px; visibility: visible; opacity: 1;}
关于Cubic-Bezier曲线:

CSS3中的Cubic-Bezier曲线规定了元素运动的特殊性,它由四个点p0,p1,p2和p3定义。 p0点是曲线的起点,而p3点是曲线的终点。曲线越线性,运动就越僵硬(或不那么流畅)。

如果一个点一开始是正数,而下一个点是负数,那么运动一开始就会很慢。当点值变得比之前的点值高时,运动加快。

这就是CSS中Cubic-Bezier点的含义。由于动画短,所以动作很细微。弹出框从正方形底部开始时缓慢开始,然后开始加速到顶部。


做到这里,我们会发现文首的效果图中弹出框下有两个小三角用来“指引”,这个其实非常经典 —— transparent的应用!

transparent:透明。被规定的元素的color或background-color将不再拥有自身颜色,在效果上看就像“没有了”一样。它和display等属性的区别在于 —— 它可以使一个元素的某一部分“消失不见”,而不用像早期那样用各种背景色去适配!

a span::before { content: ''; width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #fff; position: absolute; bottom: -4px; left: 68px; right: auto;}a span.span_two::before { left: auto; right: 68px;}它的作用原理就是 —— 一个div的上下左右边框是可以分别操控的、是独立的(它不是四个方形):







(width和height为0,border分别为20px、不同颜色下渲染效果。)

最后,我们发现上面运用了大量的hover,但是移动端它不支持hover啊,它会导致类似click一样的300ms延迟效果。这对用户体验来说是不友好的:

@media (any-hover: none) { a:focus { background-color: #5a665e; }}@media (any-hover: none) { a:focus span { bottom: 70px; visibility: visible; opacity: 1; }}
any-hover:可用于测试是否有任意可用的输入装置可以hover悬停在元素上的CSS媒体属性。例如鼠标这个输入装置就可以控制cursor手形的位置,以及hover在元素上;例如手机都是手指控制,没有什么悬停感应,因此,没有装置可以hover悬停(虽然手指也能触发:hover伪类效果)。因此,any-hover媒体查询简介可以用来精确控制不同设备上的hover交互行为,尤其对于跨平台的网页,响应式网站,非常有用。
语法:
  1. none:没有什么输入装置可以实现hover悬停,或者没有可以指向的输入装置。



  1. hover:有至少一个输入装置可以触发元素的hover悬停交互。




当然,本文的效果用纯粹的 opacity / visibility + translate + scale 也可以完美实现,不过...有现成的东西,干嘛不用呢?


前两天笔者就在项目中给“翻转动画”增加了一个3D效果,看起来贼爽:







这个动画实现所用到的3D盒子模型是现在3D模型中最常用的一个 —— 不过我们先拿其中两个面分析:

  1. 首先,要实现这个功能,我们从外往里看:把文字所在部分看作一个盒子的话,前后两个横线并不属于这个盒子才对,那么,很自然就想到了—— ::after::before 伪元素;
  2. 其次,两个文字分别在两个div上,那么就需要有一个可以附带 overflow: hidden 的盒子 —— 不能加到上面的盒子中,因为after和before不属于div!
  3. 最后是两个元素的翻转效果:我们需要知道的是,为了性能考虑,我们最好是对整个盒子进行翻转,而不是对两个文字div附加动画
事实上,transform动画中的属性表示的含义更多的是“过渡多少”而不是“过渡到哪里”!
那么,这个层级关系就很明了了:

<!--伪元素装饰盒子--><div class="pic_border"> <!--overflow-hidden盒子--> <div class="pic_box"> <!--transition过渡盒子--> <div class="pic_item"> <div class="pic_text">music</div> <div class="pic_back">此时此刻,非我莫属</div> </div> </div></div>按照上面所说,我们很容易为它添加对应的CSS:

.pic_border{ position: relative;}.pic_border::before{ content: ''; position: absolute; top: 50%; left: 0; width: 43vw; height: 1px; background-color: red;}.pic_border::after{ content: ''; position: absolute; top: 50%; right: 0; width: 43vw; height: 1px; background-color: red;}@media screen and (max-width: 1100px) { .pic_border::before,.pic_border::after{ width: 20vw; }}.pic_box{ display: inline-block; height: 70px; margin-left: calc(50% - 70px); overflow: hidden; perspective: 2000px; cursor: pointer; user-select: none;}.pic_item{ width: 100%; height: 100%; transform-style: preserve-3d; transition: all .7s ease;}.pic_text,.pic_back{ width: 100%; height: 100%; display: flex; justify-content: center; align-items: center;}.pic_text{ transform: rotateX(0deg) translateZ(-21.9px);}.pic_back{ transform: rotateX(90deg) translateZ(-15px);}.pic_box:hover .pic_item{ transform: rotateX(-90deg);}.pic_box:active .pic_item{ transform: rotateX(-90deg);}需要注意的是:3D效果是一定要有Z轴参与的! 不然会显得很“尴尬“


我组建了一个前端自学团,学习前端技术。在团里,会严格监督大家每天学习打卡,给大家分享学习资料,给大家匹配学习伙伴,定期组织大家进行项目实战。想要加入一起学习的小伙伴可以私信我或是给我留言

作者:koaxios

链接:CSS3为网页打造丝滑鼠标效果

关键词:效果,打造

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭