最近寫了些hybird
應用嵌入的web
頁面,遇到的一些問題,稍稍的總結下:javascript
<p class="p1">測試1</p> <p class="p2">測試2</p> .p2 { font-size: 0.14rem; margin-top: 0.1rem; }
因爲2種機型的默認line-height
不一致,這和字體、瀏覽器的佈局模型、操做系統的字體渲染引擎,所以遇到這種狀況的時候會選擇手動的設置line-height
的值,而後再經過margin
或者padding
去控制2個p
標籤之間的間距。css
.p2 { font-size: 0.14rem; margin-top: 0.12rem; height: 0.14rem; line-height: 0.14rem; }
有個需求就是一進入到頁面,用戶不作任何操做,input
標籤就被獲取焦點,同時鍵盤被呼出。html
獲取焦點很容易作到,直接經過調用原生的focus()
事件就好了。可是不能直接喚起鍵盤。java
這是我關於這個問題的描述: IOS下Input元素focus後沒法喚起鍵盤android
文檔上說明的很清楚了。native
上keyboardDisplayRequiresUserAction
爲true
時。必需要經過用戶點擊屏幕去主動觸發鍵盤的喚起。ios
這個時候有2種方案了:git
直接點擊input
標籤,喚起鍵盤github
經過點擊屏幕的其餘區域,而後觸發input
的focus
事件,喚起鍵盤web
這個時候我是選擇的第二種方案:segmentfault
進入頁面後,給頁面加一層mask
,在mask
綁定點擊事件,經過這個點擊事件去觸發鍵盤的喚起.
let maskEle = document.querySelector('.mask'), inputEle = document.querySelector('.input'); maskEle.addEventListener('click', () => { inputEle.focus() //而後隱藏maskEle });
安卓機下4.x
的版本經過input
的focus
事件能夠直接喚起鍵盤,不過5.0
後也須要用戶去主動的喚起鍵盤.
dialog
組件:
.dialog { position: fixed; z-index: 999; }
若是頁面比較長,滑動頁面的時候,dialog
組件不動,可是dialog
下部的可能會滑動的頁面會滑動.
個人處理方法就是在dialog
的mask
上綁定:
document.querySelector('.dialog-mask').addEventListener('touchmove', e => e.preventDefault());
另外還能夠經過主動設置底部元素的overflow
屬性來控制是否能滑動.
let inputEle = document.querySelector('.input'); //限制空白符的輸入 inputEle.addEventListener('input', (e) => { let target = e.target; target.value = target.value.replace(/\s/g, ''); });
這個時候輸入中文的時候,英文字母也會被輸入.
經過改變input
監聽事件的類型:
inputEle.addEventListener('keyup', (e) => { let target = e.target; target.value = target.value.replace(/\s/g, ''); })
這樣就會避免輸入中文的時候連帶字母也被輸入進去了。另一種解決方案,利用compositionstart
和compositionend
屬性,具體解決過程請戳我
若是想要限制input
標籤輸入的位數,儘可能使用input
的maxlength
屬性.
不過在移動端, type="number"
的maxlength
不起做用。
這個時候可使用input
的pattern
來達到這一效果
<input type="text" pattern="\d*" maxlength="11">
不過pattern
這個屬性在移動端,特別是安卓機下的支持度不是很好.(查看兼容性請戳我)
在華爲的某款機型下,安卓版本爲4.2.2。設置:
.circle { width: 0.04rem; height: 0.04rem; border-radius: 100%; background-color: #333; }
這個時候,並無表現爲正常的黑色圓形,而是一個正方形。
具體的解決方案見.一絲的blog
:last-child
和:last-of-type
的區別:last-child
:first-child
:nth-child
3者都是從結構上來講的
<div class="parent"> <h1>1</h1> <h2>2</h2> <h3>3</h3> <h4>4</h4> </div>
h1:first-child
能夠匹配到第一個h1
h2:first-child
匹配不到元素
h3:first-child
匹配不到元素
h4:first-child
匹配不到元素
h4:last-child
匹配到最後一個元素
h1:first-of-type
能夠匹配到第一個h1
h2:first-of-type
匹配到h2
h3:first-of-type
匹配到h3
h4:first-of-type
匹配到h4
h4:last-of-type
匹配到最後一個元素
first-child
和first-of-type
的區別就是前者是匹配結構上的第一個元素,然後者是匹配子元素中同一類型元素的第一個元素.
同理:
nth-child
和 nth-of-type
last-child
和 last-of-type
測試機型:
華爲,oppo,小米安卓4.x的機型,頁面不發生滾動,軟鍵盤彈出都會遮擋input標籤
iphone 5+ 自帶的輸入法軟鍵盤彈出不會遮擋,頁面會發生滾動
iphone 5+ 訊飛輸入法,搜狗(頁面發生滾動,可是軟鍵盤有一段高出的部分遮擋了input標籤)
軟鍵盤彈出後會觸發resize
事件,監聽resize
事件完成頁面的自動滾動.
IOS下第三方輸入高出部分遮擋input標籤
暫時還未找到解決方案.
我的推薦的方案(less
):
.border-new-1px(@color, @radius, @style) { position: relative; &::after { content: ""; pointer-events: none; display: block; position: absolute; left: 0; top: 0; transform-origin: 0 0; border: 1px @style @color; border-radius: @radius; box-sizing: border-box; width: 100%; height: 100%; } @media (-webkit-min-device-pixel-ratio: 3) { &::before, &::after { width: 300%; height: 300%; -webkit-transform: scale(.33); -webkit-transform-origin: 0 0; transform: scale(.33); border-radius: @radius * 3; } &::before { -webkit-transform-origin: left bottom; } } @media (-webkit-min-device-pixel-ratio: 2) { &::after, &::before { width: 200%; height: 200%; border-radius: @radius * 2; -webkit-transform: scale(.5); transform: scale(.5); } } }
經過去檢測device-pixel-ratio
屬性(物理像素
和css像素
的比),例如當device-pixel-ratio
爲3
時,會將元素的長度和寬度擴大3倍,而後經過transform: scale(.33)
進行縮小。
另外還有一種 @Humphry 提供的方案也挺好用的:
使用svg
做爲background-image
來實現, 不過最好仍是使用預編譯封裝成函數, 這樣寫起來的效率也很高 具體方案請戳我.
在safari
下有這樣一個問題:
打印時間 alert(new Date('2012-12-12')); //在andriod機器下正常顯示,在ios機器下Invalid Date //當時看到後就是一臉黑人❓
在先後端的時間交互過程當中我以爲統一轉化爲時間戳仍是靠譜一點。避免不一樣瀏覽器對不一樣時間的解析方式不一樣而出現兼容性的問題