Mobile/tablet date input are not designed to display a placeholder. Here is a workaround.
A Pen by Jérôme Beau on CodePen.
| <body ng-app="dateApp"> | |
| <p>Touch-enabled devices (and Chrome) support <code><input type="date"></code> <a target="_blank" href="https://stackoverflow.com/questions/20321202/not-showing-placeholder-for-input-type-date-field/30442790#30442790">but the relevant fields UI do not allow placeholders</a>.</p> | |
| <p>Here is a date input with a placeholder:</p> | |
| <!--p> | |
| Text : <date-input id="textDate" placeholder="Enter a date" data-mode="text"></date-input> | |
| </p--> | |
| <p> | |
| Native as text : <date-input id="mobileDate" placeholder="Enter a date"></date-input> | |
| </p> | |
| <!--p> | |
| Native : <date-input id="desktopDate" placeholder="Enter a date" data-mode="native"></date-input> | |
| </p--> | |
| <p>Try it from any touch-enabled device!</p> | |
| </body> |
| class FcDateInput { | |
| constructor($element) { | |
| this.$element = $element; | |
| } | |
| $onInit() { | |
| this.id = this.$element[0].id; | |
| if (!this.mode) { | |
| this.mode = 'text'; | |
| // if (this.$element.parent().width() < 480) { | |
| this.mode = 'native-as-text'; | |
| // } | |
| } | |
| this.type = this.mode === 'text' ? 'text' : 'date'; | |
| this.dateModel = ''; | |
| } | |
| changed() { | |
| if (this.dateModel) { | |
| this.dateModel = this.dateModel.toLocaleString('en', { | |
| weekday: 'long', | |
| year: 'numeric', | |
| month: 'long', | |
| day: 'numeric' | |
| }); | |
| var date = new Date(this.dateModel); | |
| this.dateValue = this.dateModel; | |
| } else { | |
| this.dateValue = ''; | |
| } | |
| } | |
| } | |
| angular.module('dateApp', []) | |
| .component('dateInput', { | |
| bindings: { | |
| placeholder: '@?', | |
| /** | |
| * text: | |
| * native: | |
| * native-as-text: | |
| */ | |
| mode: '@' | |
| }, | |
| template: `<div class="date-input {{ctrl.mode}}"> | |
| <input class="input-field" ng-model="ctrl.dateModel" id="dateInput-{{ctrl.id}}" placeholder="{{ctrl.placeholder}}" type="{{ctrl.type}}" ng-change="ctrl.changed()"><label for="dateInput-{{ctrl.id}}" class="input-field"> | |
| <span ng-show="!ctrl.dateValue" class="place-holder">{{ctrl.placeholder}}</span> | |
| <span ng-show="ctrl.dateValue" class="value-holder">{{ctrl.dateModel}}</span> | |
| </label> | |
| </div>`, | |
| controller: FcDateInput, | |
| controllerAs: 'ctrl' | |
| }); |
| <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script> |
| .input-field { | |
| margin: 0; | |
| font-family: Arial; | |
| border-radius: 0.2em; | |
| line-height: 1.5; | |
| border: 2px inset lightgray; | |
| height: 1em; | |
| width: 15em; | |
| font-size: 1em; | |
| padding: 0.5em; | |
| } | |
| $margin: 0.5em; | |
| .date-input { | |
| display: inline-block; | |
| position: relative; | |
| &.text, | |
| &.native { | |
| input + label { | |
| display: none; | |
| } | |
| } | |
| &.native-as-text input + label { | |
| left: 0; | |
| position: absolute; | |
| background: white; | |
| line-height: 1em; | |
| .place-holder { | |
| color: #aaa; | |
| } | |
| } | |
| } | |
| output { | |
| display: block; | |
| } |
Mobile/tablet date input are not designed to display a placeholder. Here is a workaround.
A Pen by Jérôme Beau on CodePen.