Интересные статьи

Красивая форма обратной связи... Предоставление посетителям сайта простого и надежного средства обратной связи – это важнейшая...

Readmore

WordPress. 10 полезных приемов разработки Начиная с прошлого года, рынок тем для WordPress невероятно вырос. В чем же причина? Отличные дизайны,...

Readmore

Создание прототипа с помощью... Grid 960 - это CSS Фреймворк, который позволяет разработчикам быстро конструировать прототипы дизайна....

Readmore

WordPress. Как сделать блог многоязычным Начиная вести свой блог, я твердо решила никогда не писать обзорных статей о плагинах к WordPress....

Readmore

10 отличных шорткодов для Wordpress Если вы давно ведете свой блог на WordPress, то конечно же знаете, что визуальный редактор позволяет...

Readmore

Очередной блог фрилансера Rss

Создание формы со скользящими подписями

Дата публикации : 28-01-2010 | в рубрике : верстка, переводы

Метки: , ,

19

Пару недель назад, я читал статью Люка Вроблевски. Для тех, кто еще не слышал о нем, Люк -  автор книги о правильном дизайне веб-форм.

В его статье, меня особенно заинтересовала часть, о расположении подписей внутри текстовых полей:

Поскольку подписи, расположенные внутри текстовых полей, исчезают при вводе текста, вместе с ними исчезает контекст введенных данных. Так что, если вы вдруг забудете, на какой вопрос вы ввели ответ, значит вам не повезло – подпись к полю вы, скорее всего нигде не найдете. Из этого следует, что подписи, расположенные внутри текстовых полей – не самое лучшее решение для создания длинных форм. Когда вы заполните форму до конца, все подписи пропадут! В этом случае, гораздо сложнее будет вернутся и проверить свои ответы.

Люк Вроблевски

Эти слова стали хорошим поводом для размышления. Конечно, вы можете взглянуть на поле со значением “Вася Пупкин”, и точно сказать что это поле для ввода имени. Но в случае с длинными формами, очень легко забыть вопросы, на которые вы отвечали.

Самым лучшим решением, по мнению Люка, является размещение подписей за пределами текстового поля, с тем, чтобы они всегда были доступны для пользователя. Я думаю это неплохое решение, но мы можем придумать кое-что поинтереснее.

Скользящие подписи

После прочтения этой статьи, мне пришло в голову, что мы вполне можем использовать преимущества каждого из методов. Мне нравится как выглядят подсказки внутри полей, но тем не менее, я согласен с тем, что она всегда должна оставаться на экране. Но, к счастью у нас в распоряжении есть JQuery, мы знакомы с принципом постепенного улучшения, поэтому давайте создадим подписи, расположенные внутри текстовых полей, которые, вместо того, чтобы исчезать, будут сдвигаться влево (или вверх, как вам больше хочется), при клике по текстовому полю.

HTML

<form action="" method="post" id="info">
    <h2>Контактная информация</h2>
    <div id="name-wrap" class="slider">
        <label for="name">
            Имя
        </label>
        <input type="text" id="name" name="name">
    </div><!--/#name-wrap-->
    <div id="email-wrap" class="slider">
        <label for="email">
            E&ndash;mail
        </label>
        <input type="text" id="email" name="email">
    </div><!--/#email-wrap-->
    <div id="street-wrap" class="slider">
        <label for="st">
            Город
        </label>
        <input type="text" id="st" name="st">
    </div><!--/#street-wrap-->
    <div id="city-wrap" class="slider">
        <label for="city">
            Улица
        </label>
        <input type="text" id="city" name="city">
    </div><!--/#city-wrap-->
    <div id="zip-wrap" class="slider">
        <label for="zip">
            Индекс
        </label>
        <input type="text" id="zip" name="zip">
    </div><!--/#zip-wrap-->
    <input type="submit" id="btn" name="btn" value="отправить">
</form>

Единственным необходимым элементом, для создания скользящих подписей (в моей реализации), является оборачивающий элемент (в моем примере DIV), и применение к нему класса “slider” (это легко можно изменить в JavaScript).

На этом этапе, у нас получилась очень простая, и некрасивая форма:

one

CSS

body {
    font: 12px / 1.3 Arial, Sans-serif;
}

form {
    width: 360px;
    padding: 10px 20px 30px 60px;
    margin: auto;
    background: #f7f7f7;
    border: 1px solid #ddd;
}

div {
    clear: both;
    position: relative;
    margin: 0 0 10px;
}

label {
    cursor: pointer;
    display: block;
}

input[type =
"text"] {
    width: 300px;
    border: 1px solid #999;
    padding: 5px;
    -moz-border-radius: 4px;
}

input[type =
"text"]:focus {
    border-color: #777;
}

input[name =
"zip"] {
    width: 150px;
}

/* submit button */
input[type =
"submit"] {
    cursor: pointer;
    border: 1px solid #999;
    padding: 5px;
    -moz-border-radius: 4px;
    background: #eee;
}

input[type =
"submit"]:hover, input[type = "submit"]:focus {
    border-color: #333;
    background: #ddd;
}

input[type =
"submit"]:active {
    margin-top: 1px;
}

Единственный, 100%-необходимый CSS в этом примере – это применение position: relatve, к оборачивающему элементу (DIV). Все остальное используется только для настройки внешнего вида формы, вы можете изменять его по своему вкусу.

Теперь у нас получилась вполне симпатичная форма, в которой подписи расположены сверху непосредственных полей ввода.

two

jQuery

Теперь, раздел, который все обычно пропускают, переходя к демо-странице:

$('form#info .slider label').each(function(){
	var labelColor = '#999';
	var restingPosition = '5px';

	// стилизация и позиционирование подписей
	$(this).css({
		'color' : labelColor,
		 	'position' : 'absolute',
	 		'top' : '6px',
			'left' : restingPosition,
			'display' : 'inline',
    	               'z-index' : '99'
	});

	// получение введенного в поле, значения
	var inputval = $(this).next('input').val();

	// получение длины подписи, и добавление к ней 5px
	var labelwidth = $(this).width();
	var labelmove = labelwidth + 5;

	//проверяем, если поле заполнено, то сдвигаем подпись за пределы поля
	if(inputval !== ''){
		$(this).stop().animate({ 'left':'-'+labelmove }, 1);
	}    	

	// если значение поля пустое при фокусе, сдвигаем подпись влево
	// если оно осталось пустым, при потере фокуса, возвращаем их обратно
	$('input').focus(function(){
		var label = $(this).prev('label');
		var width = $(label).width();
		var adjust = width + 5;
		var value = $(this).val();

		if(value == ''){
			label.stop().animate({ 'left':'-'+adjust }, 'fast');
		} else {
			label.css({ 'left':'-'+adjust });
		}
	}).blur(function(){
		var label = $(this).prev('label');
		var value = $(this).val();
		if(value == ''){
			label.stop().animate({ 'left':restingPosition }, 'fast');
		}
	});
})

Вот и все, у вас должна получится полностью работающая форма со скользящими подписями.

Обратите внимание, что форма остается рабочей, даже с отключенным ява-скриптом, это является основным принципом постепенного улучшения. Верите или нет, но все еще остаются люди, не использующие ява-скрипт при просмотре веб-страниц.

Демонстрационная страница.
Архив с примером.

Перевод статьи “Form Design with Sliding Labels”, автор Tim Wright

Похожие записи

Комментарии: (19)

я бы сказал что выглядит СЕКСИ! :)
супер, нужно будет где-то использовать ;)
зы: напишу наверное jQ.плагин по автоматической переделки формы в такую красоту ;)))

Меня только почему-то смущает cursor:pointer над инпутами.

А, ну да, но это легко убрать.

Наткнулся на эту статью в блоге у Дэвида Волша (David Walsh), где он переделывает всю эту красоту под MooTools. Так вот в комментах у него есть ссылка на немного изменённый вариант. По-моему это ещё более симпатично.

Да, здорово смотрится. Но по сути это тот же эффект, только в пределах инпута. С анимацией можно экспериментировать любыми способами.

Правда, только что заметила, там сама подпись, если ввести текст, при потере фокуса пропадает. Этого как раз не стоило делать.

так я и не спорю ))
я же написал «немного изменённый вариант» )

Не по теме, конечно, но не могли бы Вы писать в начале статьи, что это перевод? А то странновато видеть конструкции вроде «я читал», зная, что автор — девушка.

Интересное и продвинутое решение. Даже в голову такое изящество не приходило.

Скрипт симпатичный но в большинстве форм бесполезный. Сам хотел к себе прикрутить, но как оказалось, ни на блоге оригинала (я там нашёл этот скрипт), ни здесь – нет решения для textarea. Простая замена в скрипте (‘input’) на (‘input,textarea’) не помогает: эффект в textarea появляется, но lable её устанавливается точно повер lable предыдущего input. Вобщем отказался, так как в JavaScript не силён.

почему не работает?
даже тут в примере есть textarea, с работающим эффектом…

Решение для textarea есть. Просто нужно добавить textarea во все селекторы скрипта, можете еще раз взглянуть на демонстрационную страницу, я немного изменила скрипт.

Ой спасибочки! Теперь всё в порядке. :-)

Подписался на ваш RSS, познавательно…

Интересно, а с селектами такое можно провернуть? Скажем первый option в селекте делаем пустым, а его lable пусть ложится поверх. А при разворачивании селекта съезжал бы в сторону с тем же эффектом. если в селекте не было выбрано любое прочее значение кроме первого пустого, то при закрытии селекта lable наежал бы на него обратно. Я совсем не разбираюсь в JavaScrip^ как уже сказал, но что-то мне подсказывает, что реализовать это будет несложно. Во всяком случае, возможно. И вот тогда бе данная форма была бы в законченном варианте и полностью функциональна (потому как для radio и checkbox данного эффекта не нужно). Если бы кто-то проделал данную доработку я бы был очень признателен, а мастеру – респект и уважение на весь интернет. :-)

Отличное решение, как с точки зрения функциональности, так и по юзабилити. Снимаю шляпу :)

Интересно реализовано )

Я так понимаю чтобы эта форма работала нужно ещё php файл вставлять?

Что и где нужно прописать чтобы поля формы отправлялись на почту?

Очень интересный примерчик!

С селектами тоже разобрался. Теперь вполне рабочая форма. Спасибо ещё раз!

Оставьте комментарий