原生JS实现图片网格式渐显、渐隐效果


Posted in Javascript onJune 05, 2017

先给出效果图:

原生JS实现图片网格式渐显、渐隐效果原生JS实现图片网格式渐显、渐隐效果

写的小组件支持图片的渐显、渐隐,并且可以是有序、随机两种方式。

我采用的原型是属性写在构造函数内,方法写在原型对象内。方法写构造函数内有个问题,就是每次调用这个方法就相当于重新实例化一次,举个粟子:

实现网格效果的原理上是将读取图片的宽高,按照设定的参数,分成等高宽的网格(我用的span标签表示的网格),网格利用定位铺满整个图片,每个网格的背景图都是原图片,原理同sprite,利用background-position属性改变显示区域。接下来就是按照设定的顺序实现渐显或渐隐。渐显或渐隐用的是JS的animation属性和CSS3的animation属性在属性值上有所区别,这次使用也才知道JS的animation属性里有个animationFillMode(规定当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式。)属性值。

我绑定的事件是点击,完全可以用其他事件或页面加载触发。我的代码稍加改动就可以实现网格式轮播图。

下面给出源代码:

<!doctype html>
<head>
<title>网格效果</title>
<style>
  @charset "utf-8";
  /*css reset*/
  html{font-family:"Helvetica Neue",Helvetica,STHeiTi,sans-serif;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;}
  body{-webkit-overflow-scrolling:touch;margin:0;}
  ul{margin:0;padding:0;list-style:none;outline:none;}
  dl,dd{margin:0;}
  a{display:inline-block;margin:0;padding:0;text-decoration:none;background:transparent;outline:none;color:#000;}
  a:link,a:visited,a:hover,a:active{text-decoration:none;color:currentColor;}
  a,dt,dd{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;}
  img{border:0;}
  p{margin:0;}
  input,button,select,textarea{margin:0;padding:0;border:0;outline:0;background-color:transparent;}
  /*css*/
  .origin-pic {
    display: inline-block;
    width: 200px;
    height: 200px;
  }
  .grid-area {
    display: inline-block;
    position: relative;
    width: 200px;
    height: 200px;
  }
  .grid {
    position: absolute;
  }
  #img1 {
    opacity: 1;
    width: 200px;
    height: 200px;
  }
  @keyframes fadeout{
    0% {opacity: 1}
    100% {opacity: 0}
  }
  @keyframes fadein{
    0% {opacity: 0}
    100% {opacity: 1}
  }
</style>
</head>
<body>
<div>
  <img class="origin-pic" src="./pic.jpg" />
</div>
<div id="grid_area" class="grid-area">
  <img id="img1" src="./pic.jpg" />
</div>
<script>
var gridSetting = {
  'cell': 10, // 行、列数量
  'mode': 'fadeout', // 备选参数: fadeout, fadein
  'sort': 'random', // 备选参数: inturn, random
  'num': 1, // 每次发生动作的网格数,目前只支持1
  complete: function() { // 事件完成时的回调函数
    console.log('ok!');
  }
};
var img1 = document.getElementById('img1');
(function(doc, setting, ele) {
  var defaults = {
    'speed': 20,
  };
  function Grid(ele) {
    this.ele = ele;
    this.settings = Object.assign({}, setting, defaults);
  }
  Grid.prototype = {
    constructor: Grid,
    // 构建UI
    _create: function() {
      var img = this.ele,
        settings = this.settings,
        cell = settings.cell,
        imgWidth = img.width,
        imgHeight = img.height,
        gridWidth = imgWidth / cell, // 每个网格宽度
        gridHeight = imgHeight / cell, // 每个网格高度
        currentTop = 0,
        currentLeft = 0,
        fragment = doc.createDocumentFragment(),
        i = 0,
        gridArr = [];
      img.style.display = 'none';
      for (; i < cell * cell; i++) {
        var spanNode = doc.createElement('span');
        spanNode.setAttribute('id', i);
        spanNode.style.cssText +=  'position: absolute;' +
                      'top: ' + currentTop + 'px;' +
                      'left: ' + currentLeft + 'px;' +
                      'margin: 0;' +
                      'padding: 0;' +
                      'width: ' + gridWidth + 'px;' +
                      'height: ' + gridHeight + 'px;' +
                      'opacity:' + settings.opacity + ';' +
                      'background: url('+ img.src + ');' +
                      'background-size: ' + imgWidth + 'px ' + imgHeight + 'px;' +
                      'background-position: -' + currentLeft + 'px -' + currentTop + 'px;';
        if (currentLeft < (imgWidth - gridWidth)) {
          currentLeft += gridWidth;
        } else {
          currentLeft = 0;
          currentTop += gridHeight;
        }
        fragment.append(spanNode);
        gridArr.push(i);
      }
      this.gridArr = gridArr;
      doc.getElementById('grid_area').append(fragment);
    },
    // 渐显、渐隐
    _fade: function() {
      var gridArr = this.gridArr,
        cloneArr = gridArr.slice(0),
        length = gridArr.length,
        settings = this.settings,
        sort = settings.sort,
        i = 0;
      switch(settings.mode) {
        case 'fadeout':
          if (sort == 'inturn') {
            // 按顺序渐隐
            var timer = setInterval(function() {
              doc.getElementById(gridArr[i]).style.animation = "fadeout 1s forwards";
              i++;
              if (i >= settings.cell * settings.cell) {
                clearInterval(timer);
                settings.complete();
              }
            }, settings.speed)
          } else if (sort == 'random') {
            // 随机渐隐
            var timer = setInterval(function() {
              i = cloneArr.splice(Math.random() * length--, 1);
              doc.getElementById(gridArr[i]).style.animation = "fadeout 1s forwards";
              if (length == 0) {
                clearInterval(timer);
                settings.complete();
              }
            }, settings.speed)
          }
          break;
        case 'fadein':
          if (sort == 'inturn') {
            // 按顺序渐渐显
            var timer = setInterval(function() {
              doc.getElementById(gridArr[i]).style.animation = "fadein 1s forwards";
              i++;
              if (i >= settings.cell * settings.cell) {
                clearInterval(timer);
                settings.complete();
              }
            }, settings.speed)
          } else if (sort == 'random') {
            // 随机渐显
            var timer = setInterval(function() {
              i = cloneArr.splice(Math.random() * length--, 1);
              doc.getElementById(gridArr[i]).style.animation = "fadein 1s forwards";
              if (length == 0) {
                clearInterval(timer);
                settings.complete();
              }
            }, settings.speed)
          }
          break;
        default:
          console.log('配置错误!');
      }
    },
    _checkMode: function() {
      if (this.settings.mode == 'fadein') {
        this.settings.opacity = 0;
      } else {
        this.settings.opacity = 1;
      }
    },
  };
  var gridArea = doc.getElementById('grid_area');
  gridArea.addEventListener('click', function() {
    var event = new Grid(ele);
    event._checkMode();
    event._create();
    event._fade();
  }, false);
})(document, gridSetting, img1);
</script>
</body>
</html>

以上所述是小编给大家介绍的原生JS实现图片网格式渐显、渐隐效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jQuery的弹出消息插件 DivAlert之旅(一)
Apr 01 Javascript
Android中资源文件(非代码部分)的使用概览
Dec 18 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
Jun 16 Javascript
JS实现获取当前URL和来源URL的方法
Aug 24 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
Feb 22 Javascript
用vue封装插件并发布到npm的方法步骤
Oct 18 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
Nov 05 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
Feb 02 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
Feb 26 Javascript
Moment.js实现多个同时倒计时
Aug 26 Javascript
vuex actions异步修改状态的实例详解
Nov 06 Javascript
JS实现电商商品展示放大镜特效
Jan 07 Javascript
Node.js开发第三方微信公众平台
Jun 05 #Javascript
js自定义Tab选项卡效果
Jun 05 #Javascript
纯js实现动态时间显示
Sep 07 #Javascript
深入理解Angular.JS中的Scope继承
Jun 04 #Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 #Javascript
npm国内镜像 安装失败的几种解决方案
Jun 04 #Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
Jun 04 #Javascript
You might like
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
python机器学习实现决策树
2019/11/11 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
中国跨境电商:Tomtop
2017/03/16 全球购物
给校长的建议书500字
2014/05/15 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
通讯稿范文
2015/07/22 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
浅谈Python魔法方法
2021/06/28 Java/Android
MySQL一些常用高级SQL语句
2021/07/03 MySQL
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers