Baseline Widely available
ç±»å为 time
ç <input>
å
ç´ ï¼æ¨å¨è®©ç¨æ·è½»æ¾è¾å
¥æ¶é´ï¼å°æ¶ååéï¼ä»¥åå¯éçç§ï¼ã
æ§ä»¶çç¨æ·çé¢å æµè§å¨èå¼ï¼è¯·æ¥é
æµè§å¨å
¼å®¹æ§ä»¥äºè§£æ´å¤ç»èãå¨ä¸æ¯æè¯¥ç±»åçæµè§å¨ä¸ï¼å®ä¼ä¼é
å°é级为 <input type="text">
ã
<label for="appt">Choose a time for your meeting:</label>
<input type="time" id="appt" name="appt" min="09:00" max="18:00" required />
<small>Office hours are 9am to 6pm</small>
label {
display: block;
font:
1rem "Fira Sans",
sans-serif;
}
input,
label {
margin: 0.4rem 0;
}
å¤è§ Chrome å Opera
å¨ Chrome æ Opera ä¸ï¼time
éæ©æ§ä»¶å¾ç®åï¼æ ¹æ®æä½ç³»ç»åºåè®¾ç½®ï¼ææ§½ä»¥ 12 æ 24 å°æ¶æ ¼å¼è¾å
¥å°æ¶ååéï¼ä¸ä¸ç®å¤´ç¨äºéå¢åéåå½åéå®çç»ä»¶ã卿äºçæ¬ä¸ï¼ä¼æä¾ä¸ä¸ªâxâæé®æ¥æ¸
餿§ä»¶çå¼ã
12 å°æ¶å¶
24 å°æ¶å¶
FirefoxFirefox ç time
éæ©æ§ä»¶å Chrome é常ç¸ä¼¼ï¼åªæ¯å®æ²¡æä¸ä¸ç®å¤´ãå®è¿åºäºç³»ç»åºåè®¾ç½®ä½¿ç¨ 12 æ 24 å°æ¶æ ¼å¼è¾å
¥æ¶é´ï¼ä¹æä¾âXâæé®ä»¥æ¸
餿§ä»¶çå¼ã
12 å°æ¶å¶
24 å°æ¶å¶
EdgeEdge ç time
éæ©æ§ä»¶æç¹å¤æï¼æå¼ä¸ä¸ªå°æ¶ååéçæ»å¨åºåãå®å Chrome 䏿 ·ï¼åºäºç³»ç»åºåè®¾ç½®ä½¿ç¨ 12 æ 24 å°æ¶æ ¼å¼è¾å
¥æ¶é´ï¼
12 å°æ¶å¶
24 å°æ¶å¶
å¼è¾å ¥å°è¯¥æ§ä»¶ä¸ï¼å 嫿¶é´å¼çä¸ä¸ªå符串ã
设置 value 屿§ä½ å¯ä»¥éè¿å¨å建 <input>
å
ç´ æ¶å¨ value
屿§å
å«ä¸ä¸ªåæ³çæ¶é´æ¥è®¾ç½®é»è®¤å¼ï¼æ¯å¦ï¼
<label for="appt-time">éæ©çº¦å®çæ¶é´ï¼</label>
<input id="appt-time" type="time" name="appt-time" value="13:30" />
ä½¿ç¨ JavaScript 设置 value
ä½ ä¹å¯ä»¥å¨ JavaScript 代ç ä¸éè¿ HTMLInputElement
ç value
屿§è·åå设置æ¶é´çå¼ï¼æ¯å¦ï¼
const timeControl = document.querySelector('input[type="time"]');
timeControl.value = "15:30";
æ¶é´æ ¼å¼
time
è¾å
¥æ¡æ 论è¾å
¥ä½ç§æ ¼å¼çå¼ï¼è¿å¯è½ç±ç¨æ·çåºåè®¾ç½®ï¼æç¨æ·ä»£çå³å®ï¼ï¼å
¶ value
弿»æ¯å¸¦æå导é¶ç 24 å°æ¶å¶æ¶é´ï¼hh:mm
ã妿è¾å
¥çæ¶é´å
å«ç§æ°ï¼åè§ä½¿ç¨ step 屿§ï¼ï¼åæ ¼å¼æ»æ¯ä¸º hh:mm:ss
ãä½ å¯ä»¥å¨æ¶é´å符串ä¸äºè§£å°æ´å¤æå
³æ¶é´å¼çæ ¼å¼ã
卿¤ç¤ºä¾ä¸ï¼ä½ å¯ä»¥éè¿è¾å ¥æ¶é´å¹¶æ¥çä¹åå¦ä½æ´æ¹æ¥æ¥çæ¶é´è¾å ¥çå¼ã
é¦å
ï¼çä¸ä¸ HTMLãè¿å¾ç®åï¼å¸¦ææä»¬ä¹åçå°çæ ç¾åè¾å
¥æ§ä»¶ï¼ä½æ·»å äºé¢å¤çå
ç´ <p>
å <span>
ç¨æ¥æ¾ç¤º time
æ§ä»¶çå¼ï¼
<form>
<label for="startTime">å¼å§æ¶é´ï¼</label>
<input type="time" id="startTime" />
<p>
<code>time</code> è¾å
¥æ¡çå¼ï¼ <code> "<span id="value">n/a</span>"</code>.
</p>
</form>
è¿æ®µ JavaScript 代ç å°ä»£ç æ·»å å°æ¶é´ input ä¸ï¼ä»¥çå¬ input
äºä»¶ï¼æ¯æ¬¡ input å
ç´ çå
容åçååæ¶é½ä¼è§¦å该äºä»¶ãæ¯æ¬¡äºä»¶è§¦åæ¶ï¼<span>
å
ç´ çå
容é½ä¼æ¿æ¢ä¸º input å
ç´ çææ°å¼ã
const startTime = document.getElementById("startTime");
const valueSpan = document.getElementById("value");
startTime.addEventListener(
"input",
() => {
valueSpan.innerText = startTime.value;
},
false,
);
å½å
å« time
è¾å
¥æ¡ç表å被æäº¤åï¼è¯¥å¼å¨è¢«å
å«å¨è¡¨åæ°æ®ä¸ä¹å被ç¼ç ã表åçæ¶é´è¾å
¥æ°æ®æ»æ¯ä»¥ name=hh%3Amm
çå½¢å¼åºç°ï¼å¦æå
å«ç§æ°ï¼å以 name=hh%3Amm%3Ass
çå½¢å¼åºç°ï¼åè§ä½¿ç¨ step 屿§ï¼ã
é¤äº <input>
å
ç´ å
±æç屿§å¤ï¼æ¶é´è¾å
¥è¿æä¾ä»¥ä¸å±æ§ï¼
夿³¨ï¼ ä¸è®¸å¤æ°æ®ç±»åä¸åï¼æ¶é´å¼æä¸ä¸ªå¨æåï¼æå³çæ°å¼è¾¾å°å¯è½çæé«å¼ä¹åï¼å°±ä¼ç»åèµ·ç¹ãä¾å¦ï¼æå® min
为 14:00
ï¼max
为 2:00
æå³çå
è®¸çæ¶é´å¼ä»ä¸å 2:00 å¼å§ï¼éè¿åå¤è¿è¡å°ç¬¬äºå¤©ï¼ç»æäºåæ¨ 2:00ãæ´å¤ä¿¡æ¯è¯·åè§æ¬æç使æå°å¼åæå¤§å¼è·¨è¶åå¤é¨åã
åè¡¨å±æ§ç弿¯ä½äºåä¸ææ¡£ä¸ç <datalist>
å
ç´ ç id
ã<datalist>
æä¾äºä¸ä¸ªé¢å®ä¹çå¼å表ï¼åç¨æ·å»ºè®®è¿ä¸ªè¾å
¥ãå表ä¸ä»»ä½ä¸ type
ä¸å
¼å®¹çå¼é½ä¸å
æ¬å¨å»ºè®®é项ä¸ãææä¾ç弿¯å»ºè®®ï¼ä¸æ¯è¦æ±ï¼ç¨æ·å¯ä»¥ä»è¿ä¸ªé¢å®ä¹çå表ä¸éæ©ï¼æè
æä¾ä¸åçå¼ã
ä¸ä¸ªä»£è¡¨ææ¥åçæè¿æ¶é´çå符串ï¼ä½¿ç¨ä¸è¿°çæ¶é´æ ¼å¼æå®ã妿æå®çåç¬¦ä¸²ä¸æ¯åæ³çæ¶é´è¡¨ç¤ºï¼åä¸ä¼è®¾ç½®æå¤§å¼ã
minä¸ä¸ªä»£è¡¨ææ¥åçææ©æ¶é´çå符串ï¼ä½¿ç¨ä¸è¿°çæ¶é´æ ¼å¼æå®ã妿æå®çåç¬¦ä¸²ä¸æ¯åæ³çæ¶é´è¡¨ç¤ºï¼åä¸ä¼è®¾ç½®æå°å¼ã
readonlyå¦æè¯¥å¸å°å±æ§åå¨ï¼æå³çç¨æ·å°ä¸è½ç¼è¾æ¤å段ãç¶èå
¶ value
å¼ä»ç¶å¯ä»¥ç´æ¥éè¿ JavaScript 代ç 设置 HTMLInputElement
ç value
屿§æ¹åã
夿³¨ï¼ ç±äºåªè¯»å段ä¸å¯ä»¥æ¥æå¼ï¼required
ä¸ä¼å¯¹æå®äº readonly
屿§çåæ®µèµ·ä½ç¨ã
step
屿§æå®äºå¼å¿
须满足çç²åº¦ï¼æè
æ¯ä¸ææè¿°çç¹æ®å¼ any
ãå¼å¿
须满足åºç¡çæ¥è¿å¼ï¼æææã妿æå®äº min
屿§ï¼åç± min
屿§å³å®ï¼å¦åï¼ä½¿ç¨ value
屿§çå¼ï¼å¦æä¸è¿°ä¸¤ä¸ªå¼é½ä¸åå¨ï¼åæä¾éå½çé»è®¤å¼ã
åç¬¦ä¸²å¼ any
æå³çä¸ä½¿ç¨æ¥è¿å¼ï¼ä»»æå¼é½å¯ä»¥æ¥åï¼é¤å
¶ä»å¶çº¦å ç´ å¦ min
æ max
ä¹å¤ï¼ã
夿³¨ï¼ å½ç¨æ·è¾å ¥çæ°æ®ä¸ç¬¦åæ¥è¿é ç½®æ¶ï¼ç¨æ·ä»£çå¯è½ä¼åèäºå ¥å°æè¿çææå¼ï¼å½æä¸¤ä¸ªåæ ·æ¥è¿çé项æ¶ï¼æ´å¾åäºæ£æ¹åçæ°åã
å¯¹äº time
è¾å
¥ï¼ step
çå¼ä»¥ç§ä¸ºåä½ï¼æ¯ä¾å å为 1000ï¼å 为åºç¡æ°å¼ä»¥æ¯«ç§ä¸ºåä½ï¼ãstep
çé»è®¤å¼ä¸º 60ï¼è¡¨ç¤º 60 ç§ï¼æ 1 åéã60000 毫ç§ï¼ã
ç®åï¼å°ä¸æ¸
æ¥å½ä¸ time
è¾å
¥ä¸èµ·ä½¿ç¨æ¶ï¼any
çå¼å¯¹ step
æå³çä»ä¹ãç¡®å®è¯¥ä¿¡æ¯åï¼å°å¯¹å
¶è¿è¡æ´æ°ã
<input type="time">
çæç®åç¨æ³æ¶ååºæ¬ç <input>
å <label>
å
ç´ ç»åï¼å¦ä¸æç¤ºï¼
<form>
<label for="appt-time">éæ©çº¦å®çæ¶é´ï¼</label>
<input id="appt-time" type="time" name="appt-time" />
</form>
æ§å¶è¾å
¥æ¡å¤§å°
<input type="time">
䏿¯æè¯¸å¦ size
ç表å大å°å±æ§ï¼å 为æ¶é´å符串çé¿åº¦æ»æ¯ç¸åçãä½ å¿
é¡»ä¾é CSS æ¥ç¡®å®å¤§å°ã
ä½ å¯ä»¥ä½¿ç¨ step
屿§æ¥æ´æ¹æ¯æ¬¡é墿éåçæ¶é´æ°ï¼ä¾å¦ï¼ç¹å»ç®å¤´æ§ä»¶æ¶æ¶é´å¼ä¼ä»¥ 10 åé为åä½åå¨ï¼ã
夿³¨ï¼ æ¤å±æ§å¨ä¸åæµè§å¨ä¹é´æä¸äºæªå¼çè¡ä¸ºï¼å¹¶ä¸å¯é ã
å®éè¦ä¸ä¸ªæ´æ°ï¼ç¸å½äºä½ è¦å¢å çç§æ°ï¼é»è®¤å¼æ¯ 60 ç§ï¼æ 1 åéãå¦æä½ æå®ä¸ä¸ªå°äº 60 ç§ï¼1 åéï¼çå¼ï¼time
è¾å
¥å°æ¾ç¤ºç§çè¾å
¥åºï¼åæ¶æ¾ç¤ºå°æ¶ååéã
<form>
<label for="appt-time">éæ©çº¦å®çæ¶é´ï¼</label>
<input id="appt-time" type="time" name="appt-time" step="2" />
</form>
å¨ Chrome å Opera è¿ä¸¤ä¸ªä¸ºæ°ä¸å¤æ¾ç¤ºä¸ä¸è¿ä»£ç®å¤´çæµè§å¨ä¸ï¼ç¹å»ç®å¤´å¯ä»¥å°ç§çæ°å¼æ¹å两ç§ï¼ä½ä¸ä¼å½±åå°æ¶æåéãåï¼æå°æ¶ï¼åªæå¨ä½ æå®äºä»¥ç§ä¸ºåä½çåéï¼æå°æ¶ï¼æ°æ¶ï¼æè½ç¨äºæ¥è¿ï¼æ¯å¦ 120 代表 2 åéï¼7200 代表 2 å°æ¶ï¼ã
å¨ Firefox æµè§å¨ä¸ï¼æ²¡æç®å¤´ï¼æä»¥æ²¡æä½¿ç¨ step
å¼ãç¶èï¼æä¾å®ä¼å¨åéé¨åçæè¾¹å¢å ç§æ°è¾å
¥åºã
å¨ Edge æµè§å¨ä¸ï¼step å¼ä¸èµ·ä½ç¨ã
夿³¨ï¼ ä½¿ç¨ step
å¯è½ä¼å¯¼è´éªè¯å·¥ä½ä¸æ£å¸¸ï¼å¦ä¸ä¸èæè§ï¼ã
é»è®¤æ
åµä¸ï¼<input type="time">
ä¸ä¼å¯¹è¾å
¥çå¼åºç¨ä»»ä½éªè¯ï¼ç¨æ·ä»£çæ¥å£ä¼å±è½ææéæ¶é´å¼çè¾å
¥ï¼å°½ç®¡è¿å¾æç¨ï¼åè®¾ç¨æ·ä»£çå®å
¨æ¯æ time
è¾å
¥ï¼ï¼ä½æ¯ä»ç¶æ æ³å®å
¨ä¾èµäºè¯¥å¼çåæ³æ§ãå®ä»ç¶å
许空å符串ï¼""
ï¼ï¼ä¸å¯è½å
许é£äºçèµ·æ¥åï¼ä½å¹¶ä¸æ£ç¡®çæ¶é´å¼ï¼å¦ 25:05
ï¼ã
ä½ å¯ä»¥ä½¿ç¨ min
å max
屿§æ¥éå¶ç¨æ·å¯ä»¥éæ©çæææ¶é´ãå¨ä»¥ä¸ç¤ºä¾ä¸ï¼æä»¬è®¾ç½®äºå¯ä¾éæ©çæå°å¼ 12:00
åæå¤§å¼ 18:00
ï¼
<form>
<label for="appt-time"> éæ©çº¦å®çæ¶é´ï¼å¼æ¾æ¶é´ä¸º 12:00 å° 18:00ï¼ï¼ </label>
<input id="appt-time" type="time" name="appt-time" min="12:00" max="18:00" />
<span class="validity"></span>
</form>
ä¸é¢æ¯ä¸è¿°ä¾åä¸ä½¿ç¨ç CSSãè¿éæä»¬ä½¿ç¨äº :valid
å :invalid
è¿ä¸¤ä¸ª CSS 屿§ï¼æ ¹æ®å½å弿¯å¦æææ¥ä¸ºè¾å
¥æ·»å æ ·å¼ãæä»¬ä¸å¾ä¸æå¾æ æ¾å¨ input æè¾¹ç <span>
ä¸ï¼è䏿¯æ¾å¨ input æ¡æ¬èº«ï¼å ä¸ºå¨ Chrome ä¸ï¼çæçå
容被æ¾å¨è¡¨åæ§ä»¶éé¢ï¼æ æ³ææå°è¿è¡æ ·å¼è®¾è®¡ææ¾ç¤ºã
div {
margin-bottom: 10px;
position: relative;
}
input[type="number"] {
width: 100px;
}
input + span {
padding-right: 30px;
}
input:invalid + span::after {
position: absolute;
content: "â";
padding-left: 5px;
}
input:valid + span::after {
position: absolute;
content: "â";
padding-left: 5px;
}
è¿è¡çç»æå¯ä»¥è¯´æï¼
å¦æè®¾ç½®ç min
屿§å¤§äº max
屿§ï¼æææ¶é´èå´å°ç¯ç»åå¤ï¼äº§çä¸ä¸ªè·¨è¶åå¤çæææ¶é´èå´ãè¿ä¸ªåè½ä¸è¢«ä»»ä½å
¶ä» input ç±»åææ¯æãè½ç¶è¿ä¸ªåè½å¨ HTML è§èä¸ï¼ä½å®è¿æ²¡æè¢«æ®éæ¯æãåºäº Chrome çæµè§å¨ä» 82 çå¼å§æ¯æè¯¥åè½ï¼Firefox å¨ 76 çä¸å å
¥äºè¯¥åè½ãSafari ä» 14.1 çå¼å§ä¸æ¯æè¿ä¸ªåè½ãè¦å好åºç°è¿ç§æ
åµçåå¤ã
const input = document.createElement("input");
input.type = "time";
input.min = "23:00";
input.max = "01:00";
input.value = "23:59";
if (input.validity.valid && input.type === "time") {
// <input type=time> reversed range supported
} else {
// <input type=time> reversed range unsupported
}
使æ¶é´æä¸ºå¿
éå¼
æ¤å¤ï¼ä½ å¯ä»¥ä½¿ç¨ required
屿§æ¥å¼ºå¶å¡«åæ¶é´ãå æ¤ï¼å¦æä½ è¯å¾æäº¤ä¸ä¸ªè¶
åºè®¾å®èå´çæ¶é´ï¼æä¸ä¸ªç©ºçæ¶é´åæ®µï¼æ¯æçæµè§å¨å°æ¾ç¤ºä¸ä¸ªé误ã
让æä»¬çä¸ä¸ªä¾åï¼å¨è¿éï¼æä»¬è®¾ç½®äºæå°åæå¤§çæ¶é´ï¼ä¹ä½¿è¿ä¸ªå段æä¸ºå¿ éçï¼
<form>
<div>
<label for="appt-time">
éæ©çº¦å®çæ¶é´ï¼å¼æ¾æ¶é´ä¸º 12:00 å° 18:00ï¼ï¼
</label>
<input
id="appt-time"
type="time"
name="appt-time"
min="12:00"
max="18:00"
required />
<span class="validity"></span>
</div>
<div>
<input type="submit" value="æäº¤è¡¨å" />
</div>
</form>
å¦æä½ è¯å¾æäº¤å«æä¸å®æ´çæ¶é´ï¼æç¨è¶ åºè®¾å®èå´çæ¶é´ï¼ç表åï¼æµè§å¨ä¼æ¾ç¤ºä¸ä¸ªé误ãç°å¨è¯ä¸è¯ä¸é¢è¿ä¸ªä¾åã
è¦åï¼ HTML 表åéªè¯å¹¶ä¸è½æ¿ä»£ç¡®ä¿è¾å ¥æ°æ®æ ¼å¼æ£ç¡®çèæ¬ãå¾å®¹æå¯¹ HTML è¿è¡è°æ´ï¼ä½¿ä»ä»¬è½å¤ç»è¿éªè¯ï¼æå®å ¨å é¤éªè¯ã乿å¯è½ä¼å®å ¨ç»è¿ HTML 代ç ï¼ç´æ¥å°æ°æ®æäº¤ç»ä½ çæå¡å¨ãå¦æä½ çæå¡å¨ç«¯ä»£ç ä¸è½éªè¯å®ææ¶å°çæ°æ®ï¼é£ä¹å½æäº¤çæ°æ®æ ¼å¼ä¸å½ï¼ææ°æ®è¿å¤§ãç±»åé误ççï¼æ¶ï¼ç¾é¾å°±ä¼é临ã
å¤çæµè§å¨æ¯æå¦åæè¿°ï¼èçæ¬ç Safari åå
¶ä»ä¸äºä¸å¤ªå¸¸è§çæµè§å¨å¹¶ä¸æ¯ææ¶é´è¾å
¥ãæ»çæ¥è¯´ï¼é¤æ¤ä¹å¤ï¼æ¯ææ
åµè¯å¥½ââç¹å«æ¯å¨ç§»å¨å¹³å°ä¸ï¼è¿äºå¹³å°å¾å¾æé常好çç¨æ·ç颿¥æå®æ¶é´å¼ãä¾å¦ï¼å®åç Chrome æµè§å¨ä¸ç time
éæ©å¨çèµ·æ¥æ¯è¿æ ·çï¼
䏿¯ææ¶é´è¾å ¥çæµè§å¨ä¼ä¼é å°éçº§ä¸ºææ¬è¾å ¥ï¼ä½è¿å¨ç¨æ·çé¢çä¸è´æ§ï¼åç°çæ§ä»¶ä¼ææä¸åï¼åæ°æ®å¤çæ¹é¢é½ä¼äº§çé®é¢ã
第äºä¸ªé®é¢æ´ä¸ºä¸¥éï¼å¦åæè¿°ï¼time
è¾å
¥ç弿»æ¯è¢«è§è为 hh:mm
æ hh:mm:ss
çæ ¼å¼ãå¦ä¸æ¹é¢ï¼å¯¹äºææ¬è¾å
¥ï¼é»è®¤æ
åµä¸ï¼æµè§å¨ä¸ç¥éæ¶é´åºè¯¥æ¯ä»ä¹æ ¼å¼ï¼èä¸äººä»¬æå¤ç§åæ³ï¼å¦ï¼
3.00 pm
3:00pm
15:00
3 o'clock in the afternoon
ä¸ä¸ªåæ³æ¯å¨ä½ ç time
è¾å
¥ä¸æ·»å pattern
屿§ãå³ä½¿ time
è¾å
¥ä¸ä½¿ç¨å®ï¼text
è¾å
¥åéä¹ä¼ä½¿ç¨ãä¾å¦ï¼è¯çå¨ä¸ä¸ªä¸æ¯ææ¶é´è¾å
¥çæµè§å¨ä¸æ¥çä¸é¢çæ¼ç¤ºï¼
<form>
<div>
<label for="appt-time">
éæ©çº¦å®çæ¶é´ï¼å¼æ¾æ¶é´ä¸º 12:00 å° 18:00ï¼ï¼
</label>
<input
id="appt-time"
type="time"
name="appt-time"
min="12:00"
max="18:00"
required
pattern="[0-9]{2}:[0-9]{2}" />
<span class="validity"></span>
</div>
<div>
<input type="submit" value="æäº¤è¡¨å" />
</div>
</form>
å¦æä½ å°è¯æäº¤ï¼ä½ ä¼åç°ï¼å¦æä½ çè¾å
¥ä¸ç¬¦åæ¨¡å¼ nn:nn
ï¼å
¶ä¸ n
æ¯ 0 å° 9 çæ°åï¼ï¼ä¸æ¯æçæµè§å¨ç°å¨ä¼æ¾ç¤ºä¸ä¸ªé误信æ¯ï¼å¹¶çªåºæ¾ç¤ºè¾å
¥æ æï¼ãå½ç¶ï¼è¿å¹¶ä¸è½é»æ¢äººä»¬è¾å
¥æ æçæ¶é´ï¼æè
䏿£ç¡®çéµå¾ªæ¶é´æ ¼å¼çæ¶é´ã
ç¶åè¿æä¸ä¸ªé®é¢ï¼å°±æ¯ç¨æ·ä¸ç¥éå°åºåºè¯¥è¾å ¥ä»ä¹æ ¼å¼çæ¶é´ã
div {
margin-bottom: 10px;
position: relative;
}
input[type="number"] {
width: 100px;
}
input + span {
padding-right: 30px;
}
input:invalid + span::after {
position: absolute;
content: "â";
padding-left: 5px;
}
input:valid + span::after {
position: absolute;
content: "â";
padding-left: 5px;
}
ç®åï¼ä»¥è·¨æµè§å¨æ¹å¼å¤çæ¶é´çæä½³æ¹æ³æ¯è®©ç¨æ·å¨åç¬çæ§ä»¶ä¸è¾å
¥å°æ¶ååéï¼å¦æéè¦ï¼ä¹æç§æ°ï¼ï¼ç¹å«æ¯å¨ <select>
å
ç´ ä¸ï¼åè§ä¸é¢ç示ä¾ï¼ï¼æä½¿ç¨ JavaScript åºï¼ä¾å¦ jQuery æ¥æéæ©å¨ï¼ã
卿¤ç¤ºä¾ä¸ï¼æä»¬å建äºä¸¤ç»ç¨äºéæ©æ¶é´çæ¥å£å
ç´ ï¼ä½¿ç¨ <input type="time">
å建çåçéæ©å¨ï¼ä»¥åä¸ºä¸æ¯æ time
è¾å
¥ç±»åçæ§çæµè§å¨åå¤ç两个ç¨äºéæ©å°æ¶/åéç <select>
å
ç´ ã
HTML çèµ·æ¥åè¿æ ·ï¼
<form>
<div class="nativeTimePicker">
<label for="appt-time">
éæ©çº¦å®çæ¶é´ï¼å¼æ¾æ¶é´ä¸º 12:00 å° 18:00ï¼ï¼
</label>
<input
id="appt-time"
type="time"
name="appt-time"
min="12:00"
max="18:00"
required />
<span class="validity"></span>
</div>
<p class="fallbackLabel">éæ©çº¦å®çæ¶é´ï¼å¼æ¾æ¶é´ä¸º 12:00 å° 18:00ï¼ï¼</p>
<div class="fallbackTimePicker">
<div>
<span>
<label for="hour">æ¶ï¼</label>
<select id="hour" name="hour"></select>
</span>
<span>
<label for="minute">åï¼</label>
<select id="minute" name="minute"></select>
</span>
</div>
</div>
</form>
å
¶ <select>
å
ç´ çå°æ¶ååé弿¯å¨æçæçã
div {
margin-bottom: 10px;
position: relative;
}
input[type="number"] {
width: 100px;
}
input + span {
padding-right: 30px;
}
input:invalid + span::after {
position: absolute;
content: "â";
padding-left: 5px;
}
input:valid + span::after {
position: absolute;
content: "â";
padding-left: 5px;
}
该代ç ä¸å¯è½æè¶£çå¦ä¸é¨åæ¯ç¹æ§æ£æµä»£ç ãè¦æ£æµæµè§å¨æ¯å¦æ¯æ <input type="time">
ï¼æä»¬å建ä¸ä¸ªæ°ç <input>
å
ç´ ï¼å°è¯å°å
¶ type
设置为 time
ï¼ç¶åç«å³æ£æ¥å
¶ type
å¼ã䏿¯æçæµè§å¨å°è¿å text
ï¼å 为 time
ç±»åå°åé为 text
ç±»åã妿䏿¯æ <input type="time">
ï¼æä»¬å°éèåçéæ©å¨å¹¶æ¾ç¤ºåå¤éæ©å¨ UIï¼<select>
å
ç´ ï¼ã
// è·å UI å
ç´
const nativePicker = document.querySelector(".nativeTimePicker");
const fallbackPicker = document.querySelector(".fallbackTimePicker");
const fallbackLabel = document.querySelector(".fallbackLabel");
const hourSelect = document.querySelector("#hour");
const minuteSelect = document.querySelector("#minute");
// æåï¼éèåéå
ç´
fallbackPicker.style.display = "none";
fallbackLabel.style.display = "none";
// æµè¯ä¸ä¸ªæ°ç time è¾å
¥æ¡æ¯å¦ä¼åéè³ text è¾å
¥æ¡
const test = document.createElement("input");
try {
test.type = "time";
} catch (e) {
console.log(e.description);
}
// 妿åéäºï¼è¿è¡ if 代ç åä¸ç代ç
if (test.type === "text") {
// éèåçéæ©å¨ï¼æ¾ç¤ºåéå
ç´
nativePicker.style.display = "none";
fallbackPicker.style.display = "block";
fallbackLabel.style.display = "block";
// 卿çæå°æ¶ååéæ°
populateHours();
populateMinutes();
}
function populateHours() {
// çæå«æ 6 å°æ¶å¼æ¾æ¶é´ç <select>
for (let i = 12; i <= 18; i++) {
const option = document.createElement("option");
option.textContent = i;
hourSelect.appendChild(option);
}
}
function populateMinutes() {
// 对æ¯ä¸å°æ¶å¨æçæ 60 个代表åéæ°ç <select>
for (let i = 0; i <= 59; i++) {
const option = document.createElement("option");
option.textContent = i < 10 ? `0${i}` : i;
minuteSelect.appendChild(option);
}
}
// 妿尿¶æ°ä¸º 18ï¼åéæ°å¿
须设置为 00
// ä½ ä¸å¯ä»¥éæ©è¶
è¿ 18:00 çæ¶é´
function setMinutesToZero() {
if (hourSelect.value === "18") {
minuteSelect.value = "00";
}
}
hourSelect.onchange = setMinutesToZero;
minuteSelect.onchange = setMinutesToZero;
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4