原生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 相关文章推荐
Prototype Template对象 学习
Jul 19 Javascript
JS与框架页的操作代码
Jan 17 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
May 14 Javascript
js查看一个函数的执行时间实例代码
Sep 12 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
Jul 07 Javascript
JSON对象 详解及实例代码
Oct 18 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
js实现淡入淡出轮播切换功能
Jan 13 Javascript
node.js中cluster的使用教程
Jun 09 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
Jul 17 jQuery
JS继承与闭包及JS实现继承的三种方式
Oct 15 Javascript
vue watch关于对象内的属性监听
Apr 22 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开发框架Laravel数据库操作方法总结
2014/09/03 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
jquery live()调用不存在的解决方法
2014/02/26 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
js轮播图代码分享
2016/07/14 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
javascript简单写的判断电话号码实例
2017/05/24 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
python实现保存网页到本地示例
2014/03/16 Python
跟老齐学Python之print详解
2014/09/28 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
python numpy数组复制使用实例解析
2020/01/10 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
复古服装:RetroStage
2019/05/10 全球购物
超市端午节活动方案
2014/01/23 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
保研推荐信格式
2015/03/25 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
生日宴会祝酒词
2015/08/10 职场文书
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers
Python使用openpyxl模块处理Excel文件
2022/06/05 Python