ฉันจะซ่อนข้อความตัวยึดตำแหน่งโดยอัตโนมัติเมื่อทำการโฟกัสโดยใช้ css หรือ jquery ได้อย่างไร


213

นี้จะกระทำโดยอัตโนมัติสำหรับเบราว์เซอร์ทุกยกเว้นChrome

ฉันเดาฉันต้องกำหนดเป้าหมายเฉพาะChrome

ทางออกใด ๆ ?

ถ้าไม่ได้กับCSSแล้วด้วยjQuery ?

ขอแสดงความนับถือ.


แก้ไขการแก้ไขของฉันแล้วมันอาจช่วยได้
Toni Michel Caubet

Opera ยังเป็นเบราว์เซอร์อื่นที่ลบจุดยึดได้
ลูคัส

Firefox ตั้งแต่เวอร์ชัน 15 จะไม่ลบข้อความตัวยึดจนกว่าคุณจะเริ่มพิมพ์ ฉันเชื่อว่าอาจเป็นกรณีเดียวกันสำหรับ IE10 แต่ฉันไม่มีวิธีการยืนยัน
Rob Fletcher

1
ฉันกังวลว่าไม่มีใครพูดถึงความจริงที่ว่าคุณไม่ควรกังวลกับการปรับเปลี่ยนพฤติกรรมของเบราว์เซอร์ดั้งเดิม ฉันชอบที่ตัวยึดตำแหน่งยังคงอยู่ มันช่วยฉันในฐานะผู้ใช้ขั้นสุดท้ายและเป็นคุณลักษณะที่เบราว์เซอร์เริ่มใช้งาน ... อาจเป็นเพราะพฤติกรรมการหายตัวไปโฟกัสได้พิสูจน์แล้วว่าเป็นปัญหาการใช้งาน โปรดให้เบราว์เซอร์เป็นโปรด
Ryan Wheale

"สิ่งนี้ทำโดยอัตโนมัติสำหรับทุกเบราว์เซอร์ยกเว้น Chrome" ไม่อีกแล้ว? ฉันเพิ่งลองสิ่งนี้บน OSX ใน Firefox 37.0.2, Safari 7.1.5 และ Chrome 42.0 ไม่มีใครลบข้อความตัวยึดจนกว่าฉันจะเริ่มพิมพ์และพวกเขาทั้งหมดนำกลับมาเมื่อฉันล้างฟิลด์
นาธานลอง

คำตอบ:


261
<input 
type="text" 
placeholder="enter your text" 
onfocus="this.placeholder = ''"
onblur="this.placeholder = 'enter your text'" />

2
มันทำให้มันไป แต่เมื่อฉันคลิกออกไปจากสนามมันยังคงว่างเปล่า
LondonGuy

2
@LondonGuy: เพิ่งแก้ไขโพสต์ของฉันดูว่ามันทำงานได้ตามที่คุณต้องการ แต่โซลูชันของ Toni Michel Caubet นั้นดีกว่า
MatuDuke

9
ปัญหาที่นี่คือนี่คือจาวาสคริปต์ที่ไม่พึงประสงค์ โซลูชันของ Toni Michel Caubet นั้นดีกว่า
Silkster

ฉันชอบมัน แต่น่าเสียดายที่มันไม่ทำงานทั้ง IE และ Safari
Mohammed Moustafa


455

แก้ไข: เบราว์เซอร์ทั้งหมดรองรับทันที

input:focus::placeholder {
  color: transparent;
}
<input type="text" placeholder="Type something here!">

Firefox 15 และ IE 10+ ก็รองรับสิ่งนี้เช่นกัน หากต้องการขยายโซลูชัน CSS ของ Casey Chu :

input:focus::-webkit-input-placeholder { color:transparent; }
input:focus:-moz-placeholder { color:transparent; } /* FF 4-18 */
input:focus::-moz-placeholder { color:transparent; } /* FF 19+ */
input:focus:-ms-input-placeholder { color:transparent; } /* IE 10+ */

1
คำตอบที่ดี! ฉันไม่เห็นความรู้สึกมากนักในการละทิ้งโซลูชัน jQuery เก่าของฉันในความโปรดปรานของ HTML5 จากนั้นไปข้างหน้าและเพิ่ม JavaScript กลับมาเป็นตัวแก้ไข นี่เป็นเพียงทางออกที่ฉันกำลังมองหา
nienn

@MartinHunt คุณได้ลองสิ่งนี้ใน FF แล้วหรือยัง อินพุต: โฟกัส :: - moz-placeholder
Philip

16
ขออภัยในการขุดเธรดเก่า แต่เพื่อทำให้เสร็จสมบูรณ์มากขึ้น: อินพุต: โฟกัส: -moz-placeholder สำหรับ Firefox 18 และต่ำกว่าสำหรับ 19 เป็นต้นไปคุณจำเป็นต้องใช้: อินพุต: โฟกัส :: - moz-placeholder (หมายเหตุ ลำไส้ใหญ่คู่) Ref: css-tricks.com/snippets/css/style-placeholder-text
Peter Lewis

ความคิดเห็นนี้เป็นชัยชนะ ทำงานร่วมกับการควบคุมแบบไดนามิกเช่นเคนโด้ด้วย
reflog

1
คำตอบที่ดีจากฉัน! สำหรับพวกเราที่อาจต้องการฟังก์ชั่นนี้เมื่อปิดการใช้งานที่นี่คือรหัส CSS: / * การซ่อนข้อความตัวยึด (ถ้ามี) เมื่อปิดการใช้งานฟิลด์การถือครอง * / อินพุต: พิการ :: - webkit-input- ตัวยึดตำแหน่ง {color: transparent; } อินพุต: ปิดใช้งาน: -moz-placeholder {color: transparent; } อินพุต: ปิดใช้งาน :: - moz-placeholder {color: transparent; } อินพุต: ปิดใช้งาน: -ms-input-placeholder {color: transparent; }
Ramanagom

74

นี่เป็นวิธีแก้ปัญหา CSS เท่านั้น (สำหรับตอนนี้ใช้ได้เฉพาะใน WebKit):

input:focus::-webkit-input-placeholder {
    opacity: 0;
}

1
ฉันชอบคำตอบนี้ แต่เบราว์เซอร์ที่รองรับเพียงแค่นี้ยังไม่มี
Jerry

44

Pure CSS Solution (ไม่จำเป็นต้องใช้ JS)

สร้างจากคำตอบของ @Hexodus และ @Casey Chu นี่คือโซลูชันที่ได้รับการอัปเดตและข้ามเบราว์เซอร์ที่ใช้ความทึบของ CSS และการเปลี่ยนผ่านเพื่อทำให้ข้อความตัวยึดจางหายไป มันทำงานสำหรับองค์ประกอบใด ๆ ที่สามารถใช้ตัวยึดรวมถึงtextareaและinputแท็ก

::-webkit-input-placeholder { opacity: 1; -webkit-transition: opacity .5s; transition: opacity .5s; }  /* Chrome <=56, Safari < 10 */
:-moz-placeholder { opacity: 1; -moz-transition: opacity .5s; transition: opacity .5s; } /* FF 4-18 */
::-moz-placeholder { opacity: 1; -moz-transition: opacity .5s; transition: opacity .5s; } /* FF 19-51 */
:-ms-input-placeholder { opacity: 1; -ms-transition: opacity .5s; transition: opacity .5s; } /* IE 10+ */
::placeholder { opacity: 1; transition: opacity .5s; } /* Modern Browsers */

*:focus::-webkit-input-placeholder { opacity: 0; } /* Chrome <=56, Safari < 10 */
*:focus:-moz-placeholder { opacity: 0; } /* FF 4-18 */
*:focus::-moz-placeholder { opacity: 0; } /* FF 19-50 */
*:focus:-ms-input-placeholder { opacity: 0; } /* IE 10+ */
*:focus::placeholder { opacity: 0; } /* Modern Browsers */

แก้ไข: อัปเดตเพื่อรองรับเบราว์เซอร์ที่ทันสมัย


6
ทางออก CSS ที่ดีที่สุด!
Fatih SARI

CSS เก่าดี ... ทางออกที่ยอดเยี่ยม! ทำไมฉันไม่คิดอย่างนั้น ??
JI-Web

40

คุณลองใช้ตัวยึดตำแหน่งแล้วหรือยัง

<input id ="myID" type="text" placeholder="enter your text " />

-EDIT-

ฉันเห็นลองตอนนี้แล้ว:

$(function () {

    $('#myId').data('holder', $('#myId').attr('placeholder'));

    $('#myId').focusin(function () {
        $(this).attr('placeholder', '');
    });
    $('#myId').focusout(function () {
        $(this).attr('placeholder', $(this).data('holder'));
    });


});

ทดสอบ: http://jsfiddle.net/mPLFf/4/

-EDIT-

ที่จริงแล้วควรใช้ตัวยึดตำแหน่งเพื่ออธิบายค่าไม่ใช่ชื่อของอินพุต ฉันขอแนะนำทางเลือกดังต่อไปนี้

HTML:

<label class="overlabel"> 
    <span>First Name</span>
    <input name="first_name" type="text" />
</label>

javascript:

$('.overlabel').each(function () {
    var $this = $(this);
    var field = $this.find('[type=text], [type=file], [type=email], [type=password], textarea');
    var span = $(this).find('> span');
    var onBlur = function () {
        if ($.trim(field.val()) == '') {
            field.val('');
            span.fadeIn(100);
        } else {
            span.fadeTo(100, 0);
        }
    };
    field.focus(function () {
        span.fadeOut(100);
    }).blur(onBlur);
    onBlur();
});

CSS:

.overlabel {
  border: 0.1em solid;
  color: #aaa;
  position: relative;
  display: inline-block;
  vertical-align: middle;
  min-height: 2.2em;
}
.overlabel span {
  position: absolute;
  left: 0;
  top: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.overlabel span, .overlabel input {
  text-align: left;
  font-size: 1em;
  line-height: 2em;
  padding: 0 0.5em;
  margin: 0;
  background: transparent;
  -webkit-appearance: none; /* prevent ios styling */
  border-width: 0;
  width: 100%;
  outline: 0;
}

ทดสอบ:

http://jsfiddle.net/kwynwrcf/


ยินดีที่ได้เห็นการใช้งาน data แต่ฉันจะดู CSS ที่เทียบเท่า เมื่อแคชมันจะเป็นทางออกที่รวดเร็วและสามารถเป็นโลก ด้านบนต้องการแอตทริบิวต์ data ที่จะวางในทุกองค์ประกอบที่จำเป็น (คำตอบด้านล่าง)
Neil

1
นี่คือความซับซ้อน สามารถทำได้ด้วยรหัสน้อยกว่า
JGallardo

@JGallardo แสดงให้ฉันเห็นแสง (แต่ฉันไม่แน่ใจว่าคุณได้เห็นว่ามี 3 โซลูชั่นที่แตกต่างกัน)
Toni Michel Caubet

19

หากต้องการเพิ่ม @ คำตอบของ casey-chu และ pirate rob ต่อไปนี้เป็นวิธีการทำงานร่วมกันของเบราว์เซอร์ข้าม:

    /* WebKit browsers */
input:focus::-webkit-input-placeholder { color:transparent; }

    /* Mozilla Firefox 4 to 18 */
input:focus:-moz-placeholder { color:transparent; }

    /* Mozilla Firefox 19+ */
input:focus::-moz-placeholder { color:transparent; }

    /* Internet Explorer 10+ */
input:focus:-ms-input-placeholder { color:transparent; }

สิ่งที่ฉันเขียนตอนนี้ (แทนที่จะใช้opacity:0;) โซลูชัน CSS เดียวในชุดข้อความนี้ที่รองรับเบราว์เซอร์ที่เป็นไปได้ทั้งหมด!
ReynekeVosz

11

คำตอบของ Toni นั้นดี แต่ฉันอยากจะดรอปIDและใช้อย่างชัดเจนinputด้วยวิธีนี้อินพุตทั้งหมดที่มีplaceholderพฤติกรรม:

<input type="text" placeholder="your text" />

โปรดทราบว่า$(function(){ });เป็นการจดชวเลขสำหรับ$(document).ready(function(){ });:

$(function(){
    $('input').data('holder',$('input').attr('placeholder'));
    $('input').focusin(function(){
        $(this).attr('placeholder','');
    });
    $('input').focusout(function(){
        $(this).attr('placeholder',$(this).data('holder'));
    });
})

การสาธิต.


3
วิธีนี้ใช้ไม่ได้หากคุณมีมากกว่าหนึ่งช่อง นี่คือรหัสปรับปรุงของคุณjsfiddle.net/6CzRq/64
svlada

10

ฉันชอบทำสิ่งนี้ในพื้นที่ชื่อและเรียกใช้องค์ประกอบที่มีแอตทริบิวต์ "ตัวยึด" ...

$("[placeholder]").togglePlaceholder();

$.fn.togglePlaceholder = function() {
    return this.each(function() {
        $(this)
        .data("holder", $(this).attr("placeholder"))
        .focusin(function(){
            $(this).attr('placeholder','');
        })
        .focusout(function(){
            $(this).attr('placeholder',$(this).data('holder'));
        });
    });
};

5

บางครั้งคุณต้องการความเฉพาะเจาะจงเพื่อให้แน่ใจว่าสไตล์ของคุณจะถูกนำไปใช้กับปัจจัยที่แข็งแกร่งที่สุดidขอบคุณ @Rob Fletcher สำหรับคำตอบที่ยอดเยี่ยมของเขาใน บริษัท ของเราที่เราได้ใช้

ดังนั้นโปรดพิจารณาการเพิ่มสไตล์นำหน้าด้วย ID ของแอปคอนเทนเนอร์

    #app input:focus::-webkit-input-placeholder, #app  textarea:focus::-webkit-input-placeholder {
        color: #FFFFFF;
    }

    #app input:focus:-moz-placeholder, #app textarea:focus:-moz-placeholder {
        color: #FFFFFF;
    }


5

ด้วย CSS บริสุทธิ์มันทำงานได้สำหรับฉัน ทำให้มันโปร่งใสเมื่อป้อน / Focues ในอินพุต

 input:focus::-webkit-input-placeholder { /* Chrome/Opera/Safari */
    color: transparent !important;
 }
 input:focus::-moz-placeholder { /* Firefox 19+ */
   color: transparent !important;
 }
 input:focus:-ms-input-placeholder { /* IE 10+ */
   color: transparent !important;
 }
 input:focus:-moz-placeholder { /* Firefox 18- */
   color: transparent !important;
  }

4

หากต้องการปรับแต่งตัวอย่างโค้ดของWallace Sidhréeเพิ่มเติม:

$(function()
{  
      $('input').focusin(function()
      {
        input = $(this);
        input.data('place-holder-text', input.attr('placeholder'))
        input.attr('placeholder', '');
      });

      $('input').focusout(function()
      {
          input = $(this);
          input.attr('placeholder', input.data('place-holder-text'));
      });
})

วิธีนี้ช่วยให้มั่นใจได้ว่าอินพุตแต่ละตัวเก็บข้อความตัวแทนที่ถูกต้องไว้ในแอตทริบิวต์ข้อมูล

ดูตัวอย่างการทำงานที่นี่ใน jsFiddle


4

ฉันชอบวิธี css spiced กับการเปลี่ยน On Focus ตัวยึดนั้นหายไป;) ใช้ได้กับ textareas ด้วย

ขอบคุณ @Casey Chu สำหรับแนวคิดที่ยอดเยี่ยม

textarea::-webkit-input-placeholder, input::-webkit-input-placeholder { 
    color: #fff;
    opacity: 0.4;
    transition: opacity 0.5s;
    -webkit-transition: opacity 0.5s; 
}

textarea:focus::-webkit-input-placeholder, input:focus::-webkit-input-placeholder  { 
    opacity: 0;
}

4

การใช้ SCSS พร้อมกับhttp://bourbon.io/โซลูชันนี้ใช้งานง่ายสวยงามและใช้งานได้บนเว็บเบราว์เซอร์ทั้งหมด:

input:focus {
  @include placeholder() {
    color: transparent;
  }
}

ใช้บูร์บง! ดีสำหรับคุณ !


3

CSS ชิ้นนี้เหมาะกับฉัน:

input:focus::-webkit-input-placeholder {
        color:transparent;

}

1
นั่นเป็นวิธีที่ดีในการดำเนินการได้โดยไม่ต้อง JQuery :)
tehX

3

สำหรับโซลูชันที่ใช้ CSS บริสุทธิ์:

input:focus::-webkit-input-placeholder  {color:transparent;}
input:focus::-moz-placeholder   {color:transparent;}
input:-moz-placeholder   {color:transparent;}

หมายเหตุ: ยังไม่ได้รับการสนับสนุนจากผู้จำหน่ายเบราว์เซอร์ทั้งหมด

การอ้างอิง: ซ่อนข้อความตัวยึดที่โฟกัสด้วย CSSโดย Ilia Raiskin


2

HTML:

<input type="text" name="name" placeholder="enter your text" id="myInput" />

jQuery:

$('#myInput').focus(function(){
  $(this).attr('placeholder','');
});
$('#myInput').focusout(function(){
  $(this).attr('placeholder','enter your text');
});

1
นี่ถือว่าเป็นเพียงหนึ่งอินพุต
nym

2

2018> JQUERY v.3.3 โซลูชัน: การทำงานต่อเนื่องสำหรับอินพุตทั้งหมด, textarea พร้อมตัวยึดตำแหน่ง

 $(function(){
     $('input, textarea').on('focus', function(){
        if($(this).attr('placeholder')){
           window.oldph = $(this).attr('placeholder');
            $(this).attr('placeholder', ' ');
        };
     });

     $('input, textarea').on('blur', function(){
       if($(this).attr('placeholder')){
            $(this).attr('placeholder', window.oldph);
         };
     }); 
});

1

การสาธิตอยู่ที่นี่: jsfiddle

ลองสิ่งนี้:

//auto-hide-placeholder-text-upon-focus
if(!$.browser.webkit){
$("input").each(
        function(){
            $(this).data('holder',$(this).attr('placeholder'));
            $(this).focusin(function(){
                $(this).attr('placeholder','');
            });
            $(this).focusout(function(){
                $(this).attr('placeholder',$(this).data('holder'));
            });

        });

}

ใช้ $ ("อินพุต [ตัวยึดตำแหน่ง]") แทนเพื่อเลือกเฉพาะฟิลด์ที่มีแอตทริบิวต์ตัวยึดตำแหน่ง
Silkster

นี่เป็นคำตอบที่ดีที่สุดเรียบง่ายและไม่เลือกคนอื่นเมื่อไม่ได้
ตั้งใจ

1

สำหรับอินพุต

input:focus::-webkit-input-placeholder { color:transparent; }
input:focus:-moz-placeholder { color:transparent; }

สำหรับ textarea

textarea:focus::-webkit-input-placeholder { color:transparent; }
textarea:focus:-moz-placeholder { color:transparent; }

1
$("input[placeholder]").focusin(function () {
    $(this).data('place-holder-text', $(this).attr('placeholder')).attr('placeholder', '');
})
.focusout(function () {
    $(this).attr('placeholder', $(this).data('place-holder-text'));
});

1
$("input[placeholder]").each(function () {
    $(this).attr("data-placeholder", this.placeholder);

    $(this).bind("focus", function () {
        this.placeholder = '';
    });
    $(this).bind("blur", function () {
        this.placeholder = $(this).attr("data-placeholder");
    });
});

0

นอกจากทั้งหมดข้างต้นฉันมีสองแนวคิด

คุณสามารถเพิ่มองค์ประกอบที่เลียนแบบ palceholder จากนั้นใช้จาวาสคริปต์ควบคุมองค์ประกอบที่แสดงและซ่อน

แต่มันซับซ้อนมากอีกอันหนึ่งใช้ตัวเลือกของพี่ชายแค่นี้:

.placeholder { position: absolute; font-size: 14px; left: 40px; top: 11px; line-height: 1; pointer-events: none; }
.send-message input:focus + .placeholder { display: none; } 

23333 ฉันมีภาษาอังกฤษไม่ดีหวังว่าจะแก้ปัญหาของคุณ


โปรดตรวจสอบURLนี้ซึ่งจะมีประโยชน์ในการยกระดับคุณภาพเนื้อหาของคุณ
Willie Cheng

0

ลองใช้ฟังก์ชั่นนี้:

+ มันจะซ่อน PlaceHolder On Focus และคืนมันกลับมาพร่ามัว

+ ฟังก์ชั่นนี้ขึ้นอยู่กับตัวเลือกตัวแทนก่อนอื่นก็เลือกองค์ประกอบที่มีคุณสมบัติตัวยึดตำแหน่งเรียกใช้ฟังก์ชั่นในการมุ่งเน้นและอีกคนหนึ่งในการเบลอ

on focus: มันเพิ่มแอททริบิวต์ "data-text" ให้กับอิลิเมนต์ที่รับค่าของมันจากแอ็ตทริบิวต์ตัวยึดตำแหน่งจากนั้นมันจะลบค่าของแอททริบิวตัวยึด

บนเบลอ: มันจะส่งคืนค่าตัวยึดตำแหน่งและลบออกจากแอตทริบิวต์ data-text

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

คุณสามารถติดตามฉันได้เป็นอย่างดีถ้าคุณดูว่าเกิดอะไรขึ้นเบื้องหลังโดยการตรวจสอบองค์ประกอบอินพุต


0

สิ่งเดียวกันที่ฉันได้ใช้ในเชิงมุม 5

ฉันสร้างสตริงใหม่สำหรับเก็บตัวยึดตำแหน่ง

newPlaceholder:string;

จากนั้นฉันใช้ฟังก์ชั่นโฟกัสและเบลอที่กล่องป้อนข้อมูล (ฉันใช้การเติมข้อความอัตโนมัติที่สำคัญ)

ตัวยึดตำแหน่งด้านบนกำลังถูกตั้งค่าจาก typescript

สองฟังก์ชั่นที่ฉันใช้อยู่ -

/* Event fired on focus to textbox*/
Focus(data) {
    this.newPlaceholder = data.target.placeholder;
    this.placeholder = '';
}
/* Event fired on mouse out*/
Blur(data) {
    this.placeholder = this.newPlaceholder;
}

0

ไม่จำเป็นต้องใช้ CSS หรือ JQuery คุณสามารถทำได้ทันทีจากแท็กอินพุต HTML

ตัวอย่างเช่นในกล่องอีเมลด้านล่างข้อความตัวยึดจะหายไปหลังจากคลิกภายในและข้อความจะปรากฏขึ้นอีกครั้งหากคลิกภายนอก

<input type="email" placeholder="Type your email here..." onfocus="this.placeholder=''" onblur="this.placeholder='Type your email here...'">

-1
/* Webkit */
[placeholder]:focus::-webkit-input-placeholder { opacity: 0; }
/* Firefox < 19 */
[placeholder]:focus:-moz-placeholder { opacity: 0; }
/* Firefox > 19 */
[placeholder]:focus::-moz-placeholder { opacity: 0; }
/* Internet Explorer 10 */
[placeholder]:focus:-ms-input-placeholder { opacity: 0; }

คำตอบนี้เหมือนกับคำตอบก่อนหน้า หากคุณมีสิ่งที่จะเพิ่มหรือปรับปรุงโปรดแนะนำการแก้ไขคำตอบเดิม
JonathanDavidArndt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.