JavaScript基于SVG的图片切换效果实例代码


Posted in Javascript onDecember 15, 2020

最近太忙了,自动来到rjxy后,不晓得怎么回事,忙的都没时间更博了。

昨天还有个同学跟我说,你好久没更新博客了。。

甚为惭愧~~

正好12月来了,今天开一篇。

最近上课讲到了 SVG,不晓得同学们理解到没。 -_-!!!

图片轮播见的太多,今天就用 SVG 写了一个图片轮播,效果如下。

JavaScript基于SVG的图片切换效果实例代码

效果要求

点击控制块,图片切换。切换的时候使用圆形做遮罩,由小到大变化。每次切换的时候,圆的位置随机产生。

主要知识点

1. SVG 的裁切(遮罩),clip-path 的运用。

2. SVG 利用 JS 更改层级。因为 SVG 不支持 CSS 的 z-index 更改层级,它永远只会让后面的标签盖住前面的标签。

所以,我就利用 JS 的 appendChild 方法,让每次展示的图片,都移动位置到 SVG 的最后---- 话说我真是聪明。

// 更改当前图片的层级为最顶层,也就是放到 SVG 的最后,它会覆盖前面的图片。
bannerSvg.appendChild( pic[index ]);

3. 圆圈的放大,我用的是 requestAnimationFrame 方法。比传统计时器 setInterval  和 setTimeout 节约资源太多。具体大家可以百度下。

4. 控制块,利用的 DOM 根据展示的图片个数动态生成。

HTML代码

<svg width="700" height="393" id="banner">
  <defs>
    <clipPath id="c1">
      <circle id="circle" cx="350" cy="196" r="20"></circle>
    </clipPath >
  </defs>
  <a class="banner_img" xlink:href="https://www.baidu.com" rel="external nofollow" >
    <image x="0" y="0" xlink:href="images/1.jpg" rel="external nofollow" ></image>
  </a>
  <a class="banner_img" xlink:href="https://www.sina.com.cn" rel="external nofollow" >
    <image x="0" y="0" xlink:href="images/2.jpg" rel="external nofollow" ></image>
  </a>
  <a class="banner_img" xlink:href="https://www.sohu.com.cn" rel="external nofollow" >
    <image x="0" y="0" xlink:href="images/3.jpg" rel="external nofollow" ></image>
  </a>
</svg>
<ul id="ul" class="ul">
 <!-- 空着,等 js 动态生成 -->
</ul>

CSS 代码

.ul {
  display: flex;
  list-style: none;
}
.ul li{
  background: #eee;
  padding-left: 20px;
  padding-right: 20px;
  margin-left: 4px;
  margin-right: 4px;
}
.ul .on{
  background: #f30;
  color: #fff;
}

JavaScript 代码

let nowpic = 0 ;
let myani = null;
let radius = 0;
// 找标签
let bannerSvg = document.getElementById("banner");
let circle = document.getElementById("circle");
let ul = document.getElementById("ul");
let li = [];
let pic = bannerSvg.querySelectorAll(".banner_img");
// 控制块初始化。
for( let i=0 ; i <= pic.length-1 ; i++ ){
  // 生成 li 标签
  let childLi = document.createElement("li");
  // 添加 li 内容,为当前数字
  childLi.innerHTML = i+1 ;
  // 把 li 分别放入 ul 标签 和 数组 li 中。
  ul.appendChild(childLi);
  li.push(childLi);
}
li[0].classList.add("on");
// 遮罩圆动画
let circleAni = function(){
  console.info(radius);
  radius += 20;
  radius = Math.min(800, radius);
  circle.style.r = radius +"px";
  myani = requestAnimationFrame(circleAni);
  if( radius >= 800 ){
    cancelAnimationFrame( myani );
  }
};
// 显示图片的函数
let showPic = function(index){
  for(let i=0 ; i<=pic.length-1 ; i++ ){
    // 控制块变化
    li[i].classList.remove("on");
    // 不显示的图片不需要遮罩。
    pic[i].children[0].setAttribute("clip-path","");
  }
  // 更改当前图片的层级为最顶层,也就是放到 SVG 的最后,它会覆盖前面的图片。
  bannerSvg.appendChild( pic[index ]);
  // 退出上一步动画
  cancelAnimationFrame( myani );
  // 遮罩圆半径初始化为 0
  radius = 0 ;
  circle.style.r = radius+"px";
  // 遮罩圆的圆心(也就是位置)随机。
  circle.setAttribute("cx",Math.random()*700);
  circle.setAttribute("cy",Math.random()*303);
  // 给指定的图片添加遮罩 clip-path
  pic[index].children[0].setAttribute("clip-path","url(#c1)");
  // 执行 circle 动画
  myani = requestAnimationFrame(circleAni); // circle 动画
 
  // 控制块的变化
  li[index].classList.add("on");
}
 
showPic(0); // 默认显示第一张
for( let i=0 ; i<= li.length-1 ; i++ ){
  li[i].addEventListener("click",function(){
    showPic(i);
  });
}

到此这篇关于JavaScript基于SVG的图片切换效果实例代码的文章就介绍到这了,更多相关js svg图片切换效果内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
js常用排序实现代码
Dec 28 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
Mar 02 Javascript
javascript基础知识分享之类与函数化
Feb 13 Javascript
原生JS和jQuery操作DOM对比总结
Jan 19 Javascript
Vue filters过滤器的使用方法
Jul 14 Javascript
vue 项目如何引入微信sdk接口的方法
Dec 18 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
Mar 28 Javascript
原生JS实现的简单小钟表功能示例
Aug 30 Javascript
vue基础之v-bind属性、class和style用法分析
Mar 11 Javascript
js 实现watch监听数据变化的代码
Oct 13 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
Apr 09 Javascript
Vue解决移动端弹窗滚动穿透问题
Dec 15 #Vue.js
8个非常实用的Vue自定义指令
Dec 15 #Vue.js
JavaScript中Object、map、weakmap的区别分析
Dec 15 #Javascript
JavaScript中遍历的十种方法总结
Dec 15 #Javascript
token 机制和实现方式
Dec 15 #Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 #Vue.js
一分钟学会JavaScript中的try-catch
Dec 14 #Javascript
You might like
论坛头像随机变换代码
2006/10/09 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
DIV菜单层实现代码
2010/11/19 Javascript
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
支付宝小程序tabbar底部导航
2018/11/06 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
详解Anaconda 的安装教程
2020/09/23 Python
举例讲解Python装饰器
2020/12/24 Python
详解Python中的Lock和Rlock
2021/01/26 Python
计算机专业个人求职自荐信
2013/09/21 职场文书
应届生人事助理求职信
2013/11/09 职场文书
酒店管理专业毕业生推荐信
2013/11/10 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL