简单酷炫的hover效果,值得收藏

在浏览B站的时候,发现一个简单酷炫的hover效果的制作视频。浏览完之后,发现其中包含的知识点蛮经典的,特此收藏。

HTMl结构布局很普通,就是简单的一个水平垂直方向居中的表单,代码如下:

<div class="container">
        <h1>bilibili</h1>
        <form action="">
            <input class="tbx" type="text" placeholder="点赞">
            <input class="tbx" type="password" placeholder="投币">
            <input class="sub" type="submit" value="一键三连">
        </form>
</div>

水平垂直居中效果是利用flex布局,这一点很经典,许多项目都在使用。代码如下:

*{
    margin: 0;
    padding: 0;
}
body{
    /* 设置窗口的高度为100%的窗口高度 */
    height: 100vh;
    /* 伸缩盒子模型 */
    display: flex;
    /* 下面两个属性让body里的子类居中 */
    justify-content: center;
    align-items: center;
    background-color: #2c3e50;
}
.container{
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    width: 300px;
    height: 450px;
    border-radius: 20px;
    background-color: #34495e;
    box-shadow: 15px 15px 10px rgba(33,45,58,0.3);
    overflow: hidden;
    position: relative;
}
.container form{
    width: 300px;
    height: 200px;
    display: flex;
    justify-content: space-around;
    flex-direction: column;
    align-items: center;
    z-index: 1;
}

接下来,就是要美化一下表单,毕竟这才是CSS的最基本的作用。

.container form .tbx{
    width: 200px;
    height: 40px;
    outline: none;
    border: none;
    border-bottom: 1px solid #fff;
    background:none;
    color: #fff;
}
/* 设置placeholder */
.container form .tbx::placeholder{
    color: #fff;
    font-size: 15px;
}
.container form .sub{
    width: 200px;
    height: 40px;
    outline: none;
    border: 1px solid #fff;
    border-radius: 20px;
    letter-spacing: 5px;
    color: #fff;
    background: none;
    cursor: pointer;
}
.container h1{
    z-index: 1;
    color: #ecf0f1;
    letter-spacing: 5px;
    padding-left: 5px;
    font-size: 50px;
    font-weight: 100;
    text-shadow: 5px 5px 5px rgba(33,45,58,0.3);
}

基本的布局及样式已经制作出来了,下面就要开始制作hover动画效果了。

此hover效果是基于JQ及CSS3,所以需要在HTML中引入JQ。

首先,先编写CSS3动画效果的代码。

/* 设置鼠标进入的样式 */
.container .in{
    position: absolute;
    top: 0;
    left: 0;
    display: block;
    width: 0;
    height: 0;
    border-radius: 50%;
    background: #3498bd;
    transform: translate(-50%,-50%);
    /* 使用in动画,持续0.5s,缓出的时间函数,停留在最后一帧 */
    animation: in 0.5s ease-out forwards;
}
/* 设置鼠标离开的样式 */
.container .out{
    position: absolute;
    top: 0;
    left: 0;
    display: block;
    width: 1200px;
    height: 1200px;
    border-radius: 50%;
    background: #3498bd;
    transform: translate(-50%,-50%);
    animation: out 0.5s ease-out forwards;
}
/* 设置鼠标进入时,元素的动画 */
@keyframes in{
    /* 初始关键帧 */
    0%{
        width: 0;
        height: 0;
    }
    /* 结尾关键帧 */
    100%{
        width: 1200px;
        height: 1200px;
    }
}
/* 设置鼠标离开时,元素的动画 */
@keyframes out{
    /* 初始关键帧 */
    0%{
        width: 1200px;
        height: 1200px;
    }
    /* 结尾关键帧 */
    100%{
        width: 0;
        height: 0;
    }
}

接下来利用JavaScript,给鼠标指针绑定动画。

 // 定义一个con绑定 .container
 const con=document.querySelector('.container');

 // 定义两个函数开关(门)
 let isIn=true;      //鼠标进去的门,默认打开
 let isOut=false;    //鼠标出去的门,默认关闭

 var span;           //给未出生的元素取个名字

 //监听鼠标进去的事件+进去的方法
 con.addEventListener('mouseenter',(e)=>{
   if(isIn){
   //如果进去的门时打开的,就可以执行这个函数

     //获取进入的鼠标位置
     //生成元素的位置=进入点距离窗口的距离-父盒子距离窗口的距离
     let inx=e.clientX-e.target.offsetLeft;
     let iny=e.clientY-e.target.offsetTop;

     //创建一个span元素,并且给它对应的出生坐标
     let el=document.createElement('span');
     el.style.left=inx+'px';
     el.style.top=iny+'px';
     con.appendChild(el);//添加到con对应的父元素,即container

     $('.container span').removeClass('out');//除去出去的动画 不知道这样写是不是不太好
     $('.container span').addClass('in');//添加进入的动画
     span=document.querySelector('.container span');
     isIn=false; //关闭进来的门(不能使用进入的方法)
     isOut=true; //打开出去的门(可以使用出去的方法)
   }
 })

 //监听鼠标出来的事件+出来的方法
 con.addEventListener('mouseleave',(e)=>{
   if(isOut){
     //获取出去的鼠标位置
     //生成元素的位置=进入点距离窗口的距离-父盒子距离窗口的距离
     let inx=e.clientX-e.target.offsetLeft;
     let iny=e.clientY-e.target.offsetTop;
 
     $('.container span').removeClass('in');//移除进入的动画
     $('.container span').addClass('out');//添加出去的动画
     $('.out').css('left',inx+'px');//添加出去的坐标
     $('.out').css('top',iny+'px');

     isOut=false;//关闭出去的大门

      //当动画结束后再删除元素
      setTimeout(()=>{
         con.removeChild(span);//删除元素
         isIn=true;//打开进来的大门
       },500)
                
   }
})

细心一品,就会发现此hover效果包含flex布局,CSS3动画及JQ节点(对象)操作知识点。这些知识点都是在项目中被广泛使用的。

万丈高楼平地起,越是高贵华丽的东西,越是需要注重最基础的基石。

Like (0)
Donate 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
Previous 2020年7月17日
Next 2020年8月17日

相关推荐

  • typeof 和 instanceof的区别

    在前端开发过程中,typeof与instanceof是经常要用到的, 了解两者的区别是每一个合格前端工程师所要掌握的。 JavaScript中typeof和instanceof常用…

    2019年6月18日
    1.6K
  • 一道前端函数面试题

    这题的规则是这样的 拿到这种题目,我先来说说我自己的做题流程,一般会去找它最简单的形态。我们一步一步来拆解。 先去掉 sumOf() 变成了以下形态 嗯&#82…

    2020年11月22日
    1.1K
  • Angular与vue对比

    Vue.js 是开源的 JavaScript 框架,能够帮助开发者构建出美观的 Web 界面。当和其它网络工具配合使用时,Vue.js 的优秀功能会得到大大加强。如今,已有许多开发…

    2019年6月13日
    1.7K
  • Webpack入门,打包第一个工程

    简介 Webpack是一个开源的JavaScript模块打包工具,其最核心的功能是解决模块之间的依赖,把各个模块按照特定的规则和顺序组织在一起,最终合并为一个JS文件(有时会多个)…

    2022年11月8日
    410
  • 前端开发工程师怎样独立调试前端项目?

    在前后端分离开发的大环境下,前端开发已经不仅仅局限于所谓的切图,写页面的工作,同时,也给前端开发定义了新的含义。有前后端分离项目开发的工程师,都知道,这样的项目开发起来有多么的方便…

    2020年8月31日
    1.5K
  • 异步神器async-await

    async-await和Promise的关系 async-await是建立在promise机制之上 ,async-await是promise和generator的语法糖。增强了代码…

    2019年6月3日
    1.5K
  • HTTP三次握手与四次挥手详解

    前端工程师面试的时候,关于HTTP三次握手是最常被询问的一个知识点,往往很多人,都是知道其原理及过程,就是用话语表达不出来,正式一点,就是词不达意。今天浏览到一篇关于HTTP三次握…

    2019年12月6日
    1.6K
  • 浏览器渲染机制

    为什么要了解浏览器渲染页面机制?主要是还是性能的优化。 了解浏览器如何进行加载,我们可以在引用外部样式文件、外部JS时,将它们放到合适的位置,是浏览器以最快的速度,将文件加载完毕。…

    2019年5月31日
    1.6K
  • vue开发小程序项目总结

    最近全权负责一个小程序的前端开发工作,之前小程序使用原生技术开发过一版,当时由于进入项目组晚,且项目开发周期短,没有详细了解项目的各种情况,导致后期开发过程中出现各种各样的让人烦心…

    2020年11月24日
    1.4K
  • node环境下使用express框架连接MySQL数据库

    目前,越来越多的企业选择使用前后端分离模式新建项目,这样,使得开发工作越来越便捷。那么,作为前端开发,怎样能在后端开发没有完成之前,测试并运行前端项目呢。在这里,小编推荐使用exp…

    2020年8月26日
    1.7K

发表回复

Please Login to Comment