JavaScript 30 Day -- 15 文字阴影

实现效果:

文字阴影的鼠标随动效果

关键点:

1.在script标签中,我们使用3个变量,一个指向div元素,一个指向其子元素h1,最后一个变量factor用于标记阴影距离h1中心的距离和鼠标距离h1中心距离的比例,用于计算阴影的具体位置。

2.在hero元素上监听鼠标移动事件mousemove,并添加事件处理的回调函数shadowMove.

hero.addEventListener('mousemove',shadowMove);

3.为获得第一个阴影的瞬时位置,需要通过鼠标位置距离h1中心的距离乘以factor系数来获得,pos表示鼠标当前位置的坐标,range指代hero元素的宽和高:

var disX = parseInt((pos.x-range.x/2)*factor);
var disY = parseInt((pos.y-range.y/2)*factor);

4.从事件发生的event对象中获取需要的值:

var range = {
  x:hero.offsetWidth,
  y:hero.offsetHeight
}
var pos = {
  x:e.target.offsetLeft+e.offsetX,
  y:e.target.offsetTop+e.offsetY
}

5.计算出h1元素第一个阴影位置后,可以以坐标镜像或旋转90°等不同的方式来生成其他阴影,本例中我们采用绕h1元素中心旋转90°的方式共生成4个阴影:

text.style.textShadow = `
  ${xWalk}px ${yWalk}px 0 rgba(255,0,255,0.7),
  ${xWalk * -1}px ${yWalk}px 0 rgba(0,255,255,0.7),
  ${yWalk}px ${xWalk * -1}px 0 rgba(0,255,0,0.7),
  ${yWalk * -1}px ${xWalk}px 0 rgba(0,0,255,0.7)
`;

javascript

  const hero = document.querySelector('.hero');
  const text = hero.querySelector('h1');
  const walk = 400;

  function shadow(e){
    // console.log(e);
    // const width = hero.offsetWidth;
    // const height = hero.offsetHeight;
    const { offsetWidth:width,offsetHeight:height } = hero;
    // console.log(hero);

    let { offsetX:x,offsetY:y } = e;
    // console.log(e); 
    if(this !== e.target){
      // console.log(e);
      x = x + e.target.offsetLeft;
      y = y + e.target.offsetTop;
    }
    // console.log(x,y);
    const xWalk = Math.round(( x / width * walk) - ( walk / 2));
    const yWalk = Math.round(( y / height * walk) - ( walk / 2));
    // console.log(xWalk,yWalk);
    text.style.textShadow = `
      ${xWalk}px ${yWalk}px 0px rgba(255,0,255,0.6),
      ${xWalk * - 1}px ${yWalk}px 0px rgba(0,0,255,0.6),     
      ${yWalk}px ${xWalk * - 1}px 0px rgba(0,0,0,0.6),
      ${yWalk * - 1}px ${xWalk}px 0px rgba(255,0,0,0.6)
    `
   }
  hero.addEventListener('mousemove',shadow);
var hero = document.querySelector('.hero');
var text = hero.querySelector('h1');
var factor = 0.4;//当鼠标移动至显示区域边界时,阴影距离占hero元素宽和高的比例
//在div范围内监听
hero.addEventListener('mousemove',shadowMove);

//文字阴影效果及移动函数
function shadowMove(e){
    var range = {
      x:hero.offsetWidth,
      y:hero.offsetHeight
    }
    var pos = {
      x:e.target.offsetLeft+e.offsetX,
      y:e.target.offsetTop+e.offsetY
    }
    //计算阴影移动距离
    var disX = parseInt((pos.x-range.x/2)*factor);
    var disY = parseInt((pos.y-range.y/2)*factor);
    //修改阴影样式
    text.style.textShadow = disX+'px '+disY+'px 0 #3498db,'+(-disX)+'px '+disY+'px 0 #1abc9c,'+disY+'px '+(-disX)+'px 0 #9b59b6,'+(-disY)+'px '+(-disX)+'px 0 #e74c3c';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值