<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
<link rel="stylesheet" type="text/css" href="splitmenubuttons.css" />
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script>
<script src="splitmenubuttons.js"></script>
<script>
jQuery(function(){ // on document load
$('a[data-showmenu]').splitmenubuttonMenu() // Add split button menu to links with "data-showmenu" attr
})
</script>
</head>
<body>
<a href="#" class="splitmenubutton" data-showmenu="dropmenu1" data-splitmenu="false">wawasan spiritual dan blogging</a>
<a href="#" data-showmenu="dropmenu2" data-menucolors="navy,blue" class="splitmenubutton">All about spiritual</a>
<!-- contoh markup yang berhubungan dengan drop down menu -->
<!-- Drop Down #1 -->
<ul id="dropmenu1" class="splitdropdown">
<li><a href="http://jalu-pangna.blogspot.com/search/label/tips%20dan%20triks%20blog">Tips dan triks blog</a></li>
<li><a href="http://jalu-pangna.blogspot.com/search/label/CSS">CSS</a></li>
<li><a href="http://jalu-pangna.blogspot.com/search/label/jquery-javascript">JQuery javascript</a></li>
<li><a href="http://jalu-pangna.blogspot.com/search/label/widget">widget</a></li>
<li><a href="http://jalu-pangna.blogspot.com/search/label/animasi">animasi</a></li>
<li><a href="http://jalu-pangna.blogspot.com/search/label/animasi">jejaring sosial</a></li>
<li><a href="#">Tool</a></li>
</ul>
<!-- Drop Down #2 -->
<ul id="dropmenu2" class="splitdropdown">
<li><a href="http://jalu-pangna.blogspot.com/search/label/wawasan%20spiritual">wawasan spiritual</a></li>
<li class="separator"><a href="http://jalu-pangna.blogspot.com/search/label/wawasan%20umum">wawasan umum</a></li>
<li><a href="http://jalu-pangna.blogspot.com/search/label/spiritual">spiritual</a>
<ul>
<li><a href="http://jalu-pangna.blogspot.com/search/label/suluk">suluk</a></li>
<li><a href="http://jalu-pangna.blogspot.com/search/label/sejarah">sejarah</a></li>
<li><a href="http://jalu-pangna.blogspot.com/search/label/babad">babad</a></li>
<li><a href="#">nama sub menu</a></li>
</ul>
</li>
<li><a href="#">nama sub menu</a></li>
<li><a href="#">nama folder1 submenu</a>
<ul>
<li><a href="#">nama item folder1 submenu</a></li>
<li><a href="#">nama folder2 submenu</a>
<ul>
<li><a href="#">nama item folder2 submenu</a></li>
<li><a href="#">nama item folder2 submenu</a></li>
<li><a href="#">nama item folder2 submenu</a></li>
<li><a href="#">nama item folder2 submenu</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">nama sub menu</a></li>
</ul>
<script type='text/javascript'>
//<![CDATA[
jQuery.fn.splitmenubuttonMenu = function(options){
var $ = jQuery, startzindex = 1
var s = $.extend({}, {split:true, triggerevt:'mouseover', hidetoplevelmouseout:true, hidedelay:200, fxduration:100}, options)
var ismobile = navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(android)|(webOS)/i) != null
s.triggerevt = ismobile? 'click' : (s.triggerevt == 'mouseover'? 'mouseenter' : s.triggerevt)
function deselecttoggler($dropmenu){ // func to deselect toggler
var $activetoggler = $dropmenu.data('$activetoggler')
if ($activetoggler && $activetoggler.length == 1){
$activetoggler.removeClass('selected')
var menucolors = $activetoggler.data('menucolors')
if (menucolors)
$activetoggler.css('backgroundColor', menucolors[0])
}
}
function positionmenu(s, level, $toggler, $dropmenu){
if (level == "toplevel"){
var docrightedge = $(document).scrollLeft() + $(window).width() - 40
var docbottomedge = $(document).scrollTop()+$(window).height()-40
this.docrightedge = docrightedge // cache this value
this.docbottomedge = docbottomedge
var $offset = $toggler.data('mainanchor').offset()
var togglerWidth = (s.split)? $toggler.data('mainanchor').width() + $toggler.width() : $toggler.width()
var togglerHeight = $toggler.height()
var dropmenuWidth = $dropmenu.outerWidth()
var dropmenuHeight = $dropmenu.outerHeight()
var leftpos = (($offset.left + dropmenuWidth) > docrightedge)? $offset.left - (dropmenuWidth - togglerWidth) : $offset.left
var toppos = (($offset.top + dropmenuHeight) > docbottomedge)? $offset.top - (dropmenuHeight + togglerHeight) : $offset.top
return {left: leftpos, top: toppos}
}
else{
var $offset = $toggler.offset()
var submenuWidth = $dropmenu.outerWidth()
var submenuHeight = $dropmenu.outerHeight()
var leftpos = ($offset.left + (submenuWidth*2) > this.docrightedge)? -submenuWidth : submenuWidth
var toppos = ($offset.top + (submenuHeight) > this.docbottomedge)? -submenuHeight + $toggler.height() : 0
return {left: leftpos, top: toppos}
}
}
function hidemenu($dropmenu){
$dropmenu.find('ul').hide().end()
.slideUp(s.fxduration, function(){
deselecttoggler($dropmenu)
})
}
return this.each(function(){ //return jQuery obj
var $this = $(this).wrapInner('<span class="innerspan" />') // reference anchor item and add <span> tag inside it
if (this.tagName == "A"){ // only apply split menu to element if it's a link
var menucolors = $this.attr('data-menucolors')
if (menucolors){
menucolors = jQuery.trim(menucolors).split(/,\s*/)
$this.css('backgroundColor', menucolors[0])
}
var $dropmenu = $('ul#' + this.getAttribute('data-showmenu'))
$dropmenu.data('timer', {})
var splitit = $this.attr('data-splitmenu') || s.split
splitit = (typeof splitit == "string")? (splitit == "true" ? true : false ) : splitit
if (splitit && $dropmenu.length == 1){ // split up toggler and menu link itself?
var $toggler = $('<a class="downtoggler dedicatedtoggler"><span class="innerspan downarrow"> </span></a>').insertAfter($this) // append new "toggler" element after menu button
if (menucolors){
$toggler.css('backgroundColor', $this.css('backgroundColor'))
}
}
else{
var $toggler = $this
if ($dropmenu.length == 1){
$toggler.addClass('downtoggler').find('span.innerspan:eq(0)').addClass('downarrow')
}
}
$toggler.data({'mainanchor':$this, 'menucolors':menucolors}) // store ref to menu link (which may be different from toggler if splitit == true)
$dropmenu.appendTo(document.body) //move drop down menu so it's a child of document.body
if ($dropmenu.length == 1){
$toggler.bind(s.triggerevt, function(e){ // action when toggler is activated
clearTimeout($dropmenu.data('timer').hidetimer)
var $this = $(this)
var menucolors = $this.data('menucolors') // get menu colors (if data-menucolors attr defined)
if (menucolors)
$toggler.css('backgroundColor', menucolors[1])
$toggler.addClass('selected') // add CSS class of 'selected' to toggler
var slidefunc = (e.type =='click')? 'slideToggle' : 'slideDown'
if ($dropmenu.data('$activetoggler') && $dropmenu.data('$activetoggler').get(0) != $this.get(0)){
deselecttoggler($dropmenu)
slidefunc = 'slideDown'
}
var menupos = (positionmenu(s, "toplevel", $toggler, $dropmenu))
$dropmenu.css({zIndex:++startzindex, left:menupos.left, top:menupos.top + $this.outerHeight()})
[slidefunc](s.fxduration, function(){
var $this = $(this)
if ($this.css('display') == 'none')
deselecttoggler($this)
})
$dropmenu.data('$activetoggler', $this)
return false
}) // end $toggler.trigger
if (s.hidetoplevelmouseout){
$toggler.bind('mouseleave', function(e){ // action when mouse rolls out of toggler
$dropmenu.data('timer').hidetimer = setTimeout(function(){
hidemenu($dropmenu)
}, s.hidedelay)
})
}
} // end if $dropmenu.length == 1
else{ // else if this button has no drop down menu
$toggler.hover(
function(){
$toggler.addClass('selected')
if ($toggler.data('menucolors'))
$toggler.css('backgroundColor', menucolors[1])
},
function(){
$toggler.removeClass('selected')
if ($toggler.data('menucolors'))
$toggler.css('backgroundColor', menucolors[0])
}
)
}
if ($dropmenu.data('isbuilt')) // if this drop down menu has been built already, move on to the next one
return true
$dropmenu.on('click mouseenter', function(e){
clearTimeout($dropmenu.data('timer').hidetimer)
if (e.type == "mouseenter")
$(this).css({zIndex: startzindex++})
else{
if ($(e.target).parent('li').hasClass('headerli'))
e.stopPropagation()
}
})
if (s.hidetoplevelmouseout){
$dropmenu.on('mouseleave', function(e){
$dropmenu.data('timer').hidetimer = setTimeout(function(){
hidemenu($dropmenu)
}, s.hidedelay)
})
}
var $headers = $dropmenu.find('ul').parent()
$headers.each(function(i){
var $li=$(this).css({zIndex: 1000+i}).addClass('headerli')
var $subul = $li.find('ul:eq(0)').css({display:'block'}) //set sub UL to "block" so we can get dimensions
$subul.data('$parentliref', $li) //cache parent LI of each sub UL
$subul.data('timers', {})
$li.data('$subulref', $subul) //cache sub UL of each parent LI
$li.children("a:eq(0)").addClass('rightarrow')
$li.bind(s.triggerevt, function(e){ //show sub UL when mouse moves over parent LI
var $targetul=$(this).addClass("selected").data('$subulref')
if ($targetul.queue().length<=1){ //if 1 or less queued animations
clearTimeout($targetul.data('timers').hidetimer)
var menupos = (positionmenu(s, "sublevel", $(this), $targetul))
$targetul.css({left: menupos.left, top: menupos.top})
$targetul.stop(true, true).slideDown(s.fxduration)
}
})
$li.bind('mouseleave', function(e){ //hide sub UL when mouse moves out of parent LI
var $targetul=$(this).data('$subulref')
clearTimeout($targetul.data('timers').showtimer)
$targetul.data('timers').hidetimer=setTimeout(function(){
$targetul.stop(true, true).slideUp(s.fxduration).data('$parentliref').removeClass('selected')
}, s.hidedelay)
})
$subul.bind('mouseenter', function(e){
clearTimeout($(this).data('timers').hidetimer)
})
}) // end $headers.each()
$dropmenu.find('ul').andSelf().css({display:'none', visibility:'visible'}) //collapse all ULs again
$dropmenu.data('isbuilt', true)
if (!$(document).data('hidemenuevt')){ // hide top level drop down menus when user clicks on document
$(document).on('click', function(e){
$('ul.splitdropdown:visible').find('ul').hide().end()
.slideUp(s.fxduration, function(){
var $this = $(this)
if ($this.css('display') == 'none')
deselecttoggler($this)
})
})
$(document).data('hidemenuevt', true)
}
}
})
}
//]]>
</script>
</body>
</html>
.splitmenubutton, .downtoggler{ /* .downtoggler element is dynamically added by script */
color: white;
font: bold 13px Arial;
border-radius: 5px;
border-radius: 5px;
border-radius: 5px;
text-decoration: none;
background: darkred; /* default color of menu button */
display: inline-block;
}
.splitmenubutton span.innerspan, .downtoggler span.innerspan{ /* span.innerspan element dynamically added by script inside menu button */
display: block;
padding: 8px;
line-height: 1em;
/* the following CSS3 gradients add a white to transparent linear gradient to the buttons, to give them a more beveled look */
background: linear-gradient(top, rgba(255,252,252,0.54) 0%, rgba(255,255,255,0) 100%); /* FF3.6+ */
background: gradient(linear, left top, left bottom, color-stop(0%,rgba(255,252,252,0.54)), color-stop(100%,rgba(255,255,255,0))); /* Chrome,Safari4+ */
background: linear-gradient(top, rgba(255,252,252,0.54) 0%,rgba(255,255,255,0) 100%); /* Chrome10+,Safari5.1+ */
background: linear-gradient(top, rgba(255,252,252,0.54) 0%,rgba(255,255,255,0) 100%); /* Opera 11.10+ */
background: linear-gradient(top, rgba(255,252,252,0.54) 0%,rgba(255,255,255,0) 100%); /* IE10+ */
background: linear-gradient(to bottom, rgba(255,252,252,0.54) 0%,rgba(255,255,255,0) 100%); /* W3C */
}
.dedicatedtoggler{ /* CSS to apply to toggler when it's a seperate element (instead of being the main menu button itself) */
border-radius: 0 5px 5px 0;
border-radius: 0 5px 5px 0;
border-left: 1px solid #f5f5f5;
}
a.downtoggler.selected{ /* CSS to add to toggler element when it's selected */
background: #b13f33; /* default hover background color of menu */
}
.downarrow, rightarrow{
cursor: pointer;
}
span.innerspan.downarrow::after{ /* Down arrow (hex value) */
content: '\25be';
}
.splitmenubutton span.innerspan.downarrow:after{ /* Down arrow with space before the arrow */
content: '\00a0\25be';
}
.rightarrow:after{ /* CSS for right arrow inside splitdropdown */
content: '\25b8'; /* Add HTML entity based right arrow */
position: absolute;
right: 5px;
font-size: 16px;
height: 100%;
}
/* ##### CSS for UL Drop Down Menus of script ###### */
ul.splitdropdown, ul.splitdropdown ul{ /*topmost and sub ULs, respectively*/
font: normal 13px Verdana;
margin: 0;
padding: 0;
position: absolute;
display: none;
left: 200px;
top: 0;
list-style: none;
background: white; /* background color of drop down */
border: 1px solid lightgray;
border-bottom-width: 0;
box-shadow: 0 0 8px #818181; /*shadow for CSS3 capable browsers.*/
box-shadow: 0 0 8px #818181;
box-shadow: 0 0 8px #818181;
}
ul.splitdropdown li{
position: relative;
}
ul.splitdropdown li a{
display: block;
width: 160px; /*width of menu (not including side paddings)*/
color: black;
background: white;
text-decoration: none;
padding: 8px 4px;
}
* html ul.splitdropdown li{ /*IE6 CSS hack*/
display: inline-block;
width: 170px; /*width of menu (include side paddings of LI A*/
}
ul.splitdropdown li a:hover, .splitdropdown li.selected>a{
background: #eee;
}
ul.splitdropdown li.separator{
border-bottom: 1px solid #dedddd;
}
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |