PSD to HTML conversion PSD to HTML conversion PSD2HTML.com with over 300 professionals takes the designs to HTML and beyond

Code Snippet

Home » Code Snippets » jQuery » Styled Popup Menu

Styled Popup Menu

This idea is from Veer.com and how they handle the dropdowns for things like T-Shirt sizes. Thank you to Dennis Sa.

View Demo

HTML

We'll wrap a regular text input inside an <div>, which also contains an unordered list which will represent the values for the popup menu.

<div class="size">
	<input type="text" name="test" value="choose your size" class="field" readonly="readonly" />
	<ul class="list">
		<li>Male - M</li>
		<li>Female - M</li>
		<li>Male - S</li>
		<li>Female - S</li>
	</ul>
</div>

CSS

The lists will be hidden by default, but still all styled up and ready to go when a click triggers them to be shown.

.size { position:relative }
.size .field {
	width:300px; background:#EC6603; color:#fff; padding:5px; border:none; cursor:pointer;
	font-family:'lucida sans unicode',sans-serif; font-size:1em;
	border:solid 1px #EC6603;
	-webkit-transition: all .4s ease-in-out;
	transition: all .4s ease-in-out;
}
.size .field:hover {
	border:solid 1px #fff;
	-moz-box-shadow:0 0 5px #999; -webkit-box-shadow:0 0 5px #999; box-shadow:0 0 5px #999
}
.size>ul.list { display:none;
	position:absolute; left:30px; top:-30px; z-index:999;
	width:300px;
	margin:0; padding:10px; list-style:none;
	background:#fff; color:#333;
	-moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;
	-moz-box-shadow:0 0 5px #999; -webkit-box-shadow:0 0 5px #999; box-shadow:0 0 5px #999
}
.size>ul.list li {
	padding:10px;
	border-bottom: solid 1px #ccc;
}
.size>ul.list li:hover {
	background:#EC6603; color:#fff;
}
.size>ul.list li:last-child { border:none }

jQuery

We'll throw a quick plugin together, so that this functionality can be called on any div wrapper that contains this same HTML setup.=

(function($){
	$.fn.styleddropdown = function(){
		return this.each(function(){
			var obj = $(this)
			obj.find('.field').click(function() { //onclick event, 'list' fadein
			obj.find('.list').fadeIn(400);

			$(document).keyup(function(event) { //keypress event, fadeout on 'escape'
				if(event.keyCode == 27) {
				obj.find('.list').fadeOut(400);
				}
			});

			obj.find('.list').hover(function(){ },
				function(){
					$(this).fadeOut(400);
				});
			});

			obj.find('.list li').click(function() { //onclick event, change field value with selected 'list' item and fadeout 'list'
			obj.find('.field')
				.val($(this).html())
				.css({
					'background':'#fff',
					'color':'#333'
				});
			obj.find('.list').fadeOut(400);
			});
		});
	};
})(jQuery);

Usage

Then we just call the plugin, when the DOM is ready of course.

$(function(){
	$('.size').styleddropdown();
});

Subscribe to The Thread

  1. Hendra says:

    This is a really nice plugin. I just wonder if there’s a way to do it with select element.

    Then use jQuery to convert the select element into the above markups. Is it possible?

    • You could probably do it with the select element as well. It would take some extra special tweaking though. Instead of an input like there is now, it would have to just be a div or something. When JavaScript is loaded, it would make a UL out of the select element, but keep both it and the select hidden. Then when you click the div, it would show the UL like it does now, and when an list item is clicked, it would set the text of the div to show the choice AND change the value of the hidden select element. A bit more complicated but doable and probably a better choice in fallback scenarios.

  2. The demo is broken because of a typo in the closing title tag.

    This sounds really interesting, I’ll be trying to integrate it into my next design.

  3. zara says:

    just a minor:

    ===
    var obj = $(this)
    ===
    instead of
    obj = $(this)

    aloows you to have multiple elements…

    kr, tara

  4. Ross says:

    doesn’t work in IE6 of course…

    (do people still code for IE6?)

  5. John Valis says:

    thanks a lot, for sharing such an informative post. All i have learned from your code is the keyup,keydown event handling. thanks

  6. mdennisa says:

    Thx Chris, for featuring the snippet.
    @John Valis , I somehow thought that key-event might be useful :)

  7. Ricardo says:

    Wonderful effect, I always thought I would need to tweak an option field to acheive this styling. In mobile sites this should prove to be a valuable UX addition. On the other hand, I would recommend adding the unselectable=”on” property to the input.

    If you test this on IE 7/8, you’ll get the blinking cursor even underneath the list, and adding that property makes sure it goes away.

    Thanks!

  8. Asif says:

    I’m trying to add multiple selectboxes but it’s js not working properly.

  9. al-jerreau says:

    Nice one, but would be much cooler if it had keyboard support :-) like the mac style popup though, keep up the good work

Speak, my friend

At this moment, you have an awesome opportunity* to be the person your mother always wanted you to be: kind, helpful, and smart. Do that, and we'll give you a big ol' gold star for the day (literally).

Posting tips:
  • You can use basic HTML
  • When posting code, please turn all
    < characters into &lt;
  • If the code is multi-line, use
    <pre><code></code></pre>
Thank you,
~ The Management ~