StartView
CSS代码:
/*最外层样式*/
.photo_wall{
width:100%;
height:600px;
position:relative;
background:url(../imgs/bg.jpg)no-repeatcentercenter;
background-size:cover;
overflow:hidden;
}
/*照片区域的样式*/
.photo{
position:absolute;
left:0;
top:0;
width:100%;
height:100%;
z-index:1;
opacity:0;
transition:1s;
}
/*每个照片的样式*/
.photo.photo_i,.photo.photo_3d,.photo.photo_side{
width:336px;
height:392px;
position:absolute;
left:0;
top:0;
}
.photo.photo_i{
transition:800ms;
perspective:750px;
left:50%;
top:50%;
transform:translate(-50%,-50%)scale(.5)rotate(0);
}
.photo.photo_3d{
transition:500ms;
transform-style:preserve-3d;
transform-origin:050%;
}
/*正面和反面的公共样式*/
.photo.photo_side{
border-radius:6px;
background:#fff;
padding:26px24px;
box-sizing:border-box;
backface-visibility:hidden;
}
/*照片的正面样式*/
.photo.photo_front{
transform:rotateY(0);
}
.photo.photo_frontp{
width:286px;
height:286px;
border:2pxsolid#d8536d;
overflow:hidden;
display:flex;
/*align-items:center;*/
}
.photo.photo_frontpimg{
width:100%;
align-self:center;
}
.photo.photo_fronth3{
width:166px;
height:44px;
background:#d8536d;
border-radius:006px6px;
margin:0auto;
text-align:center;
font:16px/44pxArial;
color:#fff;
}
/*照片的反面样式*/
.photo.photo_back{
transform:rotateY(-180deg);
}
.photo.photo_back.desc{
font-size:14px;
line-height:20px;
color:#d8536d;
}
.photo.photo_backa{
color:#d8356d;
}
/*照片的居中样式*/
.photo.center{
z-index:9999;
left:50%;
top:50%;
transform:translate(-50%,-50%)scale(1)rotate(0);
}
/*照片正面的class*/
.photo.front.photo_3d{
transform:translateX(0)rotateY(0);
}
/*照片反面的calss*/
.photo.back.photo_3d{
transform:translateX(100%)rotateY(-180deg);
}
/*导航栏的样式*/
.nav{
position:absolute;
left:0;
top:0;
z-index:888;
width:100%;
height:200px;
padding-top:10px;
box-sizing:border-box;
text-align:center;
background:-webkit-linear-gradient(top,rgba(0,0,0,.5),transparent);
}
@font-face{
font-family:"icont";
src:url(../font/iconfont.woff)format("woff");
}
.nav.nav_i{
display:inline-block;
width:30px;
height:30px;
border-radius:50%;
background:rgba(255,255,255,.5);
font-family:"icont";
text-align:center;
line-height:30px;
color:rgba(255,255,255,0);
cursor:pointer;
transform:scale(.5);
transition:500ms;
}
.nav.active{
color:rgba(255,255,255,1);
transform:scale(.9)rotateY(0);
}
.nav.back{
transform:scale(.8)rotateY(-180deg);
}
/*遮罩层*/
.photo_wall.shade{
position:absolute;
left:0;
top:0;
z-index:2;
width:100%;
height:100%;
background:rgba(255,255,255,.7);
display:flex;
justify-content:center;
align-items:center;
}
.photo_wall.hide{
transition:1s;
opacity:0;
transform:scale(0)rotateY(360deg);
}
.photo_wall.shade.start{
width:200px;
height:60px;
border:2pxsolid#d8536d;
border-radius:10px;
background:rgba(248,229,227,.5);
text-align:center;
font:22px/60pxArial;
cursor:pointer;
}
js代码:用到了我昨天在博客上写的工具函数:
//用来获取元素
//用来判断某个元素是否有某个class
//如果没有添加
//如果有就删除
//获取元素idclasstagall
functionM(sele){
varfirst=sele.substr(0,1),
isArr=sele.split('');//idclasstag
if(first==="#"&&isArr.length==1){//id
returndocument.getElementById(sele.substr(1));
}else{
vararr=Array.from(document.querySelectorAll(sele));
returnarr.length==1?arr[0]:arr;
}
}
//判断某个元素是否包含某个class
functionhasClass(obj,cls){
varre=newRegExp(`\\b${cls}\\b`);
if(re.test(obj.className)){
returntrue;
}else{
returnfalse;
}
}
//给某个元素添加class
functionaddClass(obj,cls){
if(!hasClass(obj,cls)){
obj.className+=`${cls}`;//不要忘了前面的空格哈
}
obj.className=obj.className.trim();//去掉前后空格
}
//给某个元素删除class
functionrmClass(obj,cls){
varre=newRegExp(`\\b${cls}\\b`);
if(hasClass(obj,cls)){
obj.className=obj.className.replace(re,'')
.replace(/\s{2}/,'').trim();//去掉前后空格
}
}
提供主要的实现步骤的js代码:
(function(){
//---------------------------------------------------------
//初始化数据
vardata=dataList,len=data.length;
createPhotos(data);
varn=0;
//---------------------------------------------------------
//基本逻辑
M('.shade.start').addEventListener('click',function(){
addClass(M('.shade'),'hide');
M('.photo').style.opacity=1;
addClass(M(`#photo_0`),'center');
setTimeout(function(){
sortImgs(n);
},200);
});
M('.nav_i').forEach((item,i)=>{
item.onclick=function(){
turnImg(M(`#photo_${i}`));
};
});
//---------------------------------------------------------
//需求函数化
//需求1:利用数据生成所有html结构
functioncreatePhotos(data){
varphoto_html=M('.photo').innerHTML.split('{{split}}')[0].trim(),
nav_html=M('.nav').innerHTML.trim();
varphotos=[],nav=[];
data.forEach((item,i)=>{
varphotoTemp=photo_html.replace(/{{id}}/,i)
.replace(/{{src}}/,'src')
.replace(/{{img}}/,item.img)
.replace(/{{caption}}/,item.caption)
.replace(/{{desc}}/,item.desc),
navTemp=nav_html.replace(/{{id}}/,i);
photos.push(photoTemp);
nav.push(navTemp);
});
photos.push(`${nav.join('')}`);
M('.photo').innerHTML=photos.join('');
}
//需求2:给所有的图片排序
functionsortImgs(n){
varphotos=M('.photo_i');
initPhotos(photos);
varcenter=photos.splice(n,1)[0];
addClass(center,'center');
addClass(M(`#nav_${n}`),'active');
//center.addEventListener('click',function(e){
//turnImg(this);
//});
center.onclick=function(){
turnImg(this);
};
//对剩余的图片进行随机排序
photos.sort(()=>{
return0.5-Math.random();
})
varrP=scope();//返回左右两侧范围从x-y
//分成左侧和右侧两部分
varleft=photos.splice(0,Math.ceil((len-1)/2)),
right=photos;
left.forEach((item,i)=>{
item.style.zIndex=rn([0,len]);
item.style.left=rn(rP.L.x)+'px';
item.style.top=rn(rP.L.y)+'px';
item.style.transform=`translate(0,0)scale(.9)rotate(${rn([-2160,2160])}deg)`;
});
right.forEach((item,i)=>{
item.style.zIndex=rn([0,len]);
item.style.left=rn(rP.R.x)+'px';
item.style.top=rn(rP.R.y)+'px';
item.style.transform=`translate(0,0)scale(.9)rotate(${rn([-2160,2160])}deg)`;
});
}
//需求3编写某个区间的随机整数
functionrn(arr){
varmax=Math.max.apply(null,arr),
min=Math.min.apply(null,arr);
varp=Math.round(Math.random()*(max-min)+min);
//?;
returnp;
}
//需求4计算随机的范围
functionscope(){
varouter=M('.photo_wall');
varpic=M(`#photo_${rn([0,len-1])}`);
varW=outer.clientWidth,
H=outer.clientHeight,
w=pic.offsetWidth,
h=pic.offsetHeight;
console.log(W,w);
vardata={
L:{
x:[-w/3,W/2-w/2-w],
y:[-h/3,H-h*2/3]
},
R:{
x:[W/2+w/2,W-w*2/3],
y:[-h/3,H-h*2/3]
}
}
returndata;
}
//需求5:控制图片翻转
functionturnImg(ele){
varcur=ele.id.split('_')[1];
varnav=M(`#nav_${cur}`);
if(!hasClass(ele,'center')){//如果点的不是当前对应的按钮就重新排序
returnsortImgs(cur)
}
if(hasClass(ele,'front')){
//翻转到背面
console.log('现在是正面准备移除front');
addClass(ele,'back');
console.log(ele.className);
rmClass(ele,'front');
console.log(ele.className);
addClass(nav,'back');
}else{
//翻转到正面
console.log('现在是反面准备移除back');
addClass(ele,'front');
console.log(ele.className);
rmClass(ele,'back');
console.log(ele.className);
rmClass(nav,'back')
}
}
//需求6初始化所有样式
functioninitPhotos(objs){
objs.forEach((item,i)=>{
if(hasClass(item,'center')){
varnav=M(`#nav_${i}`);
rmClass(item,'center');
rmClass(item,'back');
addClass(item,'front');
rmClass(nav,'active');
rmClass(nav,'back');
item.onclick=null;
}
item.style.left='';
item.style.top='';
item.style.zIndex='';
item.style.transform=`translate(-50%,-50%)scale(1.1)rotate(0deg)`;
});
}
})()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。