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 相关文章推荐
javascript smipleChart 简单图标类
Jan 12 Javascript
判断用户是否在线的代码
Mar 05 Javascript
Jquery中显示隐藏的实现代码分析
Jul 26 Javascript
JavaScript的递归之递归与循环示例介绍
Aug 05 Javascript
jQuery Form表单取值的方法
Jan 11 Javascript
Vue中img的src属性绑定与static文件夹实例
May 18 Javascript
纯js实现页面返回顶部的动画(超简单)
Aug 10 Javascript
vue页面加载闪烁问题的解决方法
Mar 28 Javascript
Vue2.0 实现移动端图片上传功能
May 30 Javascript
从零开始封装自己的自定义Vue组件
Oct 09 Javascript
layui type2 通过url给iframe子页面传值的例子
Sep 06 Javascript
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
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
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
通过javascript设置css属性的代码
2009/12/28 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
Node.js操作redis实现添加查询功能
2017/05/25 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
python单例模式实例解析
2018/08/28 Python
python实现AES加密解密
2019/03/28 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
python conda操作方法
2019/09/11 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
关于VPN
2012/06/10 面试题
大四学生思想汇报
2014/01/13 职场文书
音乐教师求职信
2014/06/28 职场文书
数学教师个人工作总结
2015/02/06 职场文书
道歉情书大全
2015/05/12 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL
MySQL 原理与优化之Update 优化
2022/08/14 MySQL