【CSON原创】 图片滑动展开效果发布

本文介绍了一种鼠标悬停时图片滑动展开的效果实现方法,支持IE678及主流浏览器。通过定时器逐步调整图片位置,确保平滑过渡。

功能说明:

鼠标移动到不同图片上,该图片滑动展开,其它图片折叠。

支持IE 6 7 8 firefox chrome

效果预览:

 

r_cat1.jpg r_cat2.jpg r_cat3.jpg r_cat4.jpg r_cat5.jpg

实现原理:

当鼠标移动到某张图片,该图片以及该图片前的图片以相同速度向左运动,该图片之后的图片也以相同速度向右运动,形成展开选中图片的效果。

代码分析:


  
var flow_slide_imgs = function (options) {
this ._init();

}
使用构造函数模式,构造函数内部调用私有方法_init();

  
flow_slide_imgs.prototype = {
_init:
function (options) {

var defaults = {
containerId:
' container ' ,
ImgsWidth:
0.6


};
var opts = util.extend(defaults, options);

this .container = util.$(opts.containerId);
this .imgs = this .container.getElementsByTagName( ' img ' );
this .imgWidth = parseInt(util.getComputedStyle( this .container).width) * opts.ImgsWidth;
this .containerWidth = parseInt(util.getComputedStyle( this .container).width);
this .containerHeight = parseInt(util.getComputedStyle( this .container).height);
this .aveWidth = this .containerWidth / this .imgs.length;
this .newAveWidth = ( this .containerWidth - parseInt( this .imgWidth)) / ( this .imgs.length - 1 );
this .selectedIndex;
this .movePath = 80 ;
this .canLeft = true ;
this .canRight = true ;


this ._setContainerStyle();
this ._setImgsStyle();
this ._bindClickEvent();


},

_init方法中,复制传入的参数对象,并使用extend方法把传入参数与默认参数结合,再以对象属性形式保存。最后调用其他私有函数进行初始化。


  
_setContainerStyle: function () {
this .container.style.cssText = ' overflow:hidden; position:relative; ' ;

},

设置容器的样式,由于容器内图片使用绝对定位并改变位置来实现图片的展开和折叠,所以容器设置为相对定位,并且隐藏超出容器的图片。


  
_setImgsStyle: function () {

for ( var i = 0 ; i < this .imgs.length; i ++ ) {
this .imgs[i].style.cssText = ' position:absolute; '
+ ' left: ' + i * this .aveWidth + ' px; '
+ ' top:0px; '
+ ' width: ' + this .imgWidth + ' ; '
+ ' height: ' + this .containerHeight + ' px; '
+ ' z-index: ' + i + ' ; '
+ ' display:block ' ;




}

},

获取容器内图片,并批量设置图片样式,aveWidth为图片初始的平均宽度,该数值在_init方法中通过容器宽度除以图片数量得出。以每张图片的索引为值设置图片的层叠级别,这样可以保证由最左边开始,一张图片叠在其右边的图片的上面。由于图片为行内元素,所以再设置其display为block。


  
_getSelectedIndex: function (target) {
for ( var i = 0 , len = this .imgs.length; i < len; i ++ ) {
if (target == this .imgs[i]) {
if ( this .selectedIndex && this .selectedIndex < i) {
this .canLeft = true ;
this .canRight = false ;
}
if ( this .selectedIndex && this .selectedIndex > i) {
this .canLeft = false ;
this .canRight = true ;
}
break ;

}
}
return i;
},

获取所选择图片,并且把该图片的索引和之前已打开的图片的索引进行比较,如果所选图片在已打开的图片左边,则图片组只何以向左移动,否则图片只可以向右移动,这样是为了解决鼠标移动过快造成的左边图片和右边图片作相反方向移动的问题。总之,这里保证的所有图片向同一个方向移动。


  
_resetImgsSizeAndPos: function (obj, selectedIndex) {


if ( typeof obj.selectedIndex == ' undefined ' ) {
if (parseInt(util.getComputedStyle(obj.imgs[ 1 ]).left) > obj.newAveWidth) {


for ( var i = 1 ; i < obj.imgs.length; i ++ ) {

if (i <= selectedIndex)
obj.imgs[i].style.left
= Math.max(parseInt(obj.imgs[i].style.left) - obj.movePath * i, i * obj.newAveWidth) + ' px ' ;
else
obj.imgs[i].style.left
= Math.min(parseInt(obj.imgs[i].style.left) + obj.movePath * (obj.imgs.length - i), obj.containerWidth - (obj.imgs.length - i) * obj.newAveWidth) + ' px ' ;
}


obj.timeId
= window.setTimeout(arguments.callee, 100 , obj, selectedIndex);
}
if (parseInt(util.getComputedStyle(obj.imgs[ 1 ]).left) == obj.newAveWidth || parseInt(util.getComputedStyle(obj.imgs[ 1 ]).left) == obj.imgWidth) {
obj.selectedIndex
= selectedIndex;
}
}
else if (obj.selectedIndex > selectedIndex) {

if (parseInt(util.getComputedStyle(obj.imgs[selectedIndex + 1 ]).left) < (selectedIndex + 1 ) * obj.newAveWidth + (obj.imgWidth - obj.newAveWidth) && obj.canRight) {

for ( var j = selectedIndex + 1 ; j <= obj.selectedIndex; j ++ ) {

obj.imgs[j].style.left
= Math.min(parseInt(obj.imgs[j].style.left) + obj.movePath, obj.newAveWidth * (j - 1 ) + obj.imgWidth) + ' px ' ;
}


obj.timeId
= window.setTimeout(arguments.callee, 100 , obj, selectedIndex);
}
else {
obj.canLeft
= true ;

obj.selectedIndex
= selectedIndex;

}
}
else if (obj.selectedIndex < selectedIndex) {
if (parseInt(util.getComputedStyle(obj.imgs[selectedIndex]).left) > (selectedIndex) * obj.newAveWidth && obj.canLeft) {

for ( var j = selectedIndex; j > obj.selectedIndex; j -- ) {

obj.imgs[j].style.left
= Math.max(parseInt(obj.imgs[j].style.left) - obj.movePath, j * obj.newAveWidth) + ' px ' ;
}


obj.timeId
= window.setTimeout(arguments.callee, 100 , obj, selectedIndex);
}
else {
obj.canRight
= true ;

obj.selectedIndex
= selectedIndex;

}

}



},

根据 所有图片均未打开(第一次选择图片),已打开图片在所选择图片的前面,已打开图片在所选择图片的后面 这三种情况,图片组作不同方向的运动,通过setTimeout每隔100ms移动一个单位位移。


  
_bindClickEvent: function () {
util.addEventHandler(
this .container, ' mouseover ' , ( function (obj) {
return function (eve) {

eve
= eve || window.event;
var target = eve.srcElement || eve.target,
selectedIndex
= obj._getSelectedIndex(target);


obj._resetImgsSizeAndPos(obj, selectedIndex);

}

})(
this ));

}

为容器的mouseover事件绑定事件处理程序,利用事件冒泡在容器的处理程序里产生选中图片时的效果。

这里由于需要为事件处理传递参数,所以利用闭包,使传入的obj对象可访问。鼠标移动到图片上方时,调用上面分析过的resetImgsSizeAndPos方法,根据实际情况让图片作出不同的运动。


  
new flow_slide_imgs();

最后是调用方法,这里没有传入参数,则控件里面使用默认值。

完整demo代码:

html: 

ContractedBlock.gifExpandedBlockStart.gifView Code
<div id="container">
<img src="http://images.cnblogs.com/cnblogs_com/Cson/290336/r_cat1.jpg" />
<img src="http://images.cnblogs.com/cnblogs_com/Cson/290336/r_cat2.jpg" />
<img src="http://images.cnblogs.com/cnblogs_com/Cson/290336/r_cat3.jpg" />
<img src="http://images.cnblogs.com/cnblogs_com/Cson/290336/r_cat4.jpg" />
<img src="http://images.cnblogs.com/cnblogs_com/Cson/290336/r_cat5.jpg" />
</div>

css:

ContractedBlock.gif ExpandedBlockStart.gif View Code

   
#container { width : 600px ; height : 300px ; background-color : Black ; }
#container img
{ display : none ; }

base.js:

ContractedBlock.gif ExpandedBlockStart.gif View Code

   
var util = {
$:
function (sId) { return document.getElementById(sId); },
addEventHandler:
function (elem, type, handler) {
if (elem.addEventListener) {
elem.addEventListener(type, handler,
false );
}
else {
elem.attachEvent(
" on " + type, handler);
}
},
removeEventHandler:
function (elem, type, handler) {
if (elem.removeEventListener) {
elem.removeEventListener(type, handler,
false );
}
else {
elem.detachEvent(
" on " + type, handler);
}
},
getComputedStyle:
function (elem) {
if (elem.currentStyle)
return elem.currentStyle;
else {
return document.defaultView.getComputedStyle(elem, null );
}
},

getElementsByClassName:
function (className, parentElement) {
var elems = (parentElement || document.body).getElementsByTagName( " * " );
var result = [];
for (i = 0 ; j = elems[i]; i ++ ) {
if (( " " + j.className + " " ).indexOf( " " + className + " " ) != - 1 ) {
result.push(j);
}
}
return result;
},
extend:
function (destination, source) {
for ( var name in source) {
destination[name]
= source[name];
}
return destination;

}



};

(
function () {
var st = window.setTimeout;
window.setTimeout
= function (fn, mDelay) {
var t = new Date().getTime();
if ( typeof fn == ' function ' ) {
var args = Array.prototype.slice.call(arguments, 2 );
var f = function () {
args.push(
new Date().getTime() - t - mDelay);
fn.apply(
null , args)
};
return st(f, mDelay);
}
return st(fn, mDelay);
}
})();

flow_slide_imgs.js:

ContractedBlock.gif ExpandedBlockStart.gif View Code

   
/*
created by cson
supports ie 6 7 8 firefox and chrome
*/

/* constructor of 'flow images controller' */
var flow_slide_imgs = function (options) {
this ._init();



}
flow_slide_imgs.prototype
= {
/* init container and images and set object's properties */
_init:
function (options) {

var defaults = {
containerId:
' container ' ,
ImgsWidth:
0.6


};
var opts = util.extend(defaults, options);

this .container = util.$(opts.containerId);
this .imgs = this .container.getElementsByTagName( ' img ' );
this .imgWidth = parseInt(util.getComputedStyle( this .container).width) * opts.ImgsWidth;
this .containerWidth = parseInt(util.getComputedStyle( this .container).width);
this .containerHeight = parseInt(util.getComputedStyle( this .container).height);
this .aveWidth = this .containerWidth / this .imgs.length;
this .newAveWidth = ( this .containerWidth - parseInt( this .imgWidth)) / ( this .imgs.length - 1 );
this .selectedIndex;
this .movePath = 80 ;
this .canLeft = true ;
this .canRight = true ;


this ._setContainerStyle();
this ._setImgsStyle();
this ._bindClickEvent();


},
/* set container's style */
_setContainerStyle:
function () {
this .container.style.cssText = ' overflow:hidden; position:relative; ' ;

},
/* set styles of images in container */
_setImgsStyle:
function () {

for ( var i = 0 ; i < this .imgs.length; i ++ ) {
this .imgs[i].style.cssText = ' position:absolute; '
+ ' left: ' + i * this .aveWidth + ' px; '
+ ' top:0px; '
+ ' width: ' + this .imgWidth + ' ; '
+ ' height: ' + this .containerHeight + ' px; '
+ ' z-index: ' + i + ' ; '
+ ' display:block ' ;




}

},
/* get current selected image's index */
_getSelectedIndex:
function (target) {
for ( var i = 0 , len = this .imgs.length; i < len; i ++ ) {
if (target == this .imgs[i]) {
if ( this .selectedIndex && this .selectedIndex < i) {
this .canLeft = true ;
this .canRight = false ;
}
if ( this .selectedIndex && this .selectedIndex > i) {
this .canLeft = false ;
this .canRight = true ;
}
break ;

}
}
return i;
},


/* reset images' size and position for three situation */
_resetImgsSizeAndPos:
function (obj, selectedIndex) {


if ( typeof obj.selectedIndex == ' undefined ' ) {
if (parseInt(util.getComputedStyle(obj.imgs[ 1 ]).left) > obj.newAveWidth) {


for ( var i = 1 ; i < obj.imgs.length; i ++ ) {

if (i <= selectedIndex)
obj.imgs[i].style.left
= Math.max(parseInt(obj.imgs[i].style.left) - obj.movePath * i, i * obj.newAveWidth) + ' px ' ;
else
obj.imgs[i].style.left
= Math.min(parseInt(obj.imgs[i].style.left) + obj.movePath * (obj.imgs.length - i), obj.containerWidth - (obj.imgs.length - i) * obj.newAveWidth) + ' px ' ;
}


obj.timeId
= window.setTimeout(arguments.callee, 100 , obj, selectedIndex);
}
if (parseInt(util.getComputedStyle(obj.imgs[ 1 ]).left) == obj.newAveWidth || parseInt(util.getComputedStyle(obj.imgs[ 1 ]).left) == obj.imgWidth) {
obj.selectedIndex
= selectedIndex;
}
}
else if (obj.selectedIndex > selectedIndex) {

if (parseInt(util.getComputedStyle(obj.imgs[selectedIndex + 1 ]).left) < (selectedIndex + 1 ) * obj.newAveWidth + (obj.imgWidth - obj.newAveWidth) && obj.canRight) {

for ( var j = selectedIndex + 1 ; j <= obj.selectedIndex; j ++ ) {

obj.imgs[j].style.left
= Math.min(parseInt(obj.imgs[j].style.left) + obj.movePath, obj.newAveWidth * (j - 1 ) + obj.imgWidth) + ' px ' ;
}


obj.timeId
= window.setTimeout(arguments.callee, 100 , obj, selectedIndex);
}
else {
obj.canLeft
= true ;

obj.selectedIndex
= selectedIndex;

}
}
else if (obj.selectedIndex < selectedIndex) {
if (parseInt(util.getComputedStyle(obj.imgs[selectedIndex]).left) > (selectedIndex) * obj.newAveWidth && obj.canLeft) {

for ( var j = selectedIndex; j > obj.selectedIndex; j -- ) {

obj.imgs[j].style.left
= Math.max(parseInt(obj.imgs[j].style.left) - obj.movePath, j * obj.newAveWidth) + ' px ' ;
}


obj.timeId
= window.setTimeout(arguments.callee, 100 , obj, selectedIndex);
}
else {
obj.canRight
= true ;

obj.selectedIndex
= selectedIndex;

}

}



},

/* bind handler for mouseover event of images */
_bindClickEvent:
function () {
util.addEventHandler(
this .container, ' mouseover ' , ( function (obj) {
return function (eve) {

eve
= eve || window.event;
var target = eve.srcElement || eve.target,
selectedIndex
= obj._getSelectedIndex(target);


obj._resetImgsSizeAndPos(obj, selectedIndex);

}

})(
this ));

}


}

欢迎转载,请标明出处:http://www.cnblogs.com/Cson/archive/2011/04/03/2004717.html

转载于:https://www.cnblogs.com/Cson/archive/2011/04/03/2004717.html

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值