原生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 相关文章推荐
使用apply方法实现javascript中的对象继承
Dec 16 Javascript
Javascript基础教程之argument 详解
Jan 18 Javascript
javascript正则表达式中的replace方法详解
Apr 20 Javascript
详细解读JavaScript编程中的Promise使用
Jul 27 Javascript
AngularJs expression详解及简单示例
Sep 01 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
Nov 23 Javascript
jQuery常见的选择器及用法介绍
Dec 20 Javascript
JS中跳出循环的示例代码
Sep 14 Javascript
javascript实现文件拖拽事件
Mar 29 Javascript
node.js微信小程序配置消息推送的实现
Feb 13 Javascript
jquery树形插件zTree高级使用详解
Aug 16 jQuery
LayUi数据表格自定义赋值方式
Oct 26 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 Class SoapClient not found解决方法
2018/01/20 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
python概率计算器实例分析
2015/03/25 Python
在Python中使用模块的教程
2015/04/27 Python
Python实现身份证号码解析
2015/09/01 Python
Python的装饰器使用详解
2017/06/26 Python
python实现上传下载文件功能
2020/11/19 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
基于python监控程序是否关闭
2020/01/14 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
为什么需要版本控制
2016/10/28 面试题
幼儿园六一亲子活动方案
2014/08/26 职场文书
医院护士工作检讨书
2014/10/26 职场文书
幼儿园教师求职信
2015/03/20 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
2019学生会干事辞职信
2019/06/27 职场文书