点击图标打开HTML5日期选择器

时间:2013-08-20 04:30:32

标签: javascript extjs sencha-touch html5-canvas

我有一个HTML5日期选择器。
单击日期选择器文本框时打开。

Todo:

  • 我必须将事件更改为图标,但我不确定如何实现此功能。
    当我点击日历图标时,我必须打开日期选择器。

以下是我的datepicker的HTML代码:

<img src="date.png" alt="Date Picker" id="datepickericon" />
<input name="calendarselect{ContactID}" class="timeselect" type="date" id="calendar">
<script>
document.getElementById("datepickericon").onclick = function(e){
console.log('inside click');
    document.getElementById("calendar").style.visibility="visible";
    // document.getElementById("calendar").focus();
    // You could write code to toggle this
}

enter image description here

点击图标,我必须得到如下图所示的打开日历视图 enter image description here

7 个答案:

答案 0 :(得分:9)

带有<input>的HTML5 type='date'仅适用于few browsers。此外,作为程序员,您无法控制其外观或任何其他方面(例如显示和隐藏它)(Quick FAQs on input type date

因此,如果您必须这样做,则HTML5 <input type='date'>标记不是一个选项。您必须使用JavaScript构建的内容,例如jQuery UIBootstrap日期选择器。


旧答案

您必须在点击图标时附加活动。假设您的HTML看起来像这样:

<img src="date.png" alt="Date Picker" id="datepickericon" />
<input name="calendarselect{ContactID}" class="timeselect" type="date" id="calendar">

您必须检查图标上的onclick事件并显示或隐藏日历。

document.getElementById("datepickericon").onclick = function(e){
    document.getElementById("calendar").focus();
    // You could write code to toggle this
}

答案 1 :(得分:7)

如果您不介意在日期输入字段中包含日历图标,那么跨浏览器的替代方法是将日历图标放在三角形日历选择器指示器的顶部,然后将日历图标设置为{{1这将导致所有点击事件传递到下面的三角形日历选择器指示器。我不完全确定日历选择器指示器在不同浏览器中的位置是否一致但它应该非常相似。请参阅下面的示例。

&#13;
&#13;
pointer-events: none
&#13;
.sd-container {
  position: relative;
  float: left;
}

.sd {
  border: 1px solid #1cbaa5;
  padding: 5px 10px;
  height: 30px;
  width: 150px;
}

.open-button {
  position: absolute;
  top: 10px;
  right: 3px;
  width: 25px;
  height: 25px;
  background: #fff;
  pointer-events: none;
}

.open-button button {
  border: none;
  background: transparent;
}
&#13;
&#13;
&#13;

此外,还可以更改日期输入字段(但不是日历日期选择器)的某些外观,因为它的样式类似于文本输入字段。此外,它们还有许多WebKit CSS属性,这些属性在此处进行了解释Are there any style options for the HTML5 Date picker?

答案 2 :(得分:3)

我回答这个问题,希望有新人能发现它有用: 我的HTML是这样的:

In [5]: df= pd.ExcelFile('PTE_Kinetics_04-30-2015.xlsx')

In [7]: sh = df.parse('Forced Wash')

In [8]: sh.head()
Out[8]: 
   Time  Absorbance
0     0      0.1254
1     5      0.1278
2    10      0.1280
3    15      0.1286
4    20      0.1303

In [9]: sh.set_index('Time').head()
Out[9]: 
      Absorbance
Time            
0         0.1254
5         0.1278
10        0.1280
15        0.1286
20        0.1303

我已经在Chrome模拟器以及Android设备上对它进行了测试,它的工作原理非常好。但需要在iOS设备上进行测试。

答案 3 :(得分:2)

您可以将日期元素粘贴到图标上,并输入opactiy:0; 并给出字体尺寸与图标的大小一样大,然后就会发出错误

答案 4 :(得分:2)

如果用户点击了对应label标记,则大多数(如果不是全部)浏览器都会关注表单控件。因此,一个可能的解决方案是将图标放入label标记,如下所示:

<label for="dateinput">Birthday:</label>
<input type="date" id="dateinput">
<label for="dateinput">
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAA80lEQVRIie2SzQqCQBDHe5/w1kXt1qUFo6NP1Melp8geIvxgyzbJoIJ6gQ1SA6V6AJ1OG0SsaQkWOPCHPfxmf8wwtVoZZcyXKx0TJwe/0TFZZxaYtgOm7UDhvD8aDD0VxazBV5qZwnhPbcfeqNfnCk4qSiiSHg0USW8/p0h84k8qSvgTKE04tBpgTjSwNA0OrcZbAePN8fjBpwookmAhC0BkAY5IzDDBK58qKCJcARbrUES4gvB6gyJSvoCd3Sfv3xBUK6pW9LngHEZfrycII77A3e1vwReSIIzA3e4vXIFuka4xW57ZyHljYBJMsd3hCv6y7o9Nby8uLYYvAAAAAElFTkSuQmCC" style="vertical-align: middle;" alt="Calendar" title="Set focus on birthday field">
</label>

但有几点需要注意:

  • label标签还用于将表单控件的描述连接到表单控件本身,因此辅助技术(例如屏幕阅读器)可以与用户进行通信,从而形成他们选择的控件。因此,可能不鼓励滥用label标记来显示图标。因此,使用两个label标记,这两个标记都链接到同一个表单控件,一个描述它,另一个标记用于日历图标。
  • 此解决方案将日期字段重点放在用户单击其中的位置。特别是Chrome on Desktop(目前版本为66)仍然要求用户点击一个小向下箭头来展开日历。虽然
  • ,Android上的Firefox,Edge和Chrome似乎运行良好

答案 5 :(得分:0)

<input type="date">

input[type="date"], input[type="month"]{
    position: relative;
}

/* create a new arrow, because we are going to mess up the native one
see "List of symbols" below if you want another, you could also try to add a font-awesome icon.. */
input[type="date"]:after,input[type="month"]:after {
    font-family: "Font Awesome 5 Free";
    font-weight: 900; 
    content: "\f073";
    color: #555;
    padding: 0 5px;
}

/* change color of symbol on hover */
input[type="date"]:hover:after,input[type="month"]:hover:after {
    color: #bf1400;
}

/* make the native arrow invisible and stretch it over the whole field so you can click anywhere in the input field to trigger the native datepicker*/
input[type="date"]::-webkit-calendar-picker-indicator,input[type="month"]::-webkit-calendar-picker-indicator  {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: auto;
    height: auto;
    color: transparent;
    background: transparent;
}

/* adjust increase/decrease button */
input[type="date"]::-webkit-inner-spin-button,input[type="month"]::-webkit-inner-spin-button {
    z-index: 1;
}

 /* adjust clear button */
 input[type="date"]::-webkit-clear-button, input[type="month"]::-webkit-clear-button {
     z-index: 1;
 }

答案 6 :(得分:0)

您可以查看日期选择器的 codepen 链接。

https://codepen.io/ragi_jay/pen/NWdbJMG

HTML

<div class="tek-date-container tek-flow-modal-date-picker">
<input class="tek-input tek-date-input-box" type="date"  placeholder="Date" name="startDate" id="tek_start_date" value="" />

<span class="tek-btn-date">

  <div class="tek-cal-icon">
  <button type="button">
  
    <img src="data:image/svg+xml,%3csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 19.3 22' style='enable-background:new 0 0 19.3 22%3b' xml:space='preserve'%3e %3cstyle type='text/css'%3e .st0%7bfill:%235961FF%3b%7d %3c/style%3e %3cg id='Layer_2_1_'%3e %3cg id='Layer_1-2'%3e %3cpath class='st0' d='M17.2%2c2.8h-2.1V0.5c0-0.3-0.2-0.5-0.4-0.5c0%2c0%2c0%2c0-0.1%2c0h-0.3c-0.3%2c0-0.5%2c0.2-0.5%2c0.4c0%2c0%2c0%2c0%2c0%2c0.1v2.2H5.5 V0.5C5.5%2c0.2%2c5.3%2c0%2c5.1%2c0C5%2c0%2c5%2c0%2c5%2c0H4.6C4.3%2c0%2c4.1%2c0.2%2c4.1%2c0.5v2.2h-2C1%2c2.7%2c0%2c3.7%2c0%2c4.8v15.1C0%2c21%2c0.9%2c22%2c2%2c22c0%2c0%2c0.1%2c0%2c0.1%2c0 h15.1c1.2%2c0%2c2.1-0.9%2c2.1-2.1V4.8C19.3%2c3.7%2c18.3%2c2.8%2c17.2%2c2.8z M2.1%2c4.1h15.1c0.4%2c0%2c0.7%2c0.3%2c0.7%2c0.7c0%2c0%2c0%2c0%2c0%2c0v2.1H1.4V4.8 C1.4%2c4.4%2c1.7%2c4.1%2c2.1%2c4.1C2.1%2c4.1%2c2.1%2c4.1%2c2.1%2c4.1z M17.2%2c20.6H2.1c-0.4%2c0-0.7-0.3-0.7-0.7c0%2c0%2c0%2c0%2c0%2c0V8.3h16.5V20 C17.9%2c20.4%2c17.6%2c20.6%2c17.2%2c20.6z M6.4%2c13.8H4.6c-0.3%2c0-0.5-0.2-0.5-0.4c0%2c0%2c0%2c0%2c0-0.1v-1.7c0-0.3%2c0.2-0.5%2c0.4-0.5c0%2c0%2c0%2c0%2c0.1%2c0 h1.7c0.3%2c0%2c0.5%2c0.2%2c0.5%2c0.4c0%2c0%2c0%2c0%2c0%2c0.1v1.7C6.9%2c13.5%2c6.6%2c13.8%2c6.4%2c13.8z M10.5%2c13.8H8.8c-0.3%2c0-0.5-0.2-0.5-0.4c0%2c0%2c0%2c0%2c0-0.1 v-1.7c0-0.3%2c0.2-0.5%2c0.4-0.5c0%2c0%2c0%2c0%2c0.1%2c0h1.7c0.3%2c0%2c0.5%2c0.2%2c0.5%2c0.4c0%2c0%2c0%2c0%2c0%2c0.1v1.7C11%2c13.6%2c10.8%2c13.8%2c10.5%2c13.8z M14.6%2c13.8 h-1.7c-0.3%2c0-0.5-0.2-0.5-0.4c0%2c0%2c0%2c0%2c0-0.1v-1.7c0-0.3%2c0.2-0.5%2c0.4-0.5c0%2c0%2c0%2c0%2c0.1%2c0h1.7c0.3%2c0%2c0.5%2c0.2%2c0.5%2c0.4c0%2c0%2c0%2c0%2c0%2c0.1 v1.7C15.1%2c13.6%2c14.9%2c13.8%2c14.6%2c13.8z M10.5%2c17.9H8.8c-0.3%2c0-0.5-0.2-0.5-0.4c0%2c0%2c0%2c0%2c0-0.1v-1.7c0-0.3%2c0.2-0.5%2c0.4-0.5 c0%2c0%2c0%2c0%2c0.1%2c0h1.7c0.3%2c0%2c0.5%2c0.2%2c0.5%2c0.4c0%2c0%2c0%2c0%2c0%2c0.1v1.7C11%2c17.7%2c10.8%2c17.9%2c10.5%2c17.9z M6.4%2c17.9H4.6c-0.3%2c0-0.5-0.2-0.5-0.4 c0%2c0%2c0%2c0%2c0-0.1v-1.7c0-0.3%2c0.2-0.5%2c0.4-0.5c0%2c0%2c0%2c0%2c0.1%2c0h1.7c0.3%2c0%2c0.5%2c0.2%2c0.5%2c0.4c0%2c0%2c0%2c0%2c0%2c0.1v1.7 C6.9%2c17.6%2c6.6%2c17.9%2c6.4%2c17.9z M14.6%2c17.9h-1.7c-0.3%2c0-0.5-0.2-0.5-0.4c0%2c0%2c0%2c0%2c0-0.1v-1.7c0-0.3%2c0.2-0.5%2c0.4-0.5c0%2c0%2c0%2c0%2c0.1%2c0 h1.7c0.3%2c0%2c0.5%2c0.2%2c0.5%2c0.4c0%2c0%2c0%2c0%2c0%2c0.1v1.7C15.1%2c17.7%2c14.9%2c17.9%2c14.6%2c17.9z'/%3e %3c/g%3e %3c/g%3e %3c/svg%3e" alt="calendar" class="tek-calendar-img" id="tekStartDateClick">
   </button></div>
</span>

CSS

.tek-date-container {
  position: relative;
  float: left;
 }

.tek-input {
   border: 1px solid #cacaca;
   padding: 3px 10px;
  height: 30px;
  width:  280px;

 }

.tek-btn-date{
 position: absolute;
top: 10px;
right: 8px;
width: 25px;
height: 25px;
background: #fff;
pointer-events: none;
}

.tek-btn-date button {
 border: none;
 background: transparent;
}

.tek-cal-icon{
   display: flex;
  justify-content: center;
  align-items: center;
  width: 40px;
  height: 100%;
  border: none;
 background: transparent;

}
.tek-calendar-img {
   width: 20px;
 }
.tek-date-input-box {
   font-family: "Roboto",sans-serif !important;
  border-radius: 5px;
  font-size: 14px;
  border: none !important;
  padding: 5px;
  outline: none;
  font-size: 14px;
  background: none;
  box-shadow: none;
}

.tek-flow-modal-date-picker {
   display: flex;
  justify-content: space-between;
  align-items: center;
  border: 1px solid #cacaca;
  border-radius: 3px;
 }