2016-08-17 106 views
5

免責聲明 - 我瞭解在safari中存在固定元素的問題,並且固定元素不受支持,但現在是等等。但是我找不到解決這個確切問題的問題。如何阻止移動Safari瀏覽器在輸入焦點上將固定位置設置爲絕對位置?

鑑於簡單的固定側邊欄,類似的:

.sidebar { 
    position: fixed; 
    top: 10px; 
    right: 10px; 
} 

和相對長的頁面,與輸入元素。

當一個輸入元素被聚焦時,任何固定的元素都變成絕對的 - 我明白爲什麼,safari試圖消除視口 - 這很好,但並不總是合適的。我要求我爲用戶選擇最好的體驗(我自然最瞭解)。

所以這個問題..

有什麼辦法離開固定的元素,即使輸入的元素都集中固定的嗎?

我試圖做一些$(window).on('scroll',魔術和定位元素手動滾動,但它對ipad的相當緊張。

+1

如果您想提供您的特定場景的MCV示例,我們可以玩。這是一個已知的問題,至今爲止,最好的解決方案是將該元素切換到絕對位置,並將其與JavaScript設置爲完全相同,如果Safari不會破壞它:它也可能適用於如果我們在頁面最頂部的字段上隱藏溢出,但是我發現這第二種方法太難懂了。 –

+1

今天晚上我會嘗試整理一個小場景。我同意這個已知的問題 - 我擔心最後的決定可能很簡單,手動干預並在需要時進行絕對定位 – Chris

+0

可能出現幾個SO問題的重複。有關詳細信息,請參閱https://gist.github.com/avesus/957889b4941239490c6c441adbe32398#gistcomment-2193547。 –

回答

3

Safari has supported position: fixed至少從版本9.2開始,但如果您遇到困難的問題,您可以通過使文檔元素和主體全屏,然後使用絕對定位來完全創建固定位置效果。滾動然後發生在一些主容器元素而不是主體。使用此方法,您的「固定」元素可以存在於標記中的任何位置。

jsfiddle here

html, 
body, 
.mainContainer { 
    height: 100%; 
    width: 100%; 
    overflow: hidden; 
    margin: 0; 
} 

.mainContainer { 
    overflow: auto; 
} 

.fixed { 
    position: absolute; 
    bottom: 20px; 
    left: 20px; 
} 
+0

問題指定了「關於輸入焦點」,但您的示例沒有提供可激活虛擬鍵盤的文本輸入控件。在用戶點擊文本輸入控件之前,事物會看起來很完美。 –

0

爲了實現你的願望,你需要你的方法改變佈局的影響。而不是定位側邊欄的位置:固定您需要使用位置:在一個位置的絕對:相對容器設置爲在該位置的視口的高度:相對容器,你需要另一個使用溢出YY:滾動和 - WebKit的溢出滾動:觸摸

買者:我一般儘量避免使用固定在平板電腦&移動如果可能的位置雖然瀏覽器的支持是有的,在我的經驗,這將是janky和JavaScript解決方案還有很大的提高是希望,我的第一反應就是與設計師挑戰模式。如果我給出的設計包含位置固定元素,當有輸入元素時,我更可能尋求設計解決方案而不是開發設計解決方案,因爲您所描述的焦點問題很難規避並保持高質量的用戶體驗。

標記

<div class="outer"> 
    <div class="sidebar"> 
    <ul> 
     <li>Dummy list nav or something</li> 

    </ul> 
    </div> 
    <div class="container"> 
     <input type="text" /> 
    <!-- I added 10000 inputs here as a demo --> 
</div> 
</div> 

的CSS

html,body{ 
-webkit-overflow-scrolling : touch !important; 
overflow: auto !important; 
height: 100% !important; 
} 
.outer { 
    position: relative; 
    overflow: hidden; 

/* I'm using Viewport Units here for ease, but I would more likely check the height of the viewport with javascript as it has better support*/ 
    height: 100vh; 
} 
.sidebar { 
    position: absolute; 
    top: 10px; 
    right: 10px; 
    /*added bg colour for demo */ 

    background: blue; 
} 
.container { 
    height: 100vh; 
    overflow-y: scroll; 
    -webkit-overflow-scrolling: touch 
} 
input { 
    display: block; 
} 

這裏有一個CodePen讓你在你的模擬器(演示文稿視圖)打開: https://codepen.io/NeilWkz/full/WxqqXj/

這裏的代碼編輯器視圖: https://codepen.io/NeilWkz/pen/WxqqXj

+0

它不起作用。 –

+0

嗨,布賴恩,感謝您的評論,核心機制似乎仍然在移動Safari中工作(我剛剛更改了筆鏈接以顯示到編輯器視圖。您在演示中看到的問題是什麼? – NeilWkz

+0

視口的高度通常需要在虛擬鍵盤顯示,旋轉和地址欄出現/消失之後進行更新。只有處理調整大小和焦點事件,以及在激活焦點之前將輸入控件位置移動到屏幕底部可以使iOS上的WebKit具有相同的行爲因爲谷歌瀏覽器在Android上運行良好的Safari瀏覽器 –

相關問題