HTML5 placeholder znika na ostrości

Czy istnieje darmowa wtyczka jQuery, która zmienia placeholder zachowanie, aby pasowało do specyfikacji HTML5?

Przed Skupieniem
chrome unfocused placeholder

On Focus Good (Safari)
safari focused placeholder

Na Focusie Źle (Chrome, Firefox)
chrome focused placeholder

Możesz to, co robi twoja przeglądarka za pomocą tego prostego skrzypka .

HTML5 draft spec mówi :

Agenci użytkownika powinni przedstawić tę podpowiedź użytkownikowi, po usunięciu przerw linii z to, gdy wartością elementu jest pusty łańcuch i/lub, kontrolka nie jest skupiona (np. wyświetlając ją wewnątrz pustej kontrolki i ukrywając ją w przeciwnym razie).

"/ lub " jest nowy w bieżącym projekcie, więc przypuszczam, że dlatego Chrome i Firefox nie obsługują go jeszcze. Zobacz WebKit bug #73629, Chromium bug #103025.

Author: Dan Abramov, 2011-12-20

6 answers

Stefano labels

Stefano J. Attardi napisał ładną wtyczkę jQuery, która po prostu to robi.
Jest bardziej stabilny niż Robert, a także zanika do jaśniejszego szarego, gdy Pole się koncentruje.


Zmodyfikowałem jego wtyczkę, aby odczytała atrybut placeholder w przeciwieństwie do ręcznego tworzenia span.
ten skrzypek ma kompletną kod:

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's 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; }
}
 15
Author: Dan Abramov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 15:59:39

Robert Nyman omawia problem i dokumentuje swoje podejście na swoim blogu .
Ten skrzypek , który ma wszystkie niezbędne HTML, CSS i JS.

Tutaj wpisz opis obrazka

Niestety, rozwiązuje problem zmieniając value.
Nie będzie to działać z definicji, jeśli placeholder Tekst jest poprawnym wejściem.

 4
Author: Dan Abramov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-20 11:18:57

Znalazłem to pytanie, wyszukując rozwiązanie tego samego problemu. Wygląda na to, że istniejące wtyczki albo nie działają w starszych przeglądarkach, albo ukrywają symbol zastępczy na Focusie.

Więc zdecydowałem się na własne rozwiązanie, próbując połączyć najlepsze części z istniejących wtyczek.

Możesz sprawdzić tutaj i otworzyć problem, jeśli napotkasz jakiekolwiek problemy.

 3
Author: Andrey Kuzmin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-31 17:44:15

A może coś prostego? Po ustawieniu ostrości zapisz wartość atrybutu zastępczego i usuń atrybut całkowicie; po rozmyciu umieść atrybut z powrotem:

$('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'));
});   
 2
Author: Logan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-01 23:34:50

Napisałem własne rozwiązanie css3. Sprawdź, czy to spełni wszystkie twoje potrzeby.

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

To jest moje rozwiązanie:

  1. element wejściowy jest ustawiony na "required"
  2. dodatkowy element span dla elementu zastępczego jest potrzebny. Ten element jest przesuwany na wierzch elementu wejściowego (position: absolute;)
  3. w selektorach css element wejściowy jest sprawdzany pod kątem poprawności (wymagane pola są nieprawidłowe, o ile nie ma input), a następnie symbol zastępczy jest ukryty.

Pitfall: symbol zastępczy blokuje mouseevents na wejściu! Ten problem można obejść, ukrywając Element Zastępczy, gdy mysz znajduje się wewnątrz elementu nadrzędnego (wrappera).

<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;
}
 1
Author: Fabian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-19 11:04:33

Może spróbujesz użyć Float Label Pattern:)

Zobacz etykiety Float w CSS

 0
Author: herchila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-31 17:46:03