先给出效果图:
写的小组件支持图片的渐显、渐隐,并且可以是有序、随机两种方式。
我采用的原型是属性写在构造函数内,方法写在原型对象内。方法写构造函数内有个问题,就是每次调用这个方法就相当于重新实例化一次,举个粟子:
实现网格效果的原理上是将读取图片的宽高,按照设定的参数,分成等高宽的网格(我用的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实现图片网格式渐显、渐隐效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# js图片渐隐渐显效果
# js
# 渐隐
# 渐隐渐现
# Three.js学习之网格
# JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
# 分享十三个最佳JavaScript数据网格库
# Vue.js实现网格列表布局转换方法
# Three.js中网格对象MESH的属性与方法详解
# Javascript Bootstrap的网格系统
# 导航栏和轮播详解
# JavaScript Canvas绘制六边形网格
# JavaScript网格中的最小路径讲解
# 有个
# 写在
# 小编
# 的是
# 都是
# 在此
# 两种
# 可以用
# 才知道
# 我用
# 给大家
# 所述
# 绑定
# 回调
# 给我留言
# 源代码
# 感谢大家
# 举个
# 就可以
相关文章:
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何在万网主机上快速搭建网站?
如何快速搭建二级域名独立网站?
建站之星2.7模板快速切换与批量管理功能操作指南
如何通过西部数码建站助手快速创建专业网站?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何有效防御Web建站篡改攻击?
建站为何优先选择香港服务器?
做企业网站制作流程,企业网站制作基本流程有哪些?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
c# 服务器GC和工作站GC的区别和设置
建站之家VIP精选网站模板与SEO优化教程整合指南
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
Swift中循环语句中的转移语句 break 和 continue
建站主机如何选?高性价比方案全解析
如何通过建站之星自助学习解决操作问题?
如何用5美元大硬盘VPS安全高效搭建个人网站?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
MySQL查询结果复制到新表的方法(更新、插入)
SQL查询语句优化的实用方法总结
已有域名和空间如何搭建网站?
建站主机是什么?如何选择适合的建站主机?
如何通过.red域名打造高辨识度品牌网站?
建站之星伪静态规则如何设置?
,柠檬视频怎样兑换vip?
如何快速配置高效服务器建站软件?
开心动漫网站制作软件下载,十分开心动画为何停播?
个人网站制作流程图片大全,个人网站如何注销?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
宝塔新建站点报错如何解决?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何设置并定期更换建站之星安全管理员密码?
代购小票制作网站有哪些,购物小票的简要说明?
如何做静态网页,sublimetext3.0制作静态网页?
高防服务器:AI智能防御DDoS攻击与数据安全保障
高防服务器租用首荐平台,企业级优惠套餐快速部署
如何高效配置IIS服务器搭建网站?
深圳网站制作平台,深圳市做网站好的公司有哪些?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
网站好制作吗知乎,网站开发好学吗?有什么技巧?
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何挑选高效建站主机与优质域名?
制作网站怎么制作,*游戏网站怎么搭建?
如何通过WDCP绑定主域名及创建子域名站点?
海南网站制作公司有哪些,海口网是哪家的?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
建站主机选虚拟主机还是云服务器更好?
*请认真填写需求信息,我们会在24小时内与您取得联系。