Material Design - Dropdown.js and CSS Updates
HTML
<link rel="stylesheet" href="https://bizamajig.com/content/18805/bizamajig-ia-marketplace-apps-18805-20150330-18.css">
<script src="https://www.bizamajig.com/include/bizamajig-ui-plugins-no-map.min.js"></script>
<script src="https://www.bizamajig.com/include/bizamajig-ui.min.js"></script>
<form>
<fieldset class="container">
<div class="form-group">
<div class="col-xs-12 col-sm-6">
<select class="form-control" multiple>
<option>Option 1</option>
<option>Option 2</option>
</select>
</div>
</div>
</fieldset>
</form>
CSS
.dropdownjs {
position: relative;
}
.dropdownjs * {
box-sizing: border-box;
}
.dropdownjs > input {
width: 100%;
padding-right: 30px;
text-overflow: ellipsis;
}
.dropdownjs > input.focus ~ ul {
transform: scale(1);
}
.dropdownjs > ul {
position: absolute;
padding: 0;
margin: 0;
min-width: 200px;
transform: scale(0);
z-index: 10000;
}
/*.dropdownjs > ul[placement=top-left] {*/
.dropdownjs > ul.placement-top-left {
transform-origin: bottom left;
bottom: 0;
left: 0;
}
/*.dropdownjs > ul[placement=bottom-left] {*/
.dropdownjs > ul.placement-bottom-left {
transform-origin: top left;
top: 0;
left: 0;
}
.dropdownjs > ul > li {
list-style: none;
padding: 10px 20px;
}
.dropdownjs > ul > li.dropdownjs-add {
padding: 0;
}
.dropdownjs > ul > li.dropdownjs-add > input {
border: 0;
padding: 10px 20px;
width: 100%;
}
/* Theme */
.dropdownjs > input[readonly] {
cursor: pointer;
}
select[data-dropdownjs][disabled] + .dropdownjs > input[readonly] {
cursor: default;
}
.dropdownjs > ul {
background: #FFF;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12), 0 1px 6px rgba(0, 0, 0, 0.12);
transition: transform 0.2s ease-out;
padding: 10px;
overflow: auto;
max-width: 500px;
}
.dropdownjs > ul > li {
cursor: pointer;
word-wrap: break-word;
}
.dropdownjs > ul > li.selected,
.dropdownjs > ul > li:active {
background-color: #eaeaea;
}
.dropdownjs > ul > li:focus {
outline: 0;
outline: 1px solid #d4d4d4;
}
.dropdownjs > ul > li > .close:before {
content: "\00d7";
display: block;
position: absolute;
right: 15px;
float: right;
font-size: 21px;
font-weight: 700;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
opacity: .6;
}
.dropdownjs > ul > li:h > .close:hover:before {
opacity: .9;
}
JavaScript
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Plugin: https://github.com/FezVrasta/dropdown.js
//
// This plugin has been modified to work with SINGLE SELECTS only. The same pattern can
// be used for MULTI SELECTS also.
//
// Modifications to the plugin are:
//
// 1 - Edited so that the underlying, native select input is updated with newly selected items. This was not working.
//
// 2 - Added ability to .trigger( 'dropdownjs:updated' ) to refresh the dropdown from the native select input.
//
// Replaced DOMNodeInserted with .on( 'dropdownjs:updated' ) for all browser compatibility.
//
// 3 - Changed attribute to class selectors:
//
// - like placeholder/top-left to .placeholder-top-left and .placeholder-bottom-left
//
// - like li[selected] to li.selected
//
// Also changed the related css, for example, .dropdownjs > ul[placement=top-left] to .dropdownjs > ul.placement-top-left{}
//
// 4 - Added data attribute, data-target-select, to the dropdown ul element carrying ID of the native select input.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// Node/CommonJS
module.exports = factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function($) {
var methods = {
options : {
"optionClass": "",
"dropdownClass": "",
"autoinit": false,
"callback": false,
"dynamicOptLabel": "Add a new option..."
},
init: function(options) {
// Apply user options if user has defined some
if (options) {
options = $.extend(methods.options, options);
...