Подтвердить что ты не робот

Заполнитель HTML5 исчезает в фокусе

Есть ли свободно доступный плагин jQuery, который изменяет поведение placeholder для соответствия спецификации HTML5?

Перед фокусировкой
chrome unfocused placeholder

В фокусе Good (Safari)
safari focused placeholder

В фокусе Bad (Chrome, Firefox)
chrome focused placeholder

Вы можете использовать ваш браузер с помощью этой простой скрипты.

Спецификация HTML5:

Пользовательские агенты должны представить эту подсказку пользователю после того, как он разделил на него разрывы строк, когда значение элемента представляет собой пустую строку и/или, элемент управления не сфокусирован (например, путем отображения его внутри пустым несфокусированным управлением и скрытием его в противном случае).

"/или" является новым в текущем проекте, поэтому я полагаю, что Chrome и Firefox еще не поддерживают его. См. Ошибка WebKit # 73629, Chromium bug # 103025.

4b9b3361

Ответ 1

Stefano labels

Stefano J. Attardi написал красивый плагин jQuery, который просто делает это.
Он более стабилен, чем Роберт, и также исчезает до светло-серого цвета, когда поле фокусируется.


Я изменил свой плагин, чтобы прочитать атрибут placeholder, а не вручную создать span.
Эта скрипта имеет полный код:

HTML

<input type="text" placeholder="Hello, world!">

JS

// Original code by Stefano J. Attardi, MIT license

(function($) {
    function toggleLabel() {
        var input = $(this);

        if (!input.parent().hasClass('placeholder')) {
            var label = $('<label>').addClass('placeholder');
            input.wrap(label);

            var span = $('<span>');
            span.text(input.attr('placeholder'))
            input.removeAttr('placeholder');
            span.insertBefore(input);
        }

        setTimeout(function() {
            var def = input.attr('title');
            if (!input.val() || (input.val() == def)) {
                input.prev('span').css('visibility', '');
                if (def) {
                    var dummy = $('<label></label>').text(def).css('visibility','hidden').appendTo('body');
                    input.prev('span').css('margin-left', dummy.width() + 3 + 'px');
                    dummy.remove();
                }
            } else {
                input.prev('span').css('visibility', 'hidden');
            }
        }, 0);
    };

    function resetField() {
        var def = $(this).attr('title');
        if (!$(this).val() || ($(this).val() == def)) {
            $(this).val(def);
            $(this).prev('span').css('visibility', '');
        }
    };

    var fields = $('input, textarea');

    fields.live('mouseup', toggleLabel); // needed for IE reset icon [X]
    fields.live('keydown', toggleLabel);
    fields.live('paste', toggleLabel);
    fields.live('focusin', function() {
        $(this).prev('span').css('color', '#ccc');
    });
    fields.live('focusout', function() {
        $(this).prev('span').css('color', '#999');
    });

    $(function() {
       $('input[placeholder], textarea[placeholder]').each(
           function() { toggleLabel.call(this); }
       );
    });

})(jQuery);

CSS

.placeholder {
  background: white;
  float: left;
  clear: both;
}
.placeholder span {
  position: absolute;
  padding: 5px;
  margin-left: 3px;
  color: #999;
}
.placeholder input, .placeholder textarea {
  position: relative;
  margin: 0;
  border-width: 1px;
  padding: 6px;
  background: transparent;
  font: inherit;
}

/* Hack to remove Safari extra padding. Remove if you don't care about pixel-perfection. */
@media screen and (-webkit-min-device-pixel-ratio:0) {
    .placeholder input, .placeholder textarea { padding: 4px; }
}

Ответ 2

Роберт Найман обсуждает проблему и документирует свой подход в своем блоге.
Эта скрипта, в которой есть все необходимые HTML, CSS и JS.

enter image description here

К сожалению, он решает проблему, изменяя value.
Это не будет работать по определению, если текст placeholder сам по себе является допустимым вводом.

Ответ 3

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

Итак, я решил бросить свое решение, пытаясь объединить лучшие части с существующими плагинами.

Вы можете проверить здесь и открыть проблему, если у вас возникнут какие-либо проблемы.

Ответ 4

Как насчет чего-то простого? В режиме фокуса сохраните значение атрибута placeholder и полностью удалите атрибут; на размытие, верните атрибут:

$('input[type="text"]').focus( function(){
  $(this).attr("data-placeholder",$(this).attr('placeholder')).removeAttr("placeholder");
});
$('input[type="text"]').blur( function(){
  $(this).attr("placeholder",$(this).attr('data-placeholder'));
});   

Ответ 5

Я написал собственное решение css3. Посмотрите, полностью ли это соответствует вашим потребностям.

http://codepen.io/fabiandarga/pen/MayNWm

Это мое решение:

  • для элемента ввода установлено значение "требуется"
  • необходим дополнительный элемент span для заполнителя. Этот элемент перемещается поверх входного элемента (position: absolute;)
  • с селекторами css входной элемент проверяется на достоверность (обязательные поля недопустимы, если нет ввода), а затем заполнитель скрывается.

Pitfall: Заполнитель блокирует мышиные входы! Эта проблема обходится путем скрытия элемента-заполнителя, когда мышь находится внутри родительского (обертки).

<div class="wrapper">
  <input txpe="text" autofocus="autofocus" required/>
  <span class="placeholder">Hier text</span>
</div>

.placeholder {
  display: none;
  position: absolute;
  left: 0px;
  right: 0;
  top: 0px;
  color: #A1A1A1;
}
input:invalid + .placeholder {
  display: block;  /* show the placeholder as long as the "required" field is empty */
}
.wrapper:hover .placeholder {
  display: none; /* required to guarantee the input is clickable */
}

.wrapper{
  position: relative;
  display: inline-block;
}

Ответ 6

Возможно, вы можете попробовать с помощью Float Label Pattern:)

См. Поплавки в CSS