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 相关文章推荐
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
Jan 08 Javascript
jquery插件制作 手风琴Panel效果实现
Aug 17 Javascript
JS Date函数整理方便使用
Oct 23 Javascript
详解addEventListener的三个参数之useCapture
Mar 16 Javascript
利用JS实现数字增长
Jul 28 Javascript
值得分享的bootstrap table实例
Sep 22 Javascript
JS前端笔试题分析
Dec 19 Javascript
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 Javascript
JS如何获取地址栏的参数实例讲解
Oct 06 Javascript
微信小程序API—获取定位的详解
Apr 30 Javascript
JS实现在线ps功能详解
Jul 31 Javascript
layui数据表格 table.render 报错的解决方法
Sep 29 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
php5.2.0内存管理改进
2007/01/22 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
python tkinter基本属性详解
2019/09/16 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
pytorch forward两个参数实例
2020/01/17 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
超级实用的8个Python列表技巧
2020/08/24 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
荷兰手表网站:Watch2Day
2018/07/02 全球购物
校运会口号
2014/06/18 职场文书
售后服务质量承诺书
2015/04/29 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
Python 使用dict实现switch的操作
2021/04/07 Python
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏