当前位置: 首页 > Web前端 > HTML5

JS+CSS3实现图片滑块效果

时间:2023-04-05 01:51:42 HTML5

效果分析动画分为两步:当鼠标移入或移出时,添加一个动画类实现动画类,实现移入移出动画图片瀑布流式布局可以参考Vue手写图片瀑布流组件(附源码)HTML和CSS布局布局比较简单,一个父容器,里面一个maskdiv,一个imgdiv

布局,父容器设置位置:相对;儿童面具容器设置位置:绝对;并填充整个容器写一个动画类,让左边滑入类为enter_left,那么左边的动画可以写为:.enter_left{animation:enter-left0.3sease-in;}@keyframesenter-left{0%{变换:translate3d(-100%,0,0);}100%{转换:translate3d(0,0,0);}}一开始,mask是放在父容器外面的,刚好到达父容器100%的右边界,同理,各个方向的css动画也很容易写JS判断slider的方向我们就完成了上一步过半,写各个方向的动画,难点是如何判断鼠标进入容器的方向,我们可以画图分析,如下图:假设中心点的坐标矩形为x0(x0,y0),鼠标进出矩形的边界坐标为x(x,y)。根据斜率公式,可以得到:l1斜率:k0=高/宽l2斜率:-k0l3斜率:k=(y-y0)/(x-x0)观察图形,我们可以看到l1和l2划分了将矩形分成4块,我们很容易得到:如果鼠标从右边进出,根据斜率:k>=-k0&&k<=k0,且x>x0;根据对称性,如果鼠标从左边进入out,then:k>=-k0&&k<=k0,andximgEventHandle(event,true)"@mouseleave="(event)=>imgEventHandle(event,false)">
注意:不要使用mouseout和mouseover事件,会导致鼠标滑入子元素时触发鼠标事件使用event.target.getBoundingClientRect()获取当前鼠标的信息;Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置返回值是一个DOMRect对象,返回结果是包含完整元素的最小矩形,有left,top,right,bottom,x,y,width,andheight,它们是只读属性,以像素为单位,用于描述整个边框。直接给出这部分逻辑代码imgEventHandle(event:any,is_enter:boolean){letdirection_index:number;constdirection_list:Array=['top','right','bottom','left'];constx:number=event.clientX;consty:number=event.clientY;//中点坐标constrect_dom:any=event.target.getBoundingClientRect();constx0:number=rect_dom.left+rect_dom.width/2;consty0:number=rect_dom.top+rect_dom.height/2;constk0=(rect_dom.height)/(rect_dom.width);//当前鼠标点斜率constk=(y-y0)/(x-x0);if(k<=k0&&k>=-k0){//左右进出direction_index=x>=x0?1:3;}else{//上下进出direction_index=y>=y0?2:0;}direction_list.forEach(item=>{event.target.childNodes[0].classList.remove(`${is_enter?'leave':'enter'}_${item}`);});event.target.childNodes[0].classList.add(`${is_enter?'enter':'leave'}_${direction_list[direction_index]}`);}源码源码END