关于css3:CSS-移动光标使文本产生多个反差色特效

37次阅读

共计 2525 个字符,预计需要花费 7 分钟才能阅读完成。

周末浏览 codepen 时发现一个不错的动画交互成果,如上图所示,有一个多个色彩的嵌套圆形追随鼠标挪动,且和文字造成不同的反差色,交互成果给人眼前一亮的感觉,本文将开展阐明其实现过程。

动画成果合成

基于下面的动画效果图能够次要合成为以下几块内容:

  • 有一个三种色彩的嵌套圆形
  • 嵌套圆形追随鼠标挪动
  • 圆形挪动过程中和文字产生反差色成果
  • 圆形挪动过程中随同弹性成果

后面两个性能点实现较为简单,前面两个性能点须要对相干知识点有肯定的理解,实现起来绝对较快,接下来进入代码实现过程。

代码实现

实现三个圆形嵌套就三个 div 即可,此处款式应用 SCSS,写法绝对简洁,应用@each 函数循环解决,代码如下:

<div class="shapes">
  <div class="shape shape-1"></div>
  <div class="shape shape-2"></div>
  <div class="shape shape-3"></div>
</div>

scss

.shapes {
  position: relative;
  height: 100vh;
  width: 100vw;
  background: #2128bd;
  overflow: hidden;
}

.shape {
  position: absolute;
  border-radius: 50%;
  
  $shapes: (#005ffe: 650px, #ffe5e3: 440px, #ffcc57: 270px);
  
  @each $color, $size in $shapes {&.shape-#{index($shapes, ($color $size))} {
      background: $color;
      width: $size;
      height: $size;
      margin: (-$size/2) 0 0 (-$size/2);
    }
  }
}

到此一个简略的多个圆形嵌套的图形就进去了。

而后就是让该图形追随鼠标挪动起来,这里只须要监听鼠标挪动事件即可实现。上面的 cursor 是核心的原点,shape 则是三个圆形。

const cursor = document.querySelector('.cursor')
const shape = document.querySelectorAll('.shape')

document.body.addEventListener("mousemove", evt => {
  const mouseX = evt.clientX;
  const mouseY = evt.clientY;

  cursor.style = `transform: translate(${mouseX}px, ${mouseY}px);`
  
  shape.forEach(item => {item.style = `transform: translate(${mouseX}px, ${mouseY}px);`
  })

})

接下来实现圆形和文字的反差色成果,这里用到了 CSS3 中的混合模式 mix-blend-mode 中的混合模式 screen,中文翻译为“滤色”,计算公式如下:

公式中的 C 示意最终混合的 RGB 色值(范畴是 0 -255),A 和 B 示意用来混合的两个色彩的 RGB 色值(范畴也是 0 -255)。从公式的内容能够看出,滤色混合模式的色彩,是将两个色彩的互补色的像素值相乘,而后除以 255 的互补色值。

例如有一个红色,其 RGB 值是 (255,0,0),还有一个蓝色,其RGB 值是(0,0,255),则这两个色彩应用滤色混合模式之后的色彩色值是:

  • R = 255 – (255 – 255) * (255 – 0) / 255 = 255
  • G = 255 – (255 – 0) * (255 – 0) / 255 = 0
  • B = 255 – (255 – 0) * (255 – 255) / 255 = 255

则最终的色值是 RGB(255,0,255),以下是一些直观的个性:

  • 任何色彩和彩色执行滤色,还是出现原来的色彩;
  • 任何色彩和红色执行滤色失去的是红色;
  • 任何色彩和其余色彩执行滤色模式混合后的色彩会更浅,有点相似漂白的成果。

回到咱们最开始的动画成果,追随鼠标挪动的圆形只会在和文字相交的时候才会呈现,而在其余的区域是不见的,那么咱们将设置文本元素的背景色为红色,因为应用滤色后,任何色彩和红色执行滤色失去的是红色。

.content {
  top: 0;
  left: 0;
  position: absolute;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  width: 100vw;
  background: #fff;
  mix-blend-mode: screen;
}

此时咱们的根本成果曾经实现了,但此时挪动的圆形绝对比拟僵硬,原成果中应用了 gsap 动画库,圆形追随鼠标的成果十分晦涩难受。

GreenSock 动画平台(GSAP)能够对 JavaScript 能够操作的所有内容进行动画解决(CSS 属性,SVG,React,画布,通用对象等),同时解决了不同浏览器上存在的兼容性问题,而且速度极快(比 jQuery 快 20 倍)。大概有 1000 万个站点和许多次要品牌都应用 GSAP。

应用 gsap 后的 js 代码如下,十分简洁:

document.body.addEventListener("mousemove", evt => {
  const mouseX = evt.clientX;
  const mouseY = evt.clientY;
  
  gsap.set(".cursor", {
    x: mouseX,
    y: mouseY
  })
  
  gsap.to(".shape", {
    x: mouseX,
    y: mouseY,
    stagger: -0.1
  })
})

代码在线预览:
https://code.juejin.cn/pen/71…

最初

整体的代码实现就到此结束了,基于此逻辑咱们还能够实现相似的成果,比方批改圆形的背景为渐变色,减少暗影或更换为其余图片成果等,喜爱的连忙本人尝试看看吧。

看到最初如果感觉有用,记得点个赞珍藏起来吧,说不定哪天就用上啦。

专一前端开发,分享前端相干技术干货,公众号:南城大前端(ID: nanchengfe)

参考

web 前端入门到实战:CSS mix-blend-mode 滤色 screen 混合模式

GSAP 官网

codepen – carolineartz

正文完
 0