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 相关文章推荐
取得传值的函数
Oct 27 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
Apr 02 Javascript
浅析webapp框架AngularUI的demo
Dec 21 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
Apr 12 Javascript
在JS方法中返回多个值的方法汇总
May 20 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
May 05 Javascript
ES6概念 Symbol toString()方法
Dec 25 Javascript
谈谈vue中mixin的一点理解
Dec 12 Javascript
vue页面跳转后返回原页面初始位置方法
Feb 11 Javascript
详解webpack模块化管理和打包工具
Apr 21 Javascript
微信小程序全选多选效果实现代码解析
Jan 21 Javascript
解决vue中provide inject的响应式监听
Apr 19 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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
python使用代理ip访问网站的实例
2018/05/07 Python
python sorted方法和列表使用解析
2019/11/18 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
临床医学系毕业生推荐信
2013/11/09 职场文书
找工作最新求职信
2013/12/22 职场文书
医学专业毕业生个人求职信
2013/12/25 职场文书
工程建设实施方案
2014/03/14 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
2014年档案室工作总结
2014/12/01 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis