2012-06-22 13 views
7

Esiste un metodo affidabile per rilevare se il browser supporta position fixed?Rileva se il browser supporta la posizione: fisso

Ho trovato alcune soluzioni ma nessuna sembra funzionare correttamente su tutti i browser.

+0

Per quale elemento? –

+0

Intendi qualcosa per un * sticky footer * o simile? –

risposta

9

Durante lo sviluppo di un'applicazione mobile con jQuery Mobile ho avuto lo stesso problema. Le intestazioni dovrebbero hanno fissato la posizione (se supportato dal browser) e la soluzione era quella di impostare le intestazioni con un default position: fixed sul CSS e controllato la proprietà sostenuti attraverso il seguente metodo:

function isPositionFixedSupported() { 
    return $('[data-role="header"]').css('position') === 'fixed'; 
} 

Il valore restituito è static se non supportato dal browser.

3

Questo codice funziona perfettamente. Appena testato su una scatola di Windows ME con IE6, restituisce 'null' perché IE6 non supporta position:fixed;.

a proposito, questo NON è originariamente il mio codice. TUTTI i crediti vanno aKangax's Githubche ha molte funzioni lì per testare le caratteristiche del browser.

function() { 
    var container = document.body; 
    if (document.createElement && 
    container && container.appendChild && container.removeChild) { 
    var el = document.createElement("div"); 
    if (!el.getBoundingClientRect) { 
     return null; 
    } 
    el.innerHTML = "x"; 
    el.style.cssText = "position:fixed;top:100px;"; 
    container.appendChild(el); 
    var originalHeight = container.style.height, originalScrollTop = container.scrollTop; 
    container.style.height = "3000px"; 
    container.scrollTop = 500; 
    var elementTop = el.getBoundingClientRect().top; 
    container.style.height = originalHeight; 
    var isSupported = elementTop === 100; 
    container.removeChild(el); 
    container.scrollTop = originalScrollTop; 
    return isSupported; 
    } 
    return null; 
} 

Se funziona, funziona, se non lo fa, si otterrà un nullo.

+0

Questa soluzione non funziona su iOS 5. –

+0

Questo perché IOS5 è una donna volubile. Si prega di consultare i documenti relativi a [position: fixed e l'ultima distribuzione di jQM] (http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/) – Ohgodwhy

+0

È questo l'unico noto problema? È sicuro utilizzare questo metodo seguito da un'eccezione per iOS 5? –

-1

Il codice di Ohgodwhy è corretto, ma per iOS è possibile controllare l'agente utente e verificare se si tratta di Safari iOS. Quindi restituire che è supportato. Le stringhe user agent sono

Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3 
Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3 
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7 

Non sono sicuro di come codificare questo, ma sono sicuro che questo è ciò che devi fare per rilevare iOS.

+2

Lo sniffing del dispositivo non è e non sarà mai un modo affidabile per rilevare le funzioni su tutti i browser. – user2867288

1

Qualcosa di simile funziona sui browser per dispositivi mobili?

function isFixedPositionSupported() { 
    var e = document.createElement('div') 
    try { 
     e.style.position = 'fixed' 
     return e.style.position == 'fixed' 
    } catch (exception) { 
     return false 
    } 
} 
+1

Non funziona, restituisce sempre true anche se non supportato. –

+0

Lavora su firefox e Chrome. – fred727

1
var supportFixed = (function() { 
    var elem = document.createElement('div'); 
    elem.style.cssText = 'position:fixed'; 
    if (elem.style.position.match('fixed')) return true; 
    return false; 
}()); 
+0

questa sembra la soluzione migliore per me di gran lunga. ho usato jQuery essere al sicuro. var $ test = $ ("

"); $ ("body"). Append ($ test); $ test.css ("position", "fixed"); var supportFixed = $ test.css ("position") === "fixed"; $ test.remove(); --- ma questo non ha risolto il mio problema.ios4 dice che supporta fisso anche se non lo fa. –

+0

Fornisce un falso positivo su iPad a causa del suo pseudo supporto di posizione: risolto – nebulousGirl

Problemi correlati