HTML5 placeholder disappears on focus

前端 未结 6 861
广开言路
广开言路 2020-11-29 01:58

Is there a freely available jQuery plugin that changes placeholder behavior to match HTML5 spec?

Before Focus

相关标签:
6条回答
  • 2020-11-29 02:07

    Robert Nyman discusses the problem and documents his approach in his blog.
    This fiddle that has all the neccessary HTML, CSS and JS.

    enter image description here

    Unfortunately, he solves the problem by changing value.
    This will not work by definition if placeholder text is itself a valid input.

    0 讨论(0)
  • 2020-11-29 02:10

    I found this question by googling out the solution to the same problem. It seems that existing plugins either don't work in elder browsers or hide placeholder on focus.

    So I decided to roll on my own solution while trying to combine best parts from existing plugins.

    You may check it out here and open an issue if you face any problems.

    0 讨论(0)
  • 2020-11-29 02:11

    I wrote my own css3 only solution. See if that fullfills all your needs.

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

    This is my solution:

    1. the input element is set to "required"
    2. an aditional span element for the placeholder is needed. This element is moved on top of the input element (position: absolute;)
    3. with css selectors the input element is tested for validity (required fields are invalid as long as there is no input) and the placeholder is then hidden.

    Pitfall: The placeholder is blocking mouseevents to the input! This problem is circumvented by hiding the placeholder element when the mouse is inside the parent (wrapper).

    <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;
    }
    
    0 讨论(0)
  • 2020-11-29 02:16

    Maybe you can try with Float Label Pattern :)

    See Float labels in CSS

    0 讨论(0)
  • 2020-11-29 02:20

    Stefano labels

    Stefano J. Attardi wrote a nice jQuery plugin that just does that.
    It is more stable than Robert's and also fades to a lighter grey when the field gets focused.

    • See the demo page
    • Grab it on GitHub
    • Play with the fiddle

    I modified his plugin to read placeholder attribute as opposed to manually creating a span.
    This fiddle has complete code:

    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; }
    }
    
    0 讨论(0)
  • 2020-11-29 02:27

    How about something simple like this? On focus save out the placeholder attribute value and remove the attribute entirely; on blur, put the attribute back:

    $('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'));
    });   
    
    0 讨论(0)
提交回复
热议问题