JS+CSS精灵实例演示
一、实现思路主盒子的背景图片由N多个span标签以碎片化形式均匀排列而成。所有span标签从一张大图的指定区域和尺寸获得背景图像,这需要使用CSS精灵技术。由于碎片化的span标签可能会数量众多,因此使用JS动态创建。JS将依据父盒子的宽度来计算span标签的尺寸和width、height、left、top等值,span标签的背景图像设定也依据父盒子的尺寸进行计算,算法必须精准到位,也要求父盒子和图片的尺寸是一致的。更多实现细节,代码中有相应注释。
二、实例代码
<style>
/* 主盒子 : 父框 */
.pa {
margin: 50px auto 0 auto;
padding: 0; /* 设置为0以确保图片能铺满盒子 */
width: 600px; /* 等于图片实际宽度 */
height: 338px; /* 等于图片实际高度 */
background: #e1e1e1;
position: relative; /* 必须定位 */
}
/* 小块样式 : 预设使用 span 标签 */
.piece {
position: absolute; /* 必须定位 */
display: block; /* 确保 span 标签能正常显示 */
padding: 0; /* 确保内边距影响效果 */
margin: 0;/* 确保外边距影响效果 */
transition: all .5s linear;
}
/* 小块鼠标交互 : 检测小块效果 */
.piece:hover {
transform: translate(10px,10px) skew(20deg);
box-shadow: 2px 2px 10px red;
}
</style>
<div class="pa"></div>
<script>
let pa = document.querySelector('.pa'); //父框操作句柄
let pic = 'https://www.huachaowang.com/data/attachment/forum/202206/24/200554upvwl1h3u3gpjpwv.jpg'; //图片地址
let ww = pa.clientWidth, //父框宽度
hh = pa.clientHeight; //父框高度
let piecesX = 20, //横向小块
piecesY = 10; //纵向小块
let pw = ww / piecesX; //小块宽度
let ph = hh / piecesY; //小块高度
//用for双循环创建纵横小块
for(j=0; j<piecesY; j++) {
for(k=0; k<piecesX; k++) {
let span = document.createElement('span'); //每一次循环创建一个span标签
span.className = 'piece'; //该span的class属性 : class="piece"
span.style.width = pw + 'px'; // 宽度
span.style.height = ph + 'px'; //高度
span.style.left = k * pw + 'px';//左边值
span.style.top = j * ph + 'px';//上边值
//以下定位背景图片到小块上,拼凑的句子样式: url('图片地址') -0px -0px no-repeat
span.style.background = 'url(' + pic + ') -' + k * pw + 'px' + ' -' + j * ph + 'px no-repeat';
pa.appendChild(span);
}
}
</script>三、所用图片
https://www.huachaowang.com/data/attachment/forum/202206/24/200554upvwl1h3u3gpjpwv.jpg
四、效果演示(移步二楼)
<style>
/* 主盒子 : 父框 */
.pa {
margin: 50px auto 0 auto;
padding: 0; /* 设置为0以确保图片能铺满盒子 */
width: 600px; /* 等于图片实际宽度 */
height: 338px; /* 等于图片实际高度 */
background: #e1e1e1;
position: relative; /* 必须定位 */
}
/* 小块样式 : 预设使用 span 标签 */
.piece {
position: absolute; /* 必须定位 */
display: block; /* 确保 span 标签能正常显示 */
padding: 0; /* 确保内边距影响效果 */
margin: 0;/* 确保外边距影响效果 */
transition: all .5s linear;
}
/* 小块鼠标交互 : 检测小块效果 */
.piece:hover {
transform: translate(10px,10px) skew(20deg);
box-shadow: 2px 2px 10px red;
}
</style>
<div class="pa"></div>
<script>
let pa = document.querySelector('.pa'); //父框操作句柄
let pic = 'https://www.huachaowang.com/data/attachment/forum/202206/24/200554upvwl1h3u3gpjpwv.jpg'; //图片地址
let ww = pa.clientWidth, //父框宽度
hh = pa.clientHeight; //父框高度
let piecesX = 20, //横向小块
piecesY = 10; //纵向小块
let pw = ww / piecesX; //小块宽度
let ph = hh / piecesY; //小块高度
//用for双循环创建纵横小块
for(j=0; j<piecesY; j++) {
for(k=0; k<piecesX; k++) {
let span = document.createElement('span'); //每一次循环创建一个span标签
span.className = 'piece'; //该span的class属性 : class="piece"
span.style.width = pw + 'px'; // 宽度
span.style.height = ph + 'px'; //高度
span.style.left = k * pw + 'px';//左边值
span.style.top = j * ph + 'px';//上边值
//以下定位背景图片到小块上,拼凑的句子样式: url('图片地址') -0px -0px no-repeat
span.style.background = 'url(' + pic + ') -' + k * pw + 'px' + ' -' + j * ph + 'px no-repeat';
pa.appendChild(span);
}
}
</script> 黑黑辛苦了,这么详细的讲解,终于能明白点JS的赋值和运作原理了{:4_199:} 原来背景就是单一色,但是在交互里加了box-shadow: 2px 2px 10px red; 看起来好像背后有圆一样{:4_173:} 红影 发表于 2022-7-3 10:02
原来背景就是单一色,但是在交互里加了box-shadow: 2px 2px 10px red; 看起来好像背后有圆一样
小块(piece)span的box-shadow效果。这你看出来了,挺好 红影 发表于 2022-7-3 10:01
黑黑辛苦了,这么详细的讲解,终于能明白点JS的赋值和运作原理了
这个,JS是按实际情况计算、执行而已。CSS精灵原理能理解了,就可以给JS准确下达指令,让它去计算并批量完成 马黑黑 发表于 2022-7-3 10:19
小块(piece)span的box-shadow效果。这你看出来了,挺好
黑黑能设计出来,更好呢{:4_187:} 红影 发表于 2022-7-3 10:59
黑黑能设计出来,更好呢
这是貌似是基本功 马黑黑 发表于 2022-7-3 10:22
这个,JS是按实际情况计算、执行而已。CSS精灵原理能理解了,就可以给JS准确下达指令,让它去计算并批量 ...
我认识JS ,JS不认识我,它不肯定听我的指令,再说我也不懂那些指令,下达不出来啊{:4_189:} 红影 发表于 2022-7-3 11:01
我认识JS ,JS不认识我,它不肯定听我的指令,再说我也不懂那些指令,下达不出来啊
基本功要具备才能够驯服JS 马黑黑 发表于 2022-7-3 11:00
这是貌似是基本功
我欠缺太多{:4_173:} 红影 发表于 2022-7-3 11:10
我欠缺太多
因为从来没有学过 马黑黑 发表于 2022-7-3 11:01
基本功要具备才能够驯服JS
JS在我这里还是一匹小野马,我本事不行,驯服不了它{:4_173:} 红影 发表于 2022-7-3 11:11
JS在我这里还是一匹小野马,我本事不行,驯服不了它
能看懂是个开始 马黑黑 发表于 2022-7-3 11:10
因为从来没有学过
在黑黑这里才开始接触它们的。 马黑黑 发表于 2022-7-3 11:11
能看懂是个开始
嗯嗯,我努力{:4_204:} 红影 发表于 2022-7-3 15:52
嗯嗯,我努力
{:4_190:} 红影 发表于 2022-7-3 15:51
在黑黑这里才开始接触它们的。
任何时候开始都不为晚 马黑黑 发表于 2022-7-3 16:28
任何时候开始都不为晚
很开心有这样的机遇来学习这些{:4_187:} 红影 发表于 2022-7-3 20:22
很开心有这样的机遇来学习这些
学习是令人快乐的,尤其是学新的知识