热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

圖片遮罩翻轉

html代碼。

《圖片遮罩翻轉》

html代碼。





  • Css結果展現










































css代碼。

.hf-reversal .hf-item .hf-cover.hf-hover{
transform: rotate(0deg) !important;
-webkit-transform: rotate(0deg) !important;
-moz-transform: rotate(0deg) !important;
}

js代碼
以一個li為單元,在其四周天生8個雷同的遮罩。
主如果animation的css動畫不支持翻轉,只能經由過程transfrom來做,需要以邊為單元翻轉。
當一切li關聯起來的時時刻,紀錄上一個翻轉方向,到達連貫性

var initImgCover = function(){
var directiOnObj= {
"top-left":"rotate(-90deg)",
"left-top":"rotate(90deg)",
"top-right":"rotate(90deg)",
"right-top":"rotate(-90deg)",
"bottom-left":"rotate(90deg)",
"left-bottom":"rotate(-90deg)",
"bottom-right":"rotate(-90deg)",
"right-bottom":"rotate(90deg)"
};
function transFormByDirection(element,direction,isEnter){
var currentCoverName= element.attr("cover-name")||"",item = element.closest("li"),currentCover;
function transFormCover(defaultName){
var name = null;
var arr = ["top","right","bottom","left"];
for(var i=0;i if(element.hasClass(arr[i])){
name = direction +"-"+ arr[i];
break;
}
}
if(!name || !directionObj[name]){
name = defaultName;
}
element.removeClass("top left right bottom").addClass(direction);
if(isEnter){
currentCoverName = name;
currentCover = item.find(".hf-clone."+currentCoverName);
currentCover.addClass("hf-hover");
}else{
var cssText = item.find(".hf-clone."+name)[0].style.cssText;
currentCover = item.find(".hf-clone."+currentCoverName);
currentCover[0].style.cssText = cssText;
currentCover.removeClass("hf-hover");
currentCoverName = name;
}
element.attr("cover-name",currentCoverName);
}
function getDefaultCoverName(defaultName,num){
var name = defaultName[0],coverName="";
if(isEnter){
var ul = item.closest("ul"),index = item.index() +num,prevItem,prevCoverName;
if(index >=0 && index <9 ){
prevItem = ul.children("li:eq("+index+")");
prevCoverName = prevItem.find(".hf-cover:not(.hf-clone)").attr("cover-name");
if(prevCoverName){
coverName = direction + "-"+ prevCoverName.split("-")[1];
}
}
}else{
coverName = direction + "-"+currentCoverName.split("-")[1];
}
if(defaultName.indexOf(coverName)!= -1){
name = coverName;
}
return name;
}
switch (direction){
case "top":
// -3
transFormCover( getDefaultCoverName(["top-right","top-left"],-3));
break;
case "right":
// +1
transFormCover(getDefaultCoverName(["right-bottom","right-top"],1));
break;
case "bottom":
// +3
transFormCover(getDefaultCoverName(["bottom-left","bottom-right"],3));
break;
case "left":
// -1
transFormCover(getDefaultCoverName(["left-top","left-bottom"],-1));
break;
}
}
function initCover(element){
element.find(".hf-clone").remove();
var cover = element.find(".hf-cover:not(.hf-clone)");
$.each(directionObj,function(k,v){
var clOne= cover.clone();
var obj = {
"transform-origin":k.replace("-"," "),
"transform":v,
"display":"block"
};
clone.removeAttr("cover-name").addClass("hf-clone").addClass(k).css(obj).appendTo(element);
});
}
$(".hf-reversal .hf-item").bind({
"pointerenter":function(e){
var chromePointerEvents = typeof PointerEvent === 'function';
if (chromePointerEvents) {
if (e.pointerId === undefined) {
return;
}
// mouseleave不觸發
this.setPointerCapture(e.pointerId);
}
var item = $(this), cover = item.find(".hf-cover:not(.hf-clone)");
initCover(item);
item.mDirection(e,function(direction){
transFormByDirection(cover,direction,true);
})
},
"pointerleave":function(e){
var that = this,item = $(this),cover = item.find(".hf-cover:not(.hf-clone)");
$(this).mDirection(e,function(direction){
transFormByDirection(cover,direction,false);
var chromePointerEvents = typeof PointerEvent === 'function';
if (chromePointerEvents) {
if (e.pointerId === undefined) {
return;
}
that.releasePointerCapture(e.pointerId);
}
})
}
})
}
if (typeof jQuery === 'undefined') {
throw new Error('mDirection Javascript requires jQuery')
}
+function ($) {
'use strict';
var Direction = function(element){
this.$element = element;
};
Direction.DEFAULTS = {
};
Direction.prototype.init = function (enterObj,leaveObj) {
var $this = this
var $el = this.$element
$el.addEventListener('mouseenter',function(e){
var directiOnNumber= $this.getDirectionNumber(e);
var funArray = [enterObj.top,enterObj.right,enterObj.bottom,enterObj.left];
funArray[directionNumber]($el);
},false);
$el.addEventListener('mouseleave',function(e){
var directiOnNumber= self.main(e);
var funArray = [leaveObj.top,leaveObj.right,leaveObj.bottom,leaveObj.left];
funArray[directionNumber]($el);
},false);
};
Direction.prototype.getDirectiOnNumber= function(e){
var $el = this.$element
var width = $el.width()
var height = $el.height()
// 取得相對於中心點的 x,y坐標
var x = (e.pageX - $el.offset().left-( width / 2 )) * (width >height ? (height / width ):1);
var y = (e.pageY- $el.offset().top -( height / 2 )) * (height >width ? (width / height):1);
// Math.atan2(y,x) 取得斜率 -PI 到PI之間的數
var number = Math.round((((Math.atan2(y, x) * 180 / Math.PI) + 180) / 90) + 3) % 4;
return number;
}
Direction.prototype.getDirection = function(e){
var directiOnNumber= this.getDirectionNumber(e);
var direction = "";
switch (directionNumber)
{
case 0 :
direction = "top";
break;
case 1:
direction = "right";
break;
case 2:
direction = "bottom";
break;
case 3:
direction = "left";
break;
}
return direction;
}
$.fn.mDirection = function(e,callback){
var $element = this;
var mDirection = new Direction($element);
if(callback){
callback.call($element,mDirection.getDirection(e));
}else{
return mDirection.getDirection(e);
}
}; $.fn.mDirection.COnstructor= function(element,enterObj,leaveObj){
var $element = $(element);
var mDirection = new Direction($element);
mDirection.init(enterObj,leaveObj)
}
}(jQuery);

推荐阅读
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • DRF框架中Serializer反序列化验证机制详解:深入探讨Validators的应用与优化
    在DRF框架的反序列化验证机制中,除了基本的字段类型和长度校验外,还常常需要进行更为复杂的条件限制校验。通过引入`validators`模块,可以实现自定义校验逻辑,如唯一字段校验等。本文将详细探讨`validators`的使用方法及其优化策略,帮助开发者更好地理解和应用这一重要功能。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 为了确保数据库的高效运行,本文介绍了一种方法,通过编写定时任务脚本来自动清理 `order` 表中状态为 0 或为空的无效订单记录。该脚本使用 PHP 编写,并设置时区为中国标准时间,每 10 分钟执行一次,以保持数据库的整洁和性能优化。此外,还详细介绍了如何配置定时任务以及脚本的具体实现步骤。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • CTF竞赛中文件上传技巧与安全绕过方法深入解析
    CTF竞赛中文件上传技巧与安全绕过方法深入解析 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
author-avatar
小思绪
创造人生的可能
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有