Смещенный label играет роль placeholder для элементов input и textarea
 
  
Вероятно, вы видели эффект рассмотренный в данной статье. Например, есть текстовое поле и, соответственно, 
в нем присутствует текст-placeholder. Когда пользователь кликает по текстовому полю область с  
placeholder смещается к низу (или краю) текстового поля.  На мой взгляд, довольно удобная практика; 
Brad Frost написал об этом подробную статью.
Многие демо-примеры со смещением placeholder реализованы на javascript. Посетив сайт nest.com и немного поразмышляв над их техникой замещения я решил реализовать данный эффект без javascript.
Вот пример реализации:
Конечно на nest.com смещение (смена текста и показ элемента label) реализовано эффектней. 
С использованием js мы могли бы реализовать более плавные движения, но наша задача реализовать все на чистом CSS. 
Данная техника основана на следующем: элемент label является псевдоplaceholder’ом. 
Примечание
Есть по крайне мере две причины для использования данной техники:
- Возможность сэкономить место. 
Поскольку 
labelиinputобъединены, вы экономите пространство. Когда поле в фокусе,labelостается видимым за счет правильного позиционирования. - Поле делается как одна большая кнопка. Как известно, атрибуты 
forуlabelиidу поля позволяют связать элементы, но еще более актуализировать связь можно при помощи большого прямоугольника. Прямоугольник так и просит заполнить поле и кликнуть по кнопке. 
Реализуя плавающие label, обратите внимание на кроссбраузерность. 
Еще один недостаток данной модели: мы не можем использовать placeholder; однако placeholder иногда может быть очень полезен 
(например, для номера телефона иногда полезно создать placeholder, 
чтобы акцентировать внимание на правильность заполнения формы: (555)555-55555).
Трюк 1 - label заменяет placeholder
Есть div, который содержит label и input (который потребуется вам в любом случае, так как 
label и input должны находиться в блочных элементах). 
 Для div используется относительное позиционирование. Благодаря относительному позиционированию мы можем абсолютно позиционировать
  label и текстовое поле внутри div. 
Если вы расположите поле сверху с прозрачным фоном, то вы по-прежнему будете видеть label прямо под полем даже при клике по полю. 
HTML
    <div>
    <input id="name" name="name" type="text" required>
    <label for="name">Your Name</label>
</div>
CSS
    form > div {
  position: relative;
}
form > div > label {
  position: absolute;
}
Трюк 2 – псевдокласс :focus и сестринский комбинатор
Порядок расположения label и input не имеет значения, поскольку семантически они связаны через атрибут for. 
Но если мы расположим поле первым, то появляется возможность использовать псевдокласс :focus 
и сестринский комбинатор (+), таким образом, мы можем назначить стили элементу label при фокусе на поле. 
CSS
    input:focus + label {
  /* сделайте что-нибуль с label */
}
С label вы вольны делать все что захотите. 
В моем примере label (при фокусе на поле) располагается в нижней части блока и относительно правой стороны блока. 
CSS
    form.go-bottom label {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 100%;
  transition: 0.2s;
}
form.go-bottom input:focus + label
  top: 100%;
  margin-top: -16px;
}
Трюк 3 – псевдокласс :valid или валидация
Если поле заполнено и потеряло фокус, то было бы странно в этом случае оставлять в нем текст label. 
К счастью в CSS есть псевдокласс valid, 
который проверяет поля формы на корректность (по типу). 
Например, проверить поле на обязательность и наличие в нем текста можно так:
HTML
    <input type="text" required>
Помните, текст элемента label виден из-за того, что у input прозрачный фон. 
Чтобы спрятать label, нам достаточно установить фон у input:
CSS
    form input:valid {
  background: white;
}
Остальной код затрагивает дизайн элементов.
Источник: float-labels-css

Комментарии к статье
круто)) попро6ую у се6я на сайте)
Спасибо тебе о великой и могучий! За 4 часа весь инет прошерстил вдоль и поперек в поисках решения проблемы с плэйсхолдерами. И вот оно чудо!