Не відображається заповнювач для типу введення = "дата"


120

Я роблю додаток phonegap. Коли я намагаюсь type="date"ввести поле, як показано нижче, воно відображає інструмент вибору дати в iPhone, як я очікував, але він не відображає заповнювач, який я вказав. Я знайшов ту саму проблему і тут, так, але рішення ніде не було.

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

stackoverflow.com/a/23683687/1783439 працював для мене
nu everest

Відповіді:


156

Це може не підходити ... але мені це допомогло.

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


7
Здається, це приємна функція, проте натискання поля показує екранну клавіатуру замість вибору дати. Хороша спроба, хоча.
Mathijs Segers

2
@MathijsSegers Ви знайшли рішення, яке НЕ відображає клавіатуру? Я спробував це рішення тут, але в iOS 6, 7 і 8, показує клавіатуру на невеликий час, а потім показує датчик.
Джабель Маркес

7
Ну так огидно. Я додав проміжок із виглядом текстового поля на даті, зробивши його видимим лише на ios. Індекс z відбірника дат був вищим за проміжок, але альфа 0,01 в css. Onclick я б відкрив поле дати. Це працює, але ніби неприємно.
Mathijs Segers

4
Я помітив, що це не працює на пристроях iOS, чи хтось має для цього рішення?
Міккель Феннефосс

3
Для Cordova додатків, використання OnMouseEnter випадку замість OnFocus події, а потім, вибір дати відкриється в першому натисканні
мені

88

Якщо ви використовуєте метод mvp, але додаєте подію onblur, щоб змінити його назад у текстове поле, щоб текст заповнювача знову з’явився, коли поле введення втрачає фокус. Це просто робить злому трохи приємніше.

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

Сподіваюся, це допомагає.


1
Дякую! Це прекрасно працювало для мене! Можна запропонувати зробити поле відключеним, а потім видалити відключення при натисканні? Я працював у Angular, і написав функцію області для зміни типу та видалення відключення, воно зупинить дивні помилки, коли воно якось зосередиться на текстовому полі
Torch2424,

2
Набагато краще рішення. Дякую
Profstyle

3
Я можу побачити заповнювач місця, коли він не в фокусі, але щоб отримати інструмент вибору дати, мені потрібно двічі натиснути на нього. Як я можу це вирішити?
Сурай

1
Найкраще рішення для того, що я знайшов, дуже дякую
Fran Sandi

3
приємно! дуже відповідне рішення. : DI сподіваємось, що незабаром HTML5 або HTML6 дозволять заповнити дату. Але поки що це дуже гарна робота. : D
jehzlau

35

Я закінчив, використовуючи наступне.

Стосовно коментарів Firefox : Зазвичай Firefox не відображатиме жодного текстового заповнювача для дати введення. Але оскільки це питання Cordova / PhoneGap, це не повинно викликати занепокоєння (якщо тільки ви не хочете розвиватися проти 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':'')">


1
Ця версія не <input type="date" placeholder="MY PLACEHOLDER" onchange="this.classList.toggle('has-value',this.value);">
возиться

приємна відповідь брато, ти найкращий. Я шукаю відповідь до головного болю. дякую
Роман

я використав це і додав, input[type="date"]:not(:focus):not(.has-value):beforeщоб показати формат, коли вхід зосереджений (для людей, які
вводять

20

Я використав це у своєму css:

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

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

і помістіть щось таке в JavaScript:

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

він працює для мене на мобільних пристроях (Ios8 та android). Але я використовував вхідну маску jquery для робочого столу з типом введення тексту. Це рішення - хороший спосіб, якщо ваш код працює на ie8.


Найкращий вибір тут для мене в Android! Хороший!
Заппеску

Відмінно! Просто потрібно встановити початковий стан класу "full", наприклад, якщо ви редагуєте наявну дату.
bjnord

Я пропоную використати color: #aaaдля появи на iOS зовнішній вигляд. color: lightgrayпросто занадто легкий.
Rockallite

Чудова відповідь! Ви кодуєте зробити jQuery трохи більш зрозумілим за допомогою toggleClass: $("#myel").on( "input" , function(){ $(this).toggleClass( "full" , $(this).val().length > 0 ); });
Майк

18

На сьогодні (2016) я успішно використав ці 2 фрагменти (плюс вони чудово працюють із Bootstrap4).

Введіть дані зліва, заповнення ліворуч

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

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

Заставник зникає при натисканні

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

Працює чисто і без суєти.
користувач12379095

11

Відповідно до стандарту HTML :

Наступні атрибути вмісту не повинні бути вказані та не застосовуються до елемента: accept, alt, check, dirname, formaction, formenctype, formmethod, formnovalidate, formtarget, height, inputmode, maxlength, minlength, multiple, pattern, placeholder , size, src і шир.


то що мені робити?
Mumthezir VP

2
@mvp, ви не повинні використовувати атрибут заповнювача та ставити елемент <label>, пов'язаний із входом [type = date].
int32_t

він повинен виглядати як власник місця?
Mumthezir VP

2
Мітки та заповнювачі - це дві різні речі. Я не розумію, що ти тут пропонуєш.
Адейнак

2
Це єдина правильна відповідь. +1. Цікаво, що з людьми! Щойно натрапив на це, слідуючи за цільовою обробкою, і був вражений кількістю голосів за прийняту відповідь :( Технічні характеристики чітко говорять, що слова не повинні бути вказані та не застосовуються , все ж люди хочуть ввімкнути це у свої хижі веб-програми .
Abhitalks

10

Це працює для мене:

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

3
Єдина проблема з цим - це видалення заповнення місця, коли ви вибрали дату. Власник місця не видаляється.
egr103

На iOS 9.3 Safari змусить :afterпсевдоелемент зникнути при виборі дати. Тому не потрібно видаляти заповнювач
Rockallite

2
Просто додайте, onfocus="(this.placeholder='')"щоб видалити заповнювач місця після вибору дати.
циклічний

Відмінно !!! Працював і для мене, додавши онфокус, який запропонував @RobbieNolan, працював досконало.
Бруно Де Фарія

9

Я використовував цей 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');
    });
});

будь ласка, додайте пояснення, чому це допоможе
zohar

@Davide Russo Abram: Будь ласка, додайте пояснення, як це працює?
jsduniya

9

На основі відповідей deadproxor та Alessio я б спробував лише використовувати CSS:

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

І якщо вам потрібно зробити заповнювач місця невидимим після того, як щось записали на вході, ми можемо спробувати використовувати: valid і: недійсні селектори, якщо ваш вклад потрібен.

EDIT

Ось код, якщо ви використовуєте необхідний вхід:

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>


9

Знайшов кращий спосіб вирішити свою проблему. Я думаю, що це вам допоможе. при фокусуванні вікно змінить тип тексту на текст, щоб він відображав ваш заповнювач. при зосередженні на увазі його тип змінюється в дату, тому буде показано подання календаря.

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

Ласкаво просимо до переповнення стека! Спробуйте надати приємний опис того, як працює ваше рішення. Дивіться: Як написати гарну відповідь?. Дякую
sɐunıɔ ןɐ qɐp

6

Я взяв ідею jbarlow, але додав функцію if у функції onblur, тому поля змінюють її тип лише у випадку, якщо значення порожнє

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

3

Вирішення проблеми в правильній відповіді "натискання поля показує екранну клавіатуру замість датника":

Проблема викликана тим, що браузер поводиться відповідно до типу вводу при натисканні (= текст). Тому слід зупинитись на фокусуванні на вхідному елементі (розмиття), а потім перезапустити фокус програмно на вхідний елемент, який був визначений як тип = дата JS на першому кроці. Клавіатура відображається в режимі телефонного номера.

<input placeholder="Date" type="text" onfocus="this.type='date';
                      this.setAttribute('onfocus','');this.blur();this.focus();">

Навіть з цим кодом в iOS (протестований на iOS 6, 7 і 8) на мить відображається клавіатура, а потім відображається панель вибору дати. Є спосіб НЕ показати клавіатуру?
Джабель Маркес

@ JabelMárquez Ви можете використовувати readonly = "true", щоб запобігти показу клавіатури ... приблизно так: <type type = "text" name = "date" value = "" placeholder = "Date" readonly = "true" onfocus = "this.removeAttribute ('readonly'); this.type = 'date'; this.setAttribute ('onfocus', ''); this.blur (); this.focus ();">. Працював на мене.
pschueller

3

спробуйте моє рішення. Я використовую атрибут "обов'язковий", щоб дізнатися, чи заповнений ввід, а якщо ні, я показую текст з атрибута "заповнювач"

//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
}

1
dd / mm / gyyy все ще відображається на Chrome (70).
schankam

2

Запропонував мені деякий час розгадати це, залиште його як type="text"і додати onfocus="(this.type='date')"так, як показано вище.

Мені навіть подобається згадувана вище ідея onBlur

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

Сподіваюся, це допоможе тому, хто не зовсім зібрав те, що відбувається вище


2

Для узагальнення проблеми введення дати:

  • Ви повинні їх відобразити (тобто уникати відображення: жодного), інакше інтерфейс вводу не буде спрацьовувати;
  • заповнювач заповнення суперечить їм (відповідно до специфікації та тому, що вони повинні відображати певний інтерфейс користувача);
  • перетворення їх в інший тип вводу для нефокусованого часу дійсно дозволяє заповнювачам місць, але фокусування потім запускає неправильний інтерфейс введення (клавіатуру) принаймні на невеликий час, оскільки події фокусування неможливо скасувати.
  • вставлення (до) або додавання (після) вмісту не заважає відображати значення введення дати.

Я знайшов рішення, щоб відповідати цим вимогам - використовувати звичайний трюк для стилізації нативних елементів форми: переконайтеся, що елемент відображається, але не є видимим, і відображати його очікуваний стиль через пов’язану з ним мітку . Зазвичай мітка відображатиметься як вхідний (включаючи заповнювач), але над ним.

Отже, HTML на зразок:

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

Можна стилізувати як:

.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;
}

Будь-яка подія (клацання, фокусування) на такій пов’язаній мітці відображатиметься на самому полі і таким чином запускає інтерфейс введення дати.

Якщо ви хочете перевірити таке рішення в прямому ефірі, ви можете запустити цю кутову версію зі свого планшета або мобільного телефону.


2

Тож, що я вирішив зробити нарешті, тут, і це прекрасно працює на всіх мобільних браузерах, включаючи iPhone та Android.

$(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>

Дата


2

Я працюю з ionicframework та рішенням, яке надає @Mumthezir, майже ідеально. У випадку, якщо хтось матиме таку ж проблему, як і я (після зміни введення все ще фокусується, а при прокручуванні значення просто відпадає) Тож я додав onchange, щоб зробити input.blur ()

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

2

Ти можеш

  1. встановити його як текст тексту
  2. перетворити на дату на фокус
  3. натисніть на нього
  4. ... нехай користувач перевіряє дату
  5. при зміні зберігають значення
  6. встановити введення тексту
  7. встановити вхідне значення типу тексту на збережене значення

подобається це...

$("#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" />


2

Знайшов кращий спосіб керувати базовим розумінням користувача за допомогою перемикання миші та відкриття вибору дати при натисканні:

<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">

Також прихойте стрілку веб-веб-сайтів і зробіть її на 100% ширше, щоб покрити клацання:

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;
}

1

З кутової точки зору мені вдалося поставити заповнювач у елемент дати введення типу.

Перш за все я визначив наступний css:

.placeholder {
    color: $text-grey;
  }

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

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

Причина, чому це необхідно, полягає в тому, що якщо вміст css3 має інший колір, ніж звичайний заповнювач, тому мені довелося використовувати загальний.

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

Тоді в шаблоні використовується атрибут viewchild birthDate, щоб мати доступ до цього входу з компонента. І визначив кутовий вираз на атрибуті-заповнювачі, який вирішить, будемо ми показувати заповнювач-заповнювач чи ні. Це головний недолік рішення, полягає в тому, що вам доведеться керувати видимістю заповнювача.

@ViewChild('birthDate') birthDate;

getBirthDatePlaceholder() {
  if (!this.birthDate) {
    return;
  } else {
    return this.birthDate.nativeElement.value === '' ?
    'ONBOARDING_FORM_COMPONENT.HINT_BIRTH_DATE' :
    '';
  }
}

1

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

Перероблений код мумтезіра


1

Я здивований, що є лише одна відповідь із таким підходом, який я використовував.
Я отримав натхнення від коментаря @ Dtipson щодо відповіді @Mumthezir VP.

Для цього я використовую два входи, один - підроблений вхід, type="text"на якому я встановлюю заповнювач, інший - це реальне поле type="date".
Під час mouseenterподії на їх контейнері я приховую підроблені дані і показую справжній, і я роблю навпаки mouseleaveподії. Очевидно, я залишаю реальний вхід visibile, якщо на ньому встановлено значення.
Я написав код для використання чистого Javascript, але якщо ви використовуєте jQuery (я це роблю), це дуже просто "перетворити" його.

// "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>

Я перевірив це також на телефоні Android, і він працює, коли користувач натискає на поле відображається датчик. Єдине, що якщо реальний вхід не мав значення і користувач закриває панель вибору дати, не вибираючи дату, вхід залишатиметься видимим, поки він не натисне за межі нього. Немає жодної події, щоб слухати, щоб знати, коли вибірка дати закривається, тому я не знаю, як це вирішити.

У мене немає пристрою iOS, щоб перевірити його.


0

Розширення рішення @ mvp з ненав’язливим JavaScript на увазі, ось такий підхід:

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') }
)

0

Я думаю, що все, що вам потрібно зробити, - це змінити модель, щоб сказати, що поле дати є нульовим, а потім поставити на нього [Обов’язково], якщо це потрібно. Якщо ви це зробите, текст заповнювача не відображається.


0

Гей, тому я вчора ввечері зіткнувся з тим же питанням і з'ясував, що поєднує всі ваші відповіді та якісь іскристі чари роблять гарну роботу:

HTML:

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

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;
   }
}

JQuery:

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

Пояснення: Отже, що відбувається тут, в першу чергу в HTML , це досить прямо вперед, просто робимо базовий введення дати HMTL5 і встановлюємо заповнення місця. Наступна зупинка: CSS , ми встановлюємо: перед псевдоелементом, щоб підробити наш заповнювач, він просто бере атрибут заповнювача з самого вводу. Я зробив це доступним лише вниз із шириною огляду 1024px - чому я збираюся розповісти пізніше. А тепер jQuery , після рефакторингу пару разів, я придумав цей біт коду, який перевірятиме кожну зміну, чи є набір значень чи ні, якщо його не буде (повторно) додавати клас, навпаки .

ЗНАТИ ВИПУСКИ:

  • є проблема в chrome з його вибором дати за замовчуванням, саме для цього медіа-запит. Це додасть заповнювач перед початком параметра "dd.mm.yyyy". Ви також можете встановити заповнювач для введення дати на 'date:' і відрегулювати кольоровий шрифт без значення усередині входу ... для мене це призвело до деяких інших менших проблем, тому я пішов, просто не показуючи його на 'більший 'екрани

сподіваюся, що допомагає! привіт!


0

Якщо ви переймаєтесь лише мобільним телефоном:

input[type="date"]:invalid:before{
    color: rgb(117, 117, 117);
    content: attr(placeholder);
}

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;');
});

Тут не вітається розміщення коду без будь-яких пояснень. Відредагуйте свою публікацію.
Cid

0

Ось ще один можливий злом, який не використовує js та все ще використовує css content. Зауважте, що, як :afterце не підтримується в деяких браузерах для введення даних, нам потрібно вибрати інший спосіб, такий же для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>


0

Це працює для мене, використовуючи це як елемент введення:

<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">

Цей CSS показує постійний заповнювач. Вибране значення відображається після заповнювача.

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 */
    }
}

Я використовую це рішення для форми Wordpress із плагіном contact-form-7.


цей префікс moz не працює для мене у FF: /
saomi

0

Жодне з рішень для мене не працювало належним чином на Chrome в iOS 12, і більшість з них не призначені для того, щоб справлятися з можливими введеннями кількох дат на сторінці. Я зробив наступне, що в основному створює підроблену мітку над введенням дати та видаляє її при натисканні. Я також видаляю підроблену мітку, якщо ширина області перегляду перевищує 992 пікселя.

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;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.