138

I am doing a phonegap app. When I am trying type="date" input field as shown below, it shows date picker in iPhone as I expected but it doesn't show the placeholder I have given. I found the same issue here in SO, but no solution anywhere.

 <input placeholder="Date" class="textbox-n" type="date" id="date">
demongolem
  • 8,796
  • 36
  • 82
  • 101
Mumthezir VP
  • 5,359
  • 5
  • 24
  • 54
  • http://stackoverflow.com/a/23683687/1783439 worked for me – nu everest Feb 25 '17 at 05:30
  • 1
    Possible duplicate of [placeholder for input type date html5](http://stackoverflow.com/questions/30961704/placeholder-for-input-type-date-html5) – Elyor May 14 '17 at 08:16

32 Answers32

199

It may not be appropriate... but it helped me.

<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" id="date">
j08691
  • 190,436
  • 28
  • 232
  • 252
Mumthezir VP
  • 5,359
  • 5
  • 24
  • 54
  • 8
    Seems like a nice feature, however clicking the field shows the onscreen keyboard instead of the datepicker. Nice try though. – Mathijs Segers Jan 17 '14 at 16:16
  • I tried that solution (using AngularJs in a template for directive) but got JavaScript errors in IE 11 – Naomi Aug 14 '14 at 03:36
  • 2
    @MathijsSegers have you found a solution that NOT shows the keyboard? I tried this solutions here, but in iOS 6, 7 and 8, shows the keyboard for a little time and then shows the datepicker. – Jabel Márquez Oct 02 '14 at 03:04
  • 7
    Well yes a disgusting one. I added a span with the looks of a textfield at the datefield rendering it visible only on ios. The z index of the datepicker was higher than the span but alpha 0.01 in css. Onclick i'd reveal the datefield. It works but is kinda nasty. – Mathijs Segers Oct 02 '14 at 06:18
  • 1
    IE doesn't like or (at least pre IE11) even allow changing the type of an element once created. You'd be better off hiding/showing two different ones that you swap out. – Dtipson Jun 03 '16 at 19:39
  • 5
    I have noticed that this does not work on iOS devices, does someone have a solution for this? – Mikkel Fennefoss Mar 31 '17 at 12:00
  • 3
    For cordova apps, use **onmouseenter** event instead of **onfocus** event, then, the date picker will open at the first click – m e Jun 21 '18 at 12:37
  • To stop the keyboard from showing on iOS use readonly="true" and then remove it onfocus. For more details see ma90's answer below: https://stackoverflow.com/a/25660848/2126792 – pschueller Aug 30 '18 at 23:09
112

If you use mvp's method but add the onblur event to change it back to a text field so the placeholder text appears again when the input field looses focus. It just makes the hack a little bit nicer.

<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" onblur="(this.type='text')" id="date" />

Hope this helps.

A. Meshu
  • 3,326
  • 2
  • 15
  • 29
jbarlow
  • 1,125
  • 1
  • 7
  • 5
  • 1
    Thanks! This worked perfectly for me! Might I suggest making the field disabled, and then removing the disable on click? I was working in Angular, and wrote a scope function to change the type, and remove the disable, itll stop weird bugs when it somehow focuses on the text field – Torch2424 Oct 24 '15 at 00:52
  • 5
    I am able to see the placeholder when it is out of focus, but to get the date picker, I need to click on it twice. How can I solve it? – Suraj Mar 22 '17 at 09:56
  • 2
    The format of the date changes as it changes between type date/text. And, doesn't work on iOS devices. – Sam Rueby Dec 20 '19 at 15:12
  • 1
    It's 2020 and we still need to use js for this... Wonder what is the problem in this `type="date"` placeholder and why it is not acting like the rest... – A. Meshu Jan 29 '20 at 12:31
  • I've improved the onblur part, to only switch back to text, when the value remains empty: `onblur="if(this.value==''){this.type='text'}"` – Armin May 03 '21 at 17:56
38

I ended up using the following.

Regarding Firefox comment(s): Generally, Firefox will not show any text placeholder for inputs type date. But as this is a Cordova/PhoneGap question this should be of no concern (Unless you want to develop against FirefoxOS).

input[type="date"]:not(.has-value):before{
  color: lightgray;
  content: attr(placeholder);
}
<input type="date" placeholder="MY PLACEHOLDER" onchange="this.className=(this.value!=''?'has-value':'')">
fentas
  • 861
  • 9
  • 13
  • 3
    This version doesn't mess with other classes `` – null Sep 19 '19 at 12:28
  • i used this and addedd `input[type="date"]:not(:focus):not(.has-value):before` to show the format while the input is focused (for people who type the date instead of selecting) – Marco somefox Apr 30 '20 at 14:05
20

I used this in my css:

input[type="date"]:before{
    color:lightgray;
    content:attr(placeholder);
}

input[type="date"].full:before {
    color:black;
    content:""!important;
}

and put somenthing like this into javascript:

$("#myel").on("input",function(){
    if($(this).val().length>0){
    $(this).addClass("full");
}
else{
   $(this).removeClass("full");
   }
 });

it works for me for mobile devices (Ios8 and android). But I used jquery inputmask for desktop with input text type. This solution it's a nice way if your code run on ie8.

  • Excellent! Just have to set the initial state of the "full" class, e.g. if you're editing an existing date. – bjnord Feb 14 '16 at 02:28
  • I suggest that we should use `color: #aaa` for a placeholder-like appearance on iOS. `color: lightgray` is just too light. – Rockallite Aug 19 '16 at 02:34
  • Great answer! You code make the jQuery a bit more readible using toggleClass: ```$("#myel").on( "input" , function(){ $(this).toggleClass( "full" , $(this).val().length > 0 ); });``` – Mike Apr 03 '17 at 16:16
  • Keep in mind that Firefox (and Edge?) does not support :before and :after on elements. Chrome does, but this goes against the CSS spec. – nicbou Sep 22 '20 at 10:56
19

As of today (2016), I have successfully used those 2 snippets (plus they work great with Bootstrap4).

Input data on the left, placeholder on the left

input[type=date] {
  text-align: right;
}

input[type="date"]:before {
  color: lightgrey;
  content: attr(placeholder) !important;
  margin-right: 0.5em;
}

Placeholder disappear when clicking

input[type="date"]:before {
  color: lightgrey;
  content: attr(placeholder) !important;
  margin-right: 0.5em;
}
input[type="date"]:focus:before {
  content: '' !important;
}
romaricdrigon
  • 1,287
  • 7
  • 16
12

I took jbarlow idea, but I added an if in the onblur function so the fields only change its type if the value is empty

<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" onblur="(this.value == '' ? this.type='text' : this.type='date')" id="date">
Franco Dipré
  • 161
  • 1
  • 7
11

According to the HTML standard:

The following content attributes must not be specified and do not apply to the element: accept, alt, checked, dirname, formaction, formenctype, formmethod, formnovalidate, formtarget, height, inputmode, maxlength, minlength, multiple, pattern, placeholder, size, src, and width.

int32_t
  • 4,778
  • 1
  • 19
  • 16
10

It works for me:

input[type='date']:after {
  content: attr(placeholder)
}
Valentin Podkamennyi
  • 6,457
  • 4
  • 24
  • 41
deadproxor
  • 101
  • 1
  • 5
  • 3
    Only problem with this is removing the placeholder when you've selected a date. The place holder doesn't get removed. – egr103 Feb 23 '15 at 16:47
  • On iOS 9.3, Safari will make the `:after` pseudo element disappear when a date is selected. So no need to remove the placeholder – Rockallite Aug 19 '16 at 02:29
  • 2
    Just add `onfocus="(this.placeholder='')"` to remove the placeholder once the date is selected. – cyclic Jan 25 '17 at 16:46
  • Excellent!!! Worked for me too, adding the onfocus that @RobbieNolan has suggested worked perfecly. – Bruno De Faria Aug 08 '19 at 13:10
10

I used this whit jQuery: http://jsfiddle.net/daviderussoabram/65w1qhLz/

$('input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"]').each(function() {
    var el = this, type = $(el).attr('type');
    if ($(el).val() == '') $(el).attr('type', 'text');
    $(el).focus(function() {
        $(el).attr('type', type);
        el.click();
    });
    $(el).blur(function() {
        if ($(el).val() == '') $(el).attr('type', 'text');
    });
});
9

Based on deadproxor and Alessio answers, I would try only using CSS:

input[type="date"]::before{
    color: #999;
    content: attr(placeholder) ": ";
}
input[type="date"]:focus::before {
    content: "" !important;
}

And if you need to make the placeholder invisible after writing something in the input, we could try using the :valid and :invalid selectors, if your input is a required one.

EDIT

Here the code if you are using required in your input:

input[type="date"]::before {
 color: #999999;
 content: attr(placeholder);
}
input[type="date"] {
 color: #ffffff;
}
input[type="date"]:focus,
input[type="date"]:valid {
 color: #666666;
}
input[type="date"]:focus::before,
input[type="date"]:valid::before {
 content: "" !important;
}
<input type="date" placeholder="Date" required>
Yuri
  • 184
  • 1
  • 2
  • 6
9

Found a better way to solve your problem. I think this will help you. when focused out, the box will change type into text so it will show your placeholder. when focused in, its type changes into date so the calendar view will be shown.

<input placeholder="Date" class="textbox-n" type="text" onfocusin="(this.type='date')" onfocusout="(this.type='text')"  id="date"> 
Bang Fady
  • 123
  • 2
  • 13
Kawaldeep Singh
  • 119
  • 1
  • 8
3

Adressing the problem in the current correct answer "clicking the field shows the onscreen keyboard instead of the datepicker":

The problem is caused by the Browser behaving according to the type of input when clicking (=text). Therefore it is necessary to stop from focussing on the input element (blur) and then restart focus programmatically on the input element which was defined as type=date by JS in the first step. Keyboard displays in phonenumber-mode.

<input placeholder="Date" type="text" onfocus="this.type='date';
                      this.setAttribute('onfocus','');this.blur();this.focus();">
Aleksandr M
  • 23,647
  • 12
  • 63
  • 129
ma90
  • 31
  • 1
  • Even with this code, in iOS (tested on iOS 6, 7 and 8) shows the keyboard for a moment and then shows the datepicker. There is a way to NOT show the keyboard? – Jabel Márquez Oct 02 '14 at 03:01
  • @JabelMárquez You can use readonly="true" to stop the keyboard from showing... so something like this: . Has worked for me. – pschueller Aug 30 '18 at 23:05
3

try my solution. I use 'required' attribute to get know whether input is filled and if not I show the text from attribute 'placeholder'

//HTML
<input required placeholder="Date" class="textbox-n" type="date" id="date">

//CSS
input[type="date"]:not(:valid):before {
   content: attr(placeholder);
   // style it like it real placeholder
}
Roman Yakoviv
  • 1,226
  • 11
  • 17
2

Took me a while figuring this one out, leave it as type="text", and add onfocus="(this.type='date')", just as shown above.

I even like the onBlur idea mentioned above

<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" onblur="(this.type='text')" id="date">

Hope this helps anyone who didn't quite gather whats going on above

Jabel Márquez
  • 762
  • 1
  • 11
  • 36
Dally S
  • 589
  • 7
  • 11
2

Expanding on @mvp's solution with unobtrusive javascript in mind, here's the approach:

HTML:

<input type="text" placeholder="Date" class="js-text-date-toggle">

Javascript:

$('.js-text-date-toggle').on('focus', function() {
  $(this).attr('type', 'date') }
).on('blur', function() {
  $(this).attr('type'), 'text') }
)
poweratom
  • 1,835
  • 19
  • 23
2

To summarize the date inputs problem:

  • You have to display them (i.e. avoid display:none) otherwise the input UI will not be triggered ;
  • a placeholder is contradictory with them (as per the spec, and because they have to display a specific UI) ;
  • converting them to another input type for the unfocused time do allows placeholders, but focus then triggers the wrong input UI (keyboard), at least for a small time, because focus events cannot be cancelled.
  • inserting (before) or adding (after) content doesn't prevent the date input value to be displayed.

The solution I found to meet those requirements is to use the usual trick to style native form elements : ensure the element is displayed but not visible, and display its expected style through its associated label. Typically, the label will display as the input (including a placeholder), but over it.

So, an HTML like:

<div class="date-input>
  <input id="myInput" type="date"> 
  <label for="myInput"> 
    <span class="place-holder">Enter a date</span> 
  </label>
</div>

Could be styled as:

.date-input {
  display: inline-block;
  position: relative;
}
/* Fields overriding */
input[type=date] + label {
  position: absolute;  /* Same origin as the input, to display over it */
  background: white;   /* Opaque background to hide the input behind */
  left: 0;             /* Start at same x coordinate */
}

/* Common input styling */
input[type=date], label {  
  /* Must share same size to display properly (focus, etc.) */
  width: 15em;
  height: 1em;
  font-size: 1em;
}

Any event (click, focus) on such an associated label will be reflected on the field itself, and so trigger the date input UI.

Should you want to test such a solution live, you can run this Angular version from your tablet or mobile.

Javarome
  • 8,229
  • 5
  • 42
  • 39
2

SO what i have decided to do finally is here and its working fine on all mobile browsers including iPhones and Androids.

$(document).ready(function(){

  $('input[type="date"]').each(function(e) {
    var $el = $(this), 
        $this_placeholder = $(this).closest('label').find('.custom-placeholder');
    $el.on('change',function(){
      if($el.val()){
        $this_placeholder.text('');
      }else {
        $this_placeholder.text($el.attr('placeholder'));
      }
    });
  });
  
});
label {
  position: relative;  
}
.custom-placeholder {
    #font > .proxima-nova-light(26px,40px);
    position: absolute;
    top: 0;
    left: 0;
    z-index: 10;
    color: #999;
}
<label>
  <input type="date" placeholder="Date">
  <span class="custom-placeholder">Date</span>
</label>

Date

NISHANK KUMAR
  • 181
  • 1
  • 5
2

Im working with ionicframework and solution provided by @Mumthezir is almost perfect. In case if somebody would have same problem as me(after change, input is still focused and when scrolling, value simply dissapears) So I added onchange to make input.blur()

<input placeholder="Date" class="textbox-n" type="text" onfocus=" (this.type='date')" onchange="this.blur();"  id="date"> 
sonic
  • 1,011
  • 8
  • 17
2

You can

  1. set it as type text
  2. convert to date on focus
  3. make click on it
  4. ...let user check date
  5. on change store the value
  6. set input to type text
  7. set text type input value to the stored value

like this...

$("#dateplaceholder").change(function(evt) {
  var date = new Date($("#dateplaceholder").val());
  $("#dateplaceholder").attr("type", "text");
  $("#dateplaceholder").val(date.getDate() + "/" + (date.getMonth() + 1) + "/" + date.getFullYear());
});
$("#dateplaceholder").focus(function(evt) {
  $("#dateplaceholder").attr("type", "date");
  setTimeout('$("#dateplaceholder").click();', 500);
});
$("#dateplaceholder").attr("type", "text");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<input type="date" id="dateplaceholder" placeholder="Set the date" />
jlbofh
  • 371
  • 3
  • 6
2

Found a better way to handle user basic comprehension with mouseover and opening datepicker on click :

<input type="text" onfocus="(this.type='date')" onmouseover="(this.type = 'date')" onblur="(this.value ? this.type = 'date' : this.type = 'text')" id="date_start" placeholder="Date">

Also hide webkit arrow and make it 100% wide to cover the click :

input[type="date"] {
    position: relative;
}
input[type="date"]::-webkit-calendar-picker-indicator {
  position: absolute;
  height: 100%;
  width: 100%;
  opacity: 0;
  left: 0;
  right: 0;
  top:0;
  bottom: 0;
}
Matt Loye
  • 1,241
  • 2
  • 11
  • 14
1

I think all you have to do is change the model to say the date field is nullable and then put [Required] on it if it is required. If you do this the placeholder text does appear.

1

Hey so I ran into the same issue last night and figured out a combination of all of your answer and some sparkling magic are doing a good job:

The HTML:

<input type="date"  name="flb5" placeholder="Datum"     class="datePickerPlaceHolder"/>

The CSS:

@media(max-width: 1024px) {
   input.datePickerPlaceHolder:before {
      color: #A5A5A5; //here you have to match the placeholder color of other inputs
      content: attr(placeholder) !important;
   }
}

The jQuery:

$(document).ready(function() {
    $('input[type="date"]').change(function(){
            if($(this).val().length < 1) {
                $(this).addClass('datePickerPlaceHolder');
            } else {
                $(this).removeClass('datePickerPlaceHolder');
            }
    });
});

Explanation: So, what is happening here, first of all in the HTML, this is pretty straight forward just doing a basic HMTL5-date-input and set a placeholder. Next stop: CSS, we are setting a :before-pseudo-element to fake our placeholder, it just takes the placeholder's attribute from the input itself. I made this only available down from a viewport width of 1024px - why im going to tell later. And now the jQuery, after refactoring a couple of times I came up with this bit of code which will check on every change if there is a value set or not, if its not it will (re-)add the class, vice-versa.

KNOW ISSUES:

  • there is a problem in chrome with its default date-picker, thats what the media-query is for. It will add the placeholder infront of the default 'dd.mm.yyyy'-thing. You could also set the placeholder of the date-input to 'date: ' and adjust the color incase of no value inside the input...for me this resulted in some other smaller issues so i went with just not showing it on 'bigger' screens

hope that helps! cheerio!

1

From Angular point of view I managed to put a placeholder in input type date element.

First of all I defined the following css:

.placeholder {
    color: $text-grey;
  }

  input[type='date']::before {
    content: attr(placeholder);
  }

  input::-webkit-input-placeholder {
    color: $text-grey;
  }

The reason why this is neccessary is that if css3 content has different color that the normal placeholder, so I had to use a common one.

<input #birthDate
         class="birthDate placeholder"
         type="date"
         formControlName="birthDate"
         placeholder="{{getBirthDatePlaceholder() | translate}}"
         [class.error]="!onboardingForm.controls.birthDate.valid && onboardingForm.controls.birthDate.dirty"
         autocomplete="off"
         >

Then in the template used a viewchild birthDate attribute, to be able to access this input from the component. And defined an angular expression on the placeholder attribute, which will decide if we show the placeholder or not. This is the major drawback of the solution, is that you have to manage the visibility of the placeholder.

@ViewChild('birthDate') birthDate;

getBirthDatePlaceholder() {
  if (!this.birthDate) {
    return;
  } else {
    return this.birthDate.nativeElement.value === '' ?
    'ONBOARDING_FORM_COMPONENT.HINT_BIRTH_DATE' :
    '';
  }
}
xyztdanid4
  • 133
  • 4
  • 8
1

<input placeholder="Date" type="text" onMouseOver="(this.type='date')" onMouseOut="(this.type='text')"  id="date" class="form-control">

Revised code of mumthezir

Rae Ian
  • 1,087
  • 5
  • 20
1

If you're only concerned with mobile:

input[type="date"]:invalid:before{
    color: rgb(117, 117, 117);
    content: attr(placeholder);
}
A2D
  • 300
  • 2
  • 6
1

I'm surprised there's only one answer with an approach similar to the one I used.
I got the inspiration from @Dtipson's comment on @Mumthezir VP's answer.

I use two inputs for this, one is a fake input with type="text" on which I set the placeholder, the other one is the real field with type="date".
On the mouseenter event on their container, I hide the fake input and show the real one, and I do the opposite on the mouseleave event. Obviously, I leave the real input visibile if it has a value set on it.
I wrote the code to use pure Javascript but if you use jQuery (I do) it's very easy to "convert" it.

// "isMobile" function taken from this reply:
// https://stackoverflow.com/a/20293441/3514976
function isMobile() {
  try { document.createEvent("TouchEvent"); return true; }
  catch(e) { return false; }
}

var deviceIsMobile = isMobile();

function mouseEnterListener(event) {
  var realDate = this.querySelector('.real-date');
  // if it has a value it's already visible.
  if(!realDate.value) {
    this.querySelector('.fake-date').style.display = 'none';
    realDate.style.display = 'block';
  }
}

function mouseLeaveListener(event) {
  var realDate = this.querySelector('.real-date');
  // hide it if it doesn't have focus (except
  // on mobile devices) and has no value.
  if((deviceIsMobile || document.activeElement !== realDate) && !realDate.value) {
    realDate.style.display = 'none';
    this.querySelector('.fake-date').style.display = 'block';
  }
}

function fakeFieldActionListener(event) {
  event.preventDefault();
  this.parentElement.dispatchEvent(new Event('mouseenter'));
  var realDate = this.parentElement.querySelector('.real-date');
  // to open the datepicker on mobile devices
  // I need to focus and then click on the field.
  realDate.focus();
  realDate.click();
}

var containers = document.getElementsByClassName('date-container');
for(var i = 0; i < containers.length; ++i) {
  var container = containers[i];
  
  container.addEventListener('mouseenter', mouseEnterListener);
  container.addEventListener('mouseleave', mouseLeaveListener);
  
  var fakeDate = container.querySelector('.fake-date');
  // for mobile devices, clicking (tapping)
  // on the fake input must show the real one.
  fakeDate.addEventListener('click', fakeFieldActionListener);
  // let's also listen to the "focus" event
  // in case it's selected using a keyboard.
  fakeDate.addEventListener('focus', fakeFieldActionListener);
  
  var realDate = container.querySelector('.real-date');
  // trigger the "mouseleave" event on the
  // container when the value changes.
  realDate.addEventListener('change', function() {
    container.dispatchEvent(new Event('mouseleave'));
  });
  // also trigger the "mouseleave" event on
  // the container when the input loses focus.
  realDate.addEventListener('blur', function() {
    container.dispatchEvent(new Event('mouseleave'));
  });
}
.real-date {
  display: none;
}

/* a simple example of css to make 
them look like it's the same element */
.real-date, 
.fake-date {
  width: 200px;
  height: 20px;
  padding: 0px;
}
<div class="date-container">
  <input type="text" class="fake-date" placeholder="Insert date">
  <input type="date" class="real-date">
</div>

I tested this also on an Android phone and it works, when the user taps on the field the datepicker is shown. The only thing is, if the real input had no value and the user closes the datepicker without choosing a date, the input will remain visible until they tap outside of it. There's no event to listen to to know when the datepicker closes so I don't know how to solve that.

I don't have an iOS device to test it on.

nonzaprej
  • 1,108
  • 2
  • 16
  • 28
0

HTML:

<div>
    <input class="ui-btn ui-btn-icon-right ui-corner-all ui-icon-calendar ui-shadow" id="inputDate" type="date"/>
    <h3 id="placeholder-inputDate">Date Text</h3>
</div>

JavaScript:

$('#inputDate').ready(function () {
$('#placeholder-inputDate').attr('style'
    , 'top: ' + ($('#placeholder-inputDate').parent().position().top + 10)
    + 'px; left: ' + ($('#placeholder-inputDate').parent().position().left + 0) + 'px; position: absolute;');
$('#inputDate').attr('style'
    , 'width: ' + ($('#placeholder-inputDate').width() + 32) + 'px;');
});
GWigWam
  • 1,600
  • 3
  • 27
  • 29
Or Choban
  • 1,519
  • 1
  • 5
  • 8
  • Posting code without any explanation isn't welcome here. Please edit your post. – Cid Jun 20 '18 at 08:56
0

Here is another possible hack not using js and still using css content. Note that as :after is not supported on some browser for inputs, we need to select the input in another way, same for content attr('')

input[type=date]:invalid+span:after {
  content:"Birthday";
  position:absolute;
  left:0;
  top:0;
}

input[type=date]:focus:invalid+span:after {
  display:none;
}

input:not(:focus):invalid {
  color:transparent;
}

label.wrapper {
 position:relative;
}
<label class="wrapper">
 <input
    type="date"
     required="required" 
 />
 <span></span>
</label>
Flavien Volken
  • 14,820
  • 9
  • 78
  • 105
0

This works for me using this as input element:

<input name="birthdate" class="" class="wpcf7-form-control wpcf7-date 
 wpcf7-validates-as-required wpcf7-validates-as-date birthdate" value="" 
 aria-required="true" aria-invalid="false" placeholder="birthdate *" 
 type="date">

This CSS shows a permanent placeholder. The selected value is shown after the placeholder.

input[type="date"]:before {
    content: attr(placeholder) !important;
    margin-right: 0.5em;
    display: block;
}
/* only for FF */
@-moz-document url-prefix() {
    input[type="date"]:before {
        content: attr(placeholder) !important;
        margin-right: 0.5em;
        display: block;
        position: absolute;
        left: 200px; /* please adopt */
    }
}

I use this solution for a Wordpress form with contact-form-7 plugin.

phlegx
  • 2,132
  • 2
  • 29
  • 36
0

None of the solutions were working correctly for me on Chrome in iOS 12 and most of them are not tailored to cope with possible multiple date inputs on a page. I did the following, which basically creates a fake label over the date input and removes it on tap. I am also removing the fake label if viewport width is beyond 992px.

JS:

function addMobileDatePlaceholder() {
    if (window.matchMedia("(min-width: 992px)").matches) {
        $('input[type="date"]').next("span.date-label").remove();
        return false;
    }

    $('input[type="date"]').after('<span class="date-label" />');

    $('span.date-label').each(function() {
        var $placeholderText = $(this).prev('input[type="date"]').attr('placeholder');
        $(this).text($placeholderText);
    });

    $('input[type="date"]').on("click", function() {
        $(this).next("span.date-label").remove();
    });
}

CSS:

@media (max-width: 991px) {
    input[type="date"] {
        padding-left: calc(50% - 45px);
    }

    span.date-label {
        pointer-events: none;
        position: absolute;
        top: 2px;
        left: 50%;
        transform: translateX(-50%);
        text-align: center;
        height: 27px;
        width: 70%;
        padding-top: 5px;
    }
}
-1

Extension of Mumthezir's version that works better on iOS, based on Mathijs Segers' comment:

(Uses some AngularJS but hopefully you get the idea.)

<label style='position:relative'>
    <input type="date" 
           name="dateField" 
           onfocus="(this.type='date')"
           ng-focus="dateFocus=true" ng-blur="dateFocus=false" />
    <span ng-if='!dateFocus && !form.date' class='date-placeholder'>
        Enter date
    </span>
</label>

Because it's all wrapped in a label, clicking the span automatically focuses the input.

CSS:

.date-placeholder {
    display: inline-block;
    position: absolute;
    text-align: left;
    color: #aaa;
    background-color: white;
    cursor: text;
    /* Customize this stuff based on your styles */
    top: 4px;
    left: 4px;
    right: 4px;
    bottom: 4px;
    line-height: 32px;
    padding-left: 12px;
}
Dunc
  • 16,506
  • 6
  • 74
  • 95
-3

You could use the "value" attribute, for example:

<input type="date" value="Date" class="textbox-n" id="date"/>
Pang
  • 8,605
  • 144
  • 77
  • 113
JuliaB1010
  • 11
  • 2
  • 5
    This is not correct. The value should have a format 'YYYY-MM-dd'. Otherwise, the value won't be displayed with warning message: The specified value 'Date' does not conform to the required format, 'yyyy-MM-dd'. – Ryan Rho Jan 01 '15 at 00:39