Как я могу реализовать водяные знаки, подобные переполнению стека, в формах?

Я помню, как где-то видел учебник, в котором говорилось о том, как стилизовать ваши формы ввода более «удобным» способом.

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

Теперь, просто чтобы внести ясность: я не хочу, чтобы подсказка (текст значения заполнителя) исчезала в фокусе, а становилась светлее, когда я впервые начинаю что-то печатать. Хорошие примеры:

  • Ознакомьтесь с формами на Aardvark. Именно так я хочу иметь свои формы ввода.

  • Наш собственный Stack Overflow — когда вы пытаетесь задать вопрос, при нажатии внутри любой формы ввода он не сразу скрывает текст. Вы видите свой курсор, а также подсказку. но когда вы начинаете печатать, он скрывает подсказку. (Я бы предпочел, чтобы он стал более светлым, а не скрывался все вместе, как в приведенном выше примере с трубкозубом.)

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

Любые предложения/ссылки?

[Обновление: недавно я нашел подключаемый модуль jQuery In-Field Labels, который делает именно то, что мне нужно. Кроме того, вот ссылка на улучшение того же плагина. ]


person Kaushik Gopal    schedule 14.02.2010    source источник


Ответы (5)


Вы можете начать с этого:

<input type="text" value="Your Hint Here"
       onFocus="if (this.value == 'Your Hint Here') this.style.color = '#ccc';"
       onKeyDown="if (this.value == 'Your Hint Here') {  
                      this.value = ''; this.style.color = '#000'; }"> 

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

Я также заметил, что формы «Присоединиться сейчас» на vark.com также устанавливают позицию курсора в начало текста. поле вместо того, чтобы оставить его в конце. Это может быть немного сложно, чтобы заставить его работать в разных браузерах, но вы можете проверить решение, предложенное в следующей статье Джоша. Стодола:

person Daniel Vassallo    schedule 14.02.2010
comment
Существует также плагин jQuery под названием Clearfield, который делает всю работу за вас и позволяет оставить ваши js вне вашего HTML. - person Erik; 14.02.2010
comment
Спасибо Даниил, это определенно правильный подход. Мне все еще немного лень самому писать код, поэтому я отмечу это как ответ. Если я полностью закодирую его, я опубликую его здесь. - person Kaushik Gopal; 21.02.2010

HTML5 имеет атрибут placeholder, предназначенный именно для этой задачи.

Однако пока его поддерживает только WebKit (движок рендеринга, используемый в Safari и Google Chrome). Вам понадобится запасной вариант JavaScript, как у Дэниела, на случай, если заполнитель не поддерживается.

проверить наличие поддержки placeholder в JavaScript просто.

person Paul D. Waite    schedule 14.02.2010
comment
Кстати, должен быть значок за упоминание HTML5 при каждом удобном случае. - person Paul D. Waite; 14.02.2010
comment
... и для jQuery :) ... +1: я не знал об этом. - person Daniel Vassallo; 14.02.2010
comment
Это действительно самый чистый ответ на сегодняшний день! - person Olivier Verdier; 14.02.2010
comment
Очень хорошее предложение. Заполнитель в HTML5 можно ввести непосредственно в тег: <input type="text" placeholder="Please enter username">... Однако в контексте этого вопроса ОП сделал ссылку на формы «Присоединиться сейчас» по адресу vark.com, которые имеют несколько иной эффект... Тем не менее, в то время как эффект на vark .com довольно хорош, я бы, вероятно, согласился на заполнитель HTML5. - person Daniel Vassallo; 14.02.2010
comment
Ах, да, я вижу — текст исчезает в фокусе и исчезает, когда пользователь действительно что-то вводит. Это мило. (Конечно, Firefox и другие могут в конечном итоге реализовать такой текст-заполнитель.) - person Paul D. Waite; 14.02.2010
comment
Это определенно правильный путь. Используйте будущий вариант placeholder с запасным вариантом JavaScript. - person Sprintstar; 30.03.2012

Поле ввода не может одновременно содержать как текст по умолчанию, так и текст, введенный пользователем. Единственный возможный способ добиться именно того, что вы просите, — это иметь фоновое изображение в полях ввода с изображением, содержащим текст по умолчанию, который вы хотели отобразить, но я настоятельно не рекомендую это как два слоя текст будет очень запутанным для пользователя. Самый распространенный способ добиться этого (и то, что делается на вашем примере сайта vark.com) — использовать фокус метод очистки текста:

$('#my_input').focus(function() {
  if($(this).val() == 'default text') {
    $(this).val('');
  }
});

Чтобы добиться этого так, как это делает StackOverflow (и форма регистрации Vark.com), вы можете использовать тот же метод с keydown< /а> событие:

$('#my_input').keydown(function() {
  if($(this).val() == 'default text') {
    $(this).val('');
  }
});

Чтобы добиться изменения цвета при фокусировке и четкости текста при нажатии клавиши, это будет:

// set text to grey on focus
$('#my_input').focus(function() {
  if($(this).val() == 'default text') {
    $(this).css('color', '#999999');
  }
});

// set text to black and clear default value on key press
$('#my_input').keydown(function() {
  if($(this).val() == 'default text') {
    $(this).val('');
    $(this).css('color', '#000000');
  }
});
person nortron    schedule 14.02.2010
comment
@Cryo: я думаю, что ОП имел тот же эффект, что и формы в Присоединяйтесь сейчас! на vark.com. Я не думаю, что цель состоит в том, чтобы накладывать текст. - person Daniel Vassallo; 14.02.2010

В ответ на сообщение @Paul я заметил, что поведение заполнителя HTML5 странно действует на моем эмуляторе Android. Заполнитель выглядит великолепно, пока вы не щелкнете по нему, и он не станет черным, если курсор справа от слова. Конечно, если вы наберете, он исчезнет, ​​но это не интуитивно понятно. Поэтому я написал jQuery, чтобы исправить это (где мой значок HTML5/jQuery?)

$(document).ready(function() {
    $('input[placeholder]').focus(function() {
        if (!$(this).val()) $(this).val('');
    });
});
person jedmao    schedule 17.07.2010

Я написал этот пример, который за неимением лучшего названия назвал постоянным заполнители.

Это требует немного большей разметки, div, обертывающей label и input, но это решает множество других проблем (например, заполнители, попадающие в ваши данные формы, или неработающие поля пароля), и реальная разметка очень проста для чтения. В итоге вы получите что-то вроде этого:

<div class="input-wrapper">
    <label for="id_username">Username</label>
    <input id="id_username" type="text" name="username">
</div>

и после включения CSS и JS он просто работает.

person MrColes    schedule 14.11.2011