Peek-A-Boo PlaceHolders, Floating Labels for Bootstrap 3

Hide labels behind inputs on Bootstrap’s horizontal forms, until the user starts to fill them up and it’s then sliding on. Preferably for inputs with placeholders.

GitHub

Hi fellows,

Recently a few articles over the web talked about that new trend-to-become « floating labels ». This is quite an ingenious idea I think.

As I’m working quite a lot with Bootstrap these days, I wrote a jQuery plugin to apply this effect on the framework’s horizontal forms.

Example

Plugin

(function ($) {
  'use strict';
  $.fn.bsPeekabooLabel = function () {
    var input = $(this),
      control = input.closest('[class*="col-"]'),
      label = control.siblings('.control-label'),
      show = false,
      place = function (d) {
        var m;
        if ($(control).css('float') === 'left') {
          m = '0 0 0 ' + label.outerWidth() + 'px';
          label.animate({ margin: show ? 0 : m, opacity: show ? 1 : 0 }, d);
          control.animate({ margin: m }, d);
        } else {
          label.animate({ margin: 0, opacity: 1 }, d);
          control.animate({ margin: show ? label.outerHeight() + 'px 0 0' : 0 }, d);
        }
      };
    label.css({ position: 'absolute' });
    place(0);
    input.keyup(function () {
      if (show === !input.val()) {
        show = !show;
        place(400);
      }
    });
    $(window).resize(function () { place(0); });
  };
}(jQuery));

How To Use

First, make sure your horizontal form respects Bootstrap’s HTML structure, and that your inputs have a placeholder attribute. Then, target each input you want to apply the effect to.

$('.form-control[placeholder]', '.form-horizontal').each(function () {
  $(this).bsPeekabooLabel();
});