下拉选择图像

IT技术 javascript jquery html css
2021-01-26 01:17:42

我想创建一个下拉选择,其中包含图像而不是文本作为选项。我已经在 Stack Overflow 上进行了一些谷歌搜索和搜索,通常给出的答案是使用jQuery 组合框

在我看来,此解决方案的问题在于您必须提供文本。看起来图像只是伴随左侧文本的图标。如果我错了,请纠正我,但此解决方案不会涵盖我正在尝试做的事情 - 完全用图像替换文本。

关于我正在尝试做的事情的一些背景 - 我正在尝试创建一个下拉列表,供用户在在线绘画/涂鸦应用程序上选择线条粗细。图像将是不同粗细的线条,有点像 mspaint。

6个回答

你甚至不需要 javascript 来做到这一点!

我希望这引起了你的兴趣,所以就这样吧。一、html结构:

<div id="image-dropdown">
    <input type="radio" id="line1" name="line-style" value="1" checked="checked" />
    <label for="line1"></label>
    <input type="radio" id="line2" name="line-style" value="2" />
    <label for="line2"></label>
    ...
</div>

什么?单选按钮?正确的。我们将它们的样式设置为带有图像的下拉列表,因为这就是您所追求的!诀窍在于知道当标签正确链接到输入(即“for”属性和目标元素 id)时,输入将隐式变为活动状态;单击标签 = 单击单选按钮。下面是带有内联注释的略微缩写的 css:

#image-dropdown {
    /*style the "box" in its minimzed state*/
    border:1px solid black; width:200px; height:50px; overflow:hidden;
    /*animate the dropdown collapsing*/
    transition: height 0.1s;
}
#image-dropdown:hover {
    /*when expanded, the dropdown will get native means of scrolling*/
    height:200px; overflow-y:scroll;
    /*animate the dropdown expanding*/
    transition: height 0.5s;
}
#image-dropdown input {
    /*hide the nasty default radio buttons!*/
    position:absolute;top:0;left:0;opacity:0;
}
#image-dropdown label {
    /*style the labels to look like dropdown options*/
    display:none; margin:2px; height:46px; opacity:0.2; 
    background:url("http://www.google.com/images/srpr/logo3w.png") 50% 50%;}
#image-dropdown:hover label{
    /*this is how labels render in the "expanded" state.
     we want to see only the selected radio button in the collapsed menu,
     and all of them when expanded*/
    display:block;
}
#image-dropdown input:checked + label {
    /*tricky! labels immediately following a checked radio button
      (with our markup they are semantically related) should be fully opaque
      and visible even in the collapsed menu*/
    opacity:1 !important; display:block;
}

完整示例:http : //jsfiddle.net/NDCSR/1/

NB1:您可能需要将它与position:absolute一起使用在具有 position:relative + high z-index 的容器内。

NB2:为单个线条样式添加更多背景时,请考虑使用基于标签的“for”属性的选择器,如下所示:

label[for=linestyle2] {background-image:url(...);}
oop,这很有创意:-) 谢谢。...但最后,人们可能最终会将一些细节包装到自己的 JS 框架中。这导致完成的 JS 框架......
2021-03-15 01:17:42
我喜欢这种方法,不需要 JS :-)
2021-03-18 01:17:42
非常聪明。+1 肯定的。
2021-03-27 01:17:42
这是一个很好的答案。但我想知道,为什么你不使用.on("change","[name='line-style']")每 100 毫秒设置时间间隔来检查项目?
2021-04-10 01:17:42
这是一个改进。我反对 ids,因为它们不能放在 webcomponent 中,所以我取出标签 fors,而是将单选按钮放在标签内。另一个问题是,由于单选按钮的位置是top:0,每次选择一个item时select都会跳回到顶部,非常烦人。我还希望我的下拉菜单能够每行包含多个项目。看看这个jsfiddle.net/NDCSR/623
2021-04-13 01:17:42

检查这个例子..一切都很容易完成http://jsfiddle.net/GHzfD/

编辑:自 2013 年 7 月 2 日起更新/工作:jsfiddle.net/GHzfD/357

#webmenu{
    width:340px;
}

<select name="webmenu" id="webmenu">
    <option value="calendar" title="http://www.abe.co.nz/edit/image_cache/Hamach_300x60c0.JPG"></option>
    <option value="shopping_cart" title="http://www.nationaldirectory.com.au/sites/itchnomore/thumbs/screenshot2013-01-23at12.05.50pm_300_60.png"></option>
    <option value="cd" title="http://www.mitenterpriseforum.co.uk/wp-content/uploads/2013/01/MIT_EF_logo_300x60.jpg"></option>
    <option value="email"  selected="selected" title="http://annualreport.tacomaartmuseum.org/sites/default/files/L_AnnualReport_300x60.png"></option>
    <option value="faq" title="http://fleetfootmarketing.com/wp-content/uploads/2013/01/Wichita-Apartment-Video-Tours-CTA60-300x50.png"></option>
    <option value="games" title="http://krishnapatrika.com/images/300x50/pellipandiri300-50.gif"></option>
</select>

$("body select").msDropDown();
Ashraf 正在使用 msDropDown jQuery 插件。您可以在此处找到更多详细信息:marghoobsuleman.com/jquery-image-dropdown
2021-03-24 01:17:42
是的,我使用了 babonk 问题中提到的插件
2021-04-02 01:17:42

看起来像一个简单的 html 菜单会更简单。使用 html5 数据属性作为值或任何您想要存储它们的方法和 css 来处理图像作为背景或将它们放在 html 本身中。

编辑:如果您被迫从无法摆脱的现有选择转换,也有一些很好的插件可以将选择修改为 html。Wijmo 和 Chosen 是我想到的一对

如果您考虑一下下拉选择背后的概念,它非常简单。对于你想要完成的事情,一个简单的<ul>就可以了。

<ul id="menu">
    <li>
        <a href="#"><img src="" alt=""/></a> <!-- Selected -->
        <ul>
            <li><a href="#"><img src="" alt=""/></a></li>
            <li><a href="#"><img src="" alt=""/></a></li>
            <li><a href="#"><img src="" alt=""/></a></li>
            <li><a href="#"><img src="" alt=""/></a></li>
        </ul>
    </li>
</ul>

你用 css 设置样式,然后一些简单的 jQuery 就可以了。我还没有尝试过这个:

$('#menu ul li').click(function(){
    var $a = $(this).find('a');
    $(this).parents('#menu').children('li a').replaceWith($a).
});

普通的 JAVASCRIPT:

演示:http : //codepen.io/tazotodua/pen/orhdp

var shownnn = "yes";
var dropd = document.getElementById("image-dropdown");

function showww() {
  dropd.style.height = "auto";
  dropd.style.overflow = "y-scroll";
}

function hideee() {
    dropd.style.height = "30px";
    dropd.style.overflow = "hidden";
  }
  //dropd.addEventListener('mouseover', showOrHide, false);
  //dropd.addEventListener('click',showOrHide , false);


function myfuunc(imgParent) {
  hideee();
  var mainDIVV = document.getElementById("image-dropdown");
  imgParent.parentNode.removeChild(imgParent);
  mainDIVV.insertBefore(imgParent, mainDIVV.childNodes[0]);
}
#image-dropdown {
  display: inline-block;
  border: 1px solid;
}
#image-dropdown {
  height: 30px;
  overflow: hidden;
}
/*#image-dropdown:hover {} */

#image-dropdown .img_holder {
  cursor: pointer;
}
#image-dropdown img.flagimgs {
  height: 30px;
}
#image-dropdown span.iTEXT {
  position: relative;
  top: -8px;
}
<!-- not tested in mobiles -->


<div id="image-dropdown" onmouseleave="hideee();">
  <div class="img_holder" onclick="myfuunc(this);" onmouseover="showww();">
    <img class="flagimgs first" src="http://www.google.com/tv/images/socialyoutube.png" /> <span class="iTEXT">First</span>
  </div>
  <div class="img_holder" onclick="myfuunc(this);" onmouseover="showww();">
    <img class="flagimgs second" src="http://www.google.com/cloudprint/learn/images/icons/fiabee.png" /> <span class="iTEXT">Second</span>
  </div>
  <div class="img_holder" onclick="myfuunc(this);" onmouseover="showww();">
    <img class="flagimgs second" src="http://www.google.com/tv/images/lplay.png" /> <span class="iTEXT">Third</span>
  </div>
  <div class="img_holder" onclick="myfuunc(this);" onmouseover="showww();">
    <img class="flagimgs second" src="http://www.google.com/cloudprint/learn/images/icons/cloudprintlite.png" /> <span class="iTEXT">Fourth</span>
  </div>
</div>