`
wjt276
  • 浏览: 650411 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

JavaScript图片下拉选择器的制作

阅读更多
相信大家都见过一些软件里的图片下拉选择控件吧?喏,OICQ中就有。但网页上的你见过没有?小阳今天就为你推出你心怡已久的这个控件,下面演示中就是了!效果还可以吧?心动不如行动,我们来看下是怎么弄出来的。

  演示:(点击这里在新窗口中打开演示页)



  我们先来看下做出这个控件需要解决哪些问题。

  第一,图片下拉列表框是一个层,它在选择提示框点击时出现,出现后在选择图片或窗体点击时再隐藏。

  它出现时位置要在选择提示框的正下方;隐藏实际上可以把它的位置定在屏幕之外(style.pixelLeft=-800)。

  第二,图片下拉列表框的位置。选择提示框不是层,图片下拉列表框出现的位置要在选择提示框的正下方,就必须读取选择提示框在窗体中的绝对位置,不能受选择提示框的位置和屏幕分辨率的影响。

  我们可以用“Object.offsetLeft”和“Object.offsetTop”获取对象(Object)在其父容器(offsetParent)中的相对位置。于是我们可以用while()循环向高一级父容器一层一层读取相对位置,它们的代数和就是该Object在最上层容器(窗体)中的绝对位置了。

  第三,图片下拉列表框的滚动,要保证自动滚动到相应的图片出现在列表框的顶端:当手动滚动停止时,如果滚动条趋势是向下滚动,则自动继续向下滚动直至最近的图片在列表框的顶端,反之亦然。

  例子中我们将所有供选图片命名为“0.gif”、“1.gif”……“9.gif”,并放在“head”目录下。下面我们以实际程序解决这些问题:  

<!--建立表单-->
<form name="myform" method="post" action="">请选择图片:
<div id="imgBox"><!--这里是图片下拉选择器的位置--></div>
<input name="myhead" type="text" id="myface" size="10" value="">
</form> 


<script language="JavaScript">
<!--
var imgWidth=64; //列表框中图片的宽度;
var imgHeight=64; //列表框中图片的高度;
var imgSrc="head/数字序号.gif"; //供选图片的路径。"数字序号"四字将在程序中替换为0,1,2...,不要手工更改为数字 ;
var selectedNo=7; //默认选定的图片序号;
var selecteSize=2; //下拉列表框中显示的图片数;


/* 以下把图片和层输出在"imgBox"的位置: 
我们用变量"isin"记录鼠标是否在该控件上;用CSS定义下拉列表框的滚动条,"overflow-x:hidden;overflow-y:scroll;"指水平方向不滚动,竖直方面滚动;
用for()循环依次把图片输出到下拉列表框。
*/
var myHTML='<SPAN onmouseover="isin=true" onmouseout="isin=false">';
myHTML+='<table width="1" onclick="showlist(this)" title="选择提示框" border="0" cellspacing="0" cellpadding="0"><tr><td><img name="imgselected" border=1 src="'+imgSrc.replace("数字序号",selectedNo)+'" WIDTH='+(imgWidth)+' HEIGHT='+imgHeight+'></td><td valign=top><img src="menu.gif"></td></tr></table>';
myHTML+='<DIV onscroll="scrollud()" id="imgBox" ';
myHTML+='style="position:absolute;left=-800;top=0;background-color:#FFFFFF;border: 1px solid #000000;overflow-x:hidden;overflow-y:scroll; width:'+(imgWidth+20)+'px; height: '+imgHeight*selecteSize+'px">';
for(i=0;i<10;i++){
myHTML+="<img listID="+i+" src='"+imgSrc.replace("数字序号",i)+"' alt='"+imgSrc.replace("数字序号",i)+"' width="+imgWidth+" height="+imgHeight+" onclick='selectme(this)' onload='if(init)init()'><BR>";
}
myHTML+= "</DIV></SPAN>";
imgBox.outerHTML=myHTML;

/* 以下控制下拉列表框的出现或隐藏 */
function showlist(obj){//这个函数将在选择提示框点击时激活
//如果列表框已经出现,这次点击则隐藏:
if(imgBox.style.pixelLeft!=-800){imgBox.style.pixelLeft=-800; return;}
//读取选择提示框在窗体中的绝对位置:
//在父容器中的相对位置:
var mytop=obj.offsetTop; 
var myleft=obj.offsetLeft;
//依次读取父容器在更高一级父容器中的相对位置: 
while(obj=obj.offsetParent){
myleft+=obj.offsetLeft; 
mytop+=obj.offsetTop; 
}
//现在已经得到选择提示框的绝对位置myleft和mytop。
//下拉列表拉就出现在这个绝对位置的正下方:
imgBox.style.left=myleft;
imgBox.style.top=mytop+imgHeight+2;

}

var isin=false;
function selectme(obj){ //这个函数将在窗体点击或选定图片时激活,窗体点击中传递的参数是null。
if(!isin||obj){imgBox.style.pixelLeft=-800;} //隐藏列表框
if(obj){
//改变选择提示框中的图片和"myhead"输入框中的值:
//listID是对象的自定义属性,即在对象的标签中定义了这个属性值,现在就可以读取或改变。
myform.myhead.value=imgSrc.replace("数字序号",obj.listID);
document.images["imgselected"].src=imgSrc.replace("数字序号",obj.listID);
}
}

/* 以下控制下拉列表框的自动滚动 */
var mytime=setTimeout("",0);
var pre_X=0; //这个变量用来记录滚动前滚动条的位置
function scrollud(){ //本函数在下拉列表框滚动时被激活
var current_X=imgBox.scrollTop; //记录函数激活时滚动条的位置
//判断向上还是向下滚动,并自动滚动到"imgHeight"的整数倍。
//我们改变列表框的scrollTop值时,会自动激发其onscroll事件,循环激活本函数。
if(current_X>pre_X && imgBox.scrollTop< Math.ceil(imgBox.scrollTop/imgHeight)*imgHeight){
clearTimeout(mytime);
mytime=setTimeout("imgBox.scrollTop=Math.round(imgBox.scrollTop+1);",1);
}
else if(current_X<pre_X && imgBox.scrollTop> Math.floor(imgBox.scrollTop/imgHeight)*imgHeight){
clearTimeout(mytime);
mytime=setTimeout("imgBox.scrollTop=Math.round(imgBox.scrollTop-1);",1);
}
pre_X=current_X;
}
//使列表框自动滚动到默认选定的图片位置,并给"myhead"输入框以默认值
function init(){ //本函数在每个列表框中的图片加载时激活
imgBox.scrollTop=selectedNo*imgHeight;
myform.myhead.value=imgSrc.replace("数字序号",selectedNo);
}

/* 以下使窗体点击时selectme(obj)函数被激活: */
myActivation="selectme(null)";
if(document.body.onclick)
{
eval(document.body.onclick.toString().replace('anonymous()','bodyclick()'));
document.body.onclick=new Function("bodyclick();"+myActivation);
}
else document.body.onclick=new Function(myActivation);
-->
</script>


  程序最后“使窗体点击时selectme(obj)函数被激活”部分可以用document.body.onclick=new Function("selectme(null)")简单替换之。但为了不和其它程序的窗体点击事件冲突,我们用了这段代码。详见拙作《完美解决一个事件激活多个函数》。你也可以将"myhead" 的type值设为"hide",这里为了演示,就将它显示了出来。

  好了,这个控件“图片下拉选择器”已经做好了,把它应用到留言本、论坛等动态交互的网页上,真是最好不过了!

分享到:
评论

相关推荐

    JavaScript 日期下拉选择器

    JavaScript 日期下拉选择器是一种常见的用户界面组件,它允许用户在网页上方便地选取日期。这个组件通常由三部分组成:年份、月份和日期的下拉菜单,这三个部分会联动显示,即用户在选择年份时,月份和日期的选择会...

    Vue 下拉选择器

    Vue 下拉选择器是一种常见的UI组件,它在移动端应用中用于实现类似PC端Select的功能,提供用户友好的交互方式来选取特定的选项。在这个上下文中,我们主要探讨Vue下拉选择器的实现、特点和应用场景。 ### Vue组件化...

    基于Layui和ZTree的树形下拉选择器设计源码

    本项目是基于Layui和ZTree的树形下拉选择器设计源码,包含118个文件,其中75个GIF文件,24个JavaScript文件,6个CSS文件。该系统是一个基于layui和ztree的树形下拉选择器,提供了丰富的功能,包括异步加载、点击回调...

    Javascript实现的日期下拉菜单

    一个简单的日期选择器可能包含一个`&lt;select&gt;`元素,用于展示日期的下拉选项。然而,HTML5提供了内置的`&lt;input type="date"&gt;`标签,它可以生成一个原生的日期选择器,但样式和功能可能受到浏览器支持的限制。为了更...

    layui下拉多选,下拉选择多选

    在 Layui 中,下拉多选框(Multiple Select)是用于展示一组可复选选项的控件,常用于需要用户选择多个值的场景,如设置权限、选择分类等。这个组件支持搜索过滤、远程数据加载等功能,提高了用户体验。 3. 使用...

    jq高校联动下拉选择器

    "jq高校联动下拉选择器"是一个专门针对这种情况设计的解决方案,它利用JavaScript库jQuery(简称jq)来实现高效、便捷的交互体验。这个工具集成了全国省市大学的数据,为用户提供了一种方便的方式来选择他们所在的...

    javascript经典特效---带图片下拉菜单.rar

    在JavaScript编程领域中,"带图片下拉菜单"是一种常见的交互设计,用于提升网站或应用程序的用户体验。这种特效使得用户可以通过点击一个主菜单项来展开一个包含多个子选项的下拉菜单,其中每个子选项可能伴有相关的...

    javascript经典特效---下拉菜单选择器.rar

    在这里,我们将深入探讨JavaScript下拉菜单选择器的相关知识点。 首先,HTML的`&lt;select&gt;`元素是创建下拉菜单的基础。它包含了若干个`&lt;option&gt;`子元素,每个`&lt;option&gt;`代表一个可选的值。例如: ```html ...

    javascript下拉菜单源代码

    JavaScript下拉菜单是一种常见的网页交互元素,用于提供多级导航选项,提高用户界面的可用性和效率。在网页设计中,JavaScript常被用来实现动态效果,如下拉菜单,因为HTML和CSS本身无法实现复杂的交互性。 这个名...

    基于jquery的H5移动端选择器,日期选择器,自定义级联选择器,自定义html选择器

    通常,这样的选择器会包含年、月、日的滑动选择或者下拉菜单,使得用户可以快速、准确地设定日期,避免手动输入可能带来的错误。 级联选择器(Cascading Selectors)则是一种允许用户从一系列相关选项中逐级选择的...

    利用JQuery特效制作城市下拉选择器

    本教程将详细讲解如何利用jQuery特效来制作一个高效、美观的城市下拉选择器。 首先,我们需要了解HTML基础结构。在页面中,我们需要创建一个`&lt;select&gt;`元素,作为下拉选择器的容器。每个城市将作为`&lt;option&gt;`元素...

    javascript 下拉菜单(各种各样的)

    以下是关于JavaScript下拉菜单的一些关键知识点: 1. HTML结构:下拉菜单的基础结构通常由`&lt;select&gt;`标签构建,其中包含一系列`&lt;option&gt;`标签来定义菜单项。然而,为了实现更复杂的交互和自定义样式,开发者通常会...

    Vue2x的下拉时间选择器小时分钟秒支持灵活的时间格式

    在Vue 2.x框架中,开发人员经常需要处理与时间选择相关的交互,比如下拉时间选择器。这种组件能够提供用户友好的界面,允许用户轻松地选择小时、分钟和秒。在这种情况下,我们讨论的是一个专门针对Vue 2.x设计的下拉...

    javascript多级下拉菜单插件

    5. **性能优化**:为了提高用户体验,我们应避免不必要的DOM操作,可以使用事件委托来减少事件监听器的数量,以及利用CSS选择器和类名来更高效地操作元素。 6. **插件化开发**:一个成熟的下拉菜单插件应该易于配置...

    javascript实现简单的下拉菜单

    1. **使用类名代替ID**:如果页面中有多个类似的下拉菜单,可以使用类名来选择元素,这样可以减少重复的代码。 2. **事件委托**:可以将事件绑定到父容器上,利用事件冒泡机制处理子元素的事件,这可以减少事件监听...

    jquery select 多种下拉日期选择插件

    此外,插件还支持弹出日历选择器,让用户能够逐日浏览并选择特定日期,增加了选择的灵活性。 在实际开发中,这种插件的实现可能涉及到以下几个关键点: 1. **事件监听**:使用jQuery的`.on()`方法监听input元素的...

    最好的下拉选择框

    考虑到无障碍性(Accessibility),确保下拉选择框有明确的`aria-label`或`aria-labelledby`属性,以帮助屏幕阅读器用户理解其功能。 6. **优化与性能**: 如果下拉选项很多,为了避免一次性加载导致页面卡顿,...

    JavaScript开发-省市区联动选择器

    在JavaScript开发中,省市区联动选择器是一种常见的交互组件,常用于地址填写或者地理位置筛选等场景。这个组件的核心思想是,当用户在一个下拉框(通常是省份)中选择一个值时,另一个下拉框(城市)会根据所选的...

    javascript经典特效---下拉菜单图片选择.rar

    在JavaScript编程领域中,下拉菜单图片选择是一种常见的交互效果,尤其在网页设计中颇为流行。这个"javascript经典特效---下拉菜单图片选择.rar"压缩包文件包含了一个实现这一功能的示例,主要通过HTML、CSS和...

Global site tag (gtag.js) - Google Analytics