iOS 8 “minimal-ui” viewport özelliğini kaldırdı, başka “yumuşak tam ekran” çözümleri var mı?


191

(Bu çok parçalı bir soru, senaryoyu özetlemek için elimden geleni yapacağım.)

Şu anda, kullanıcıların sekmeli içerikler arasında kaydırma yapmalarına ve sekmeli içeriklerin her birinde dikey olarak kaydırma yapmalarına olanak tanıyan duyarlı bir web uygulaması (haber okuyucu) oluşturuyoruz.

Sorunun yaygın yaklaşım sarmalayıcı sahip olmaktır divtarayıcı görünüm, set doldurur overflowiçin hiddenveya autodaha sonra kaydırma yatay ve / veya dikey onun içinde.

Bu yaklaşım harika ama bir dezavantajı var: belgenin yüksekliği tarayıcı görünümüyle tamamen aynı olduğundan, mobil tarayıcı adres çubuğunu / gezinme menüsünü gizlemeyecektir .

Orada sayısız kesmek ve görüntü kutusu özellikleri daha fazla ekran gayrimenkul elde etmemizi sağlayacak, ama hiçbiri oldukça gibi etkilidir minimal-ui(iOS 7.1 tanıtılan).

Dün, iOS 8 beta4'ün minimal-uiMobil Safari'den kaldırıldığına dair haberler geldi ( iOS 8 Sürüm Notları'ndaki Webkit bölümüne bakın ).

S1. Mobil Safari'de adres çubuğunu gizlemek hala mümkün müdür?

Bildiğim kadarıyla bildiğimiz gibi, iOS 7 artık cevap verir karşı window.scrollTohack, bu biz dikey düzeni veya kullanımını kabul sürece, daha küçük ekran alanı ile yaşamak zorunda önerir mobile-web-app-capable.

S2. Benzer bir yumuşak tam ekran deneyimine sahip olmak hala mümkün mü?

By yumuşak tam ekran gerçekten kullanmadan anlamına mobile-web-app-capablemeta etiketi.

Web uygulamamız erişilebilir olacak şekilde oluşturulmuştur, herhangi bir sayfaya yerel tarayıcı menüsü kullanılarak yer imi eklenebilir veya paylaşılabilir. Ekleyerek mobile-web-app-capable, kullanıcıların karıştırdığı ve antagonize ettiği bu menüyü (ana ekrana kaydedildiğinde) çağırmasını önleriz.

minimal-uiEskiden orta yoldaydı, menüyü varsayılan olarak gizliyor ancak bir dokunmayla erişilebilir tutuyor - Apple diğer erişilebilirlik endişeleri nedeniyle kaldırmış olabilir (kullanıcılar menüyü etkinleştirmek için nereye dokunacaklarını bilmiyor gibi).

Q3. Tam ekran deneyimi sorun çıkarmaya değer mi?

Tam ekran bir API'nın yakında iOS'a gelmeyeceği anlaşılıyor, ancak öyle olsa bile, menünün nasıl erişilebilir olacağını göremiyorum (Android'de Chrome için de aynı şey geçerli).

Bu durumda, belki de olduğu gibi mobil safariden ayrılmalı ve görünüm yüksekliğini hesaba katmalıyız (iPhone 5+ için 460 = 568 - 108, burada 108 işletim sistemi çubuğu, adres çubuğu ve gezinme menüsünü içerir; iPhone 4 veya daha eski, 372).

(Yerel bir uygulama oluşturmanın yanı sıra) bazı alternatifler duymak isterim.


minimal-ui'nin bazı uygulamalar için neden önemli olabileceğiyle ilgili daha fazla ayrıntı için stackoverflow.com/questions/18793072/… adresine bakın .
bitinn

1
Kaydırma / kaydırma olaylarıyla bir web uygulaması oluşturmak istediğimiz için iOS 7'de de aynı sorunla karşılaştım, ancak iOS8 Beta 4'te Scroll olaylarını test ettik ve çalışıyorlar. ios8-scroll-events.heroku.com Bunun işe yarayıp yaramadığından emin değilim.
Devin McInnis

Aynı sorunla karşılaştı. Şu anda sadece javascript "fix", aşağıdaki calc () fonksiyonu tek cevaptır. Daha iyi bir karar biliyorsanız lütfen bu konuyu güncel tutun. Saygılarımla.
A1exandr

Yanıtlar:


86

Minimum-ui viewport özelliği artık iOS 8'de desteklenmemektedir . Ancak, minimal-ui'nin kendisi gitmemiştir. Kullanıcı "u-sürükle" hareketi ile minimal-ui'ye girebilir.

Görüntüleme durumunu yönetmek için çeşitli ön koşullar ve engeller vardır, örneğin minimal-ui'nin çalışması için kullanıcının kaydırmasını sağlamak için yeterli içerik olmalıdır; minimal-ui'nin devam edebilmesi için, sayfa yüklendiğinde ve yön değiştirildikten sonra pencere kaydırması kaydırılmalıdır. Bununla birlikte, değişkeni kullanarak minimal-ui'nin boyutlarını hesaplamanın bir yolu yokturscreen ve dolayısıyla kullanıcı minimal-ui'de önceden olduğunda bunu söylemenin bir yolu yoktur.

Bu gözlemler, iOS 8 için Brim - view manager geliştirmenin bir parçası olarak yapılan araştırmanın bir sonucudur . Son uygulama şu şekilde çalışır:

Sayfa yüklendiğinde, Brim bir koşu bandı öğesi oluşturur. Koşu bandı elemanı, kullanıcıya kaydırma alanı sağlamak için kullanılır. Koşu bandı öğesinin bulunması, kullanıcının minimum kullanıcı arabirimi görünümüne girebilmesini ve kullanıcı sayfayı yeniden yüklediğinde veya aygıt yönünü değiştirdiğinde devam etmesini sağlar. Kullanıcı tarafından sürekli olarak görünmez. Bu öğenin kimliği var brim-treadmill.

Sayfayı yükledikten veya yönlendirmeyi değiştirdikten sonra Brim, sayfanın en az kullanıcı arayüzü görünümünde olup olmadığını tespit etmek için Scream'i kullanıyor (daha önce en az kullanıcı arayüzünde bulunan ve yeniden yüklenen sayfa, içerik yüksekliği görünüm yüksekliğinden daha büyük).

Sayfa minimal kullanıcı arayüzündeyken, Brim belgenin kaydırılmasını devre dışı bırakır (bunu ana öğenin içeriğini etkilemeyen güvenli bir şekilde yapar). Belge kaydırmayı devre dışı bırakmak, yukarı kaydırırken yanlışlıkla minimum kullanıcı arayüzünü bırakmayı önler. Orijinal iOS 7.1 spesifikasyonuna göre, üst çubuğa dokunmak kromun geri kalanını geri getiriyor.

Sonuç şöyle görünür:

İOS simülatöründe Brim.

Belgelerin uğruna, ve durumda kendi uygulama yazmayı tercih, bu kullanamazsınız fazlalaştı Çığlık cihaz olup olmadığını tespit etmek için minimal ui hemen sonra orientationChange olayı nedeniyle windowboyutları kadar yeni yönelimini yansıtmaz döndürme animasyonu sona erdi. Orientationchangeend olayına bir dinleyici eklemeniz gerekir .

Çığlık ve oryantasyon değişimi bu projenin bir parçası olarak geliştirilmiştir.


3
Bu, orijinal
cevabımdan

4
Hoş görünüyor! İlk kaydırma olmadan minimal-ui'yi zorlayabilir miyim?
INT

50
Bu gerçekten hiç bitmeyen bir hikaye. HTML'de bir oyun geliştiriciyim ve iOS 7.1'de minimal ui gayet iyi çalıştı - bir uygulamanın tam ekran çalışmasını ve aynı zamanda ekranın alt kısmına dokunabilmesinin tek yoluydu. Sayfa kaydırma ile çözümler güzel, ancak yeterince iyi değil :( Apple, oyunlar için tam ekran API'nin doğru bir şekilde uygulanmasına ihtiyacımız var.
Petr Urban

4
@Petr: Daha fazla anlaşamadım. Bu düzeltme 7.1'de duyurulduğunda, hızlı bir şekilde birincil CTA'yı ekranın altına sabitleyen yeni bir satın alma akışı gerçekleştirdik. Çok "yerli" ve kesintisiz hissettim. Bence bu tam bir problem. Bunu düşünürseniz, web uygulamalarının yerel hissetmesi Apple'ın en büyük ilgisi değildir. Aslında App Store tekelleri ile doğrudan bir çıkar çatışmasıdır. IMO, bu kadar anlamlı bir özelliğin düzeltilmesinin ve daha sonra kasıtlı olarak kaldırılmasının tek geçerli nedeni. # my2Cents :)
Jose Browne

2
@PetrUrban Apple'ın oyununuzu web üzerinden hizmet vermenize izin vermekten ziyade bir telefon haritası uygulaması olarak yayınlamanızı tercih ettiğine inanıyorum. Safari için reklam engelleyicilere izin verme konusundaki son kararları bu fikri ifade ediyor.
Patrick Gunderson

20

Taklit etmek için programlı bir yol olmadığından minimal-ui, calc()iOS adres çubuğu yüksekliğini kendi avantajımıza kullanarak ve bildiğimiz farklı bir çözüm bulduk :

Aşağıdaki demo sayfası ( aynı zamanda gist, daha fazla teknik ayrıntıda da mevcuttur ) kullanıcının kaydırma yapmasını isteyecektir, bu da üstbilginin ve içeriğin yeni görünüm penceresini doldurduğu bir yumuşak tam ekranı (adres çubuğunu / menüsünü gizle) tetikler.

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Scroll Test</title>

    <style>
        html, body {
            height: 100%;
        }

        html {
            background-color: red;
        }

        body {
            background-color: blue;
            margin: 0;
        }

        div.header {
            width: 100%;
            height: 40px;
            background-color: green;
            overflow: hidden;
        }

        div.content {
            height: 100%;
            height: calc(100% - 40px);
            width: 100%;
            background-color: purple;
            overflow: hidden;
        }

        div.cover {
            position: absolute;
            top: 0;
            left: 0;
            z-index: 100;
            width: 100%;
            height: 100%;
            overflow: hidden;
            background-color: rgba(0, 0, 0, 0.5);
            color: #fff;
            display: none;
        }

        @media screen and (width: 320px) {
            html {
                height: calc(100% + 72px);
            }

            div.cover {
                display: block;
            }
        }
    </style>
    <script>
        var timeout;

        window.addEventListener('scroll', function(ev) {

            if (timeout) {
                clearTimeout(timeout);
            }

            timeout = setTimeout(function() {

                if (window.scrollY > 0) {
                    var cover = document.querySelector('div.cover');
                    cover.style.display = 'none';
                }

            }, 200);

        });
    </script>
</head>
<body>

    <div class="header">
        <p>header</p>
    </div>
    <div class="content">
        <p>content</p>
    </div>
    <div class="cover">
        <p>scroll to soft fullscreen</p>
    </div>

</body>
</html>

10

Sadece minimal-ui'ye veda et (şimdilik)

Doğru, minimal-uihem yararlı hem de zararlı olabilir ve sanırım artık daha yeni, daha büyük iPhone'lar lehine başka bir denge var.

HTML5 uygulamaları için js çerçevemle çalışırken bu sorunu ele alıyorum. Her biri dezavantajları olan birçok girişim çözümünden sonra, 6'dan önceki iPhone'larda alan kaybolduğunu düşünmeye teslim oldum. Durum göz önüne alındığında, tek katı ve öngörülebilir davranışın önceden belirlenmiş bir davranış olduğunu düşünüyorum.

Kısacası, herhangi bir minimal-ui formunu önledim , bu yüzden en azından ekran yüksekliğim her zaman aynı ve uygulamanız için hangi gerçek alana sahip olduğunuzu her zaman biliyorsunuz.

Zamanın yardımı ile, yeterli sayıda kullanıcının daha fazla yeri olacaktır.


DÜZENLE

Nasıl yaparım

Bu, demo amacıyla biraz basitleştirilmiştir, ancak sizin için çalışmalıdır. Bir ana konteyneriniz olduğunu varsayarsak

html, body, #main {
  height: 100%;
  width: 100%;
  overflow: hidden;
}
.view {
  width: 100%;
  height: 100%;
  overflow: scroll;
}

Sonra:

  1. sonra js ile, #mainyüksekliğini pencerenin mevcut yüksekliğine ayarladım . Bu aynı zamanda hem iOS hem de Android'de bulunan diğer kaydırma hatalarıyla başa çıkmanıza yardımcı olur. Ayrıca, nasıl güncelleneceğini ele almanız gerektiği anlamına gelir;

  2. Kaydırma sınırlarına ulaştığında aşırı kaydırmayı engelliyorum. Bu benim kod biraz daha derin, ama ben de temel işlevsellik için bu cevap ilkesini takip edebilirsiniz düşünüyorum . Sanırım biraz titreyebilirdi, ama işi yapacak.


Demoyu izleyin (iPhone'da)

Bir sidenote olarak: Bu uygulama da adresleri karma yapmak için dahili bir yönlendirme kullandığından yer imi olarak kullanılabilir, ancak aynı zamanda iOS kullanıcılarına eve eklemelerini isteyen bir bilgi ekledim. Bu şekilde sadakat ve geri dönen ziyaretçilere yardımcı olduğunu hissediyorum (ve böylece kayıp alan geri döndü).


Minimal-ui'yi devre dışı bırakmak benim için çok makul görünüyor. Lütfen, bunun nasıl yapılacağı hakkında kısa bir açıklama ekleyin!
István Pálinkás

Haklısın, biraz nasıl ekledim. Diğer birçok yol işe yarayacaktır.
Francesco Frapporti

1
Demo 5, iPhone 5'e göre
iOS8'de çalışmıyor

Bana bildirdiğiniz için teşekkür ederim, eskiden çalıştığı için bazı güncelleme olmalı. Safari'de misin? Tam olarak bununla çalışmadığını ne demek istiyorsun?
Francesco Frapporti

7

Bunu düzeltmek için bulduğum en kolay yolu, kullanıcı aracısının bir iphone olduğu herhangi bir istek için vücut ve html öğelerinin yüksekliğini% 100.1'e ayarlamaktı. Bu sadece Manzara modunda çalışır, ama tüm ihtiyacım olan bu.

html.iphone, 
html.iphone body { height: 100.1%; }

Https://www.360jungle.com/virtual-tour/25 adresinden kontrol edin


Teşekkürler @Stephen. boy:% 100.1 bana yardımcı oldu. Ancak, iPhone (iOS 11.1.1) Safari'de 360jungle.com/virtual-tour/25 öğesini açıp alttaki düğmeleri tıkladığımda adres ve araç çubuğu belirdi. Bunun nedeni, düğmelerin ekranın sonuna çok yakın olmasıdır. Onları mobil modda başka bir yere taşımak daha iyi olurdu sanırım.
Aralık'ta Téwa

2

Buradaki temel sorun, içerik görünüm penceresine eşit veya daha küçükse, aşağı kaydırırken iOS8 safarisinin adres çubuğunu gizlemediği anlaşılıyor.

Bildiğiniz gibi, altına bir miktar dolgu eklemek bu sorunu çözüyor:

html {
    /* enough space to scroll up to get fullscreen on iOS8 */
    padding-bottom: 80px;
}
// sort of emulate safari's "bounce back to top" scroll
window.addEventListener('scroll', function(ev) {
    // avoids scrolling when the focused element is e.g. an input
    if (
        !document.activeElement
        || document.activeElement === document.body
    ) {
        document.body.scrollIntoViewIfNeeded(true);
    }
});

Yukarıdaki css koşullu olarak uygulanmalıdır, örneğin UA koklama gt-ios8sınıfına bir sınıf ekleyerek <html>.


1
Bu JS tam olarak ne yapıyor?
Ben Sinclair

Eğer atıfta bulunuyorsanız scrollIntoViewIfNeeded, scrollIntoView( developer.mozilla.org/en-US/docs/Web/API/Element.scrollIntoView ) standart olmayan bir türevidir . Adından da anlaşılacağı gibi, yöntem öğeyi görünüme kaydırır. trueparametresi, görünümü öğenin üst kısmıyla hizalamak için kullanılır. Bu aslında kaydırma yapmanızı engellemelidir. Uygulama yine de kusurlu.
Gajus

1

Düşüncelerimi yorumlamak / kısmen cevaplamak / paylaşmak istiyorum. Gelecek büyük bir projem için taşma-y: kaydırma tekniğini kullanıyorum. Bunu kullanmanın iki ana avantajı vardır.

a) Ekranın alt kısmındaki işlem düğmelerine sahip bir çekmece kullanabilirsiniz; belge kaydırılırsa ve alt çubuk kaybolursa, ekranın altında bulunan bir düğmeye dokunmak önce alt çubuğun görünmesini ve ardından tıklanabilir olmasını sağlar. Ayrıca, bu şeyin çalışma şekli, en altta düğmeler olan modals ile ilgili sorunlara neden olur.

b) Taşan bir eleman kullanıldığında, büyük css değişiklikleri durumunda yeniden boyanan tek şey görüntülenebilir ekranda olanlar. Bu, anında birden çok öğenin css'sini değiştirmek için javascript kullanırken büyük bir performans artışı sağladı. Örneğin, 20 öğeden oluşan bir listeniz varsa, yeniden boyanmanız gerekir ve taşan öğede sadece ikisi ekranda kalırsa, kayarken kaydırma sırasında yalnızca ikisi yeniden boyanırken yeniden boyanır. Onsuz 20 element de yeniden boyanır.

Tabii ki projeye ve bahsettiğim işlevselliklerden herhangi birine ihtiyacınız varsa. Google, Gmail'de a) 'da tanımladığım işlevselliği kullanmak için taşmış öğeleri kullanır. Imo, daha eski iPhone'lardaki küçük yüksekliği bile düşündüğünüz zamana değer (372 piksel).


1

İOS 11'de tam olarak çalışmayan ( https://gist.github.com/bitinn/1700068a276fb29740a7 ) işinin yardımıyla bir araya getirdiğim aşağıdaki örnek gibi bir şey kullanmak mümkündür :

İşte iOS 11.03'te çalışan değiştirilmiş kod, lütfen sizin için işe yaradıysa yorum yapın.

Anahtar, BODY'ye bir boyut eklemektir, böylece tarayıcı kayabilir, örn: height: calc (% 100 + 40 piksel);

Aşağıda tam örnek ve tarayıcınızda görüntülemek için bağlantı (lütfen test edin!)

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CodeHots iOS WebApp Minimal UI via Scroll Test</title>

    <style>
        html, body {
            height: 100%;
        }
        html {
            background-color: red;
        }
        body {
            background-color: blue;
            /* important to allow page to scroll */
            height: calc(100% + 40px);
            margin: 0;
        }
        div.header {
            width: 100%;
            height: 40px;
            background-color: green;
            overflow: hidden;
        }
        div.content {
            height: 100%;
            height: calc(100% - 40px);
            width: 100%;
            background-color: purple;
            overflow: hidden;
        }
        div.cover {
            position: absolute;
            top: 0;
            left: 0;
            z-index: 100;
            width: 100%;
            height: 100%;
            overflow: hidden;
            background-color: rgba(0, 0, 0, 0.5);
            color: #fff;
            display: none;
        }
        @media screen and (width: 320px) {
            html {
                height: calc(100% + 72px);
            }
            div.cover {
                display: block;
            }
        }
    </style>
    <script>
        var timeout;

        function interceptTouchMove(){
            // and disable the touchmove features 
            window.addEventListener("touchmove", (event)=>{
                if (!event.target.classList.contains('scrollable')) {
                    // no more scrolling
                    event.preventDefault();
                }
            }, false); 
        }

        function scrollDetect(event){
            // wait for the result to settle
            if( timeout ) clearTimeout(timeout);

            timeout = setTimeout(function() {
                console.log( 'scrolled up detected..' );
                if (window.scrollY > 35) {
                    console.log( ' .. moved up enough to go into minimal UI mode. cover off and locking touchmove!');
                    // hide the fixed scroll-cover
                    var cover = document.querySelector('div.cover');
                    cover.style.display = 'none';

                    // push back down to designated start-point. (as it sometimes overscrolls (this is jQuery implementation I used))
                    window.scrollY = 40;

                    // and disable the touchmove features 
                    interceptTouchMove();

                    // turn off scroll checker
                    window.removeEventListener('scroll', scrollDetect );                
                }
            }, 200);            
        }

        // listen to scroll to know when in minimal-ui mode.
        window.addEventListener('scroll', scrollDetect, false );
    </script>
</head>
<body>

    <div class="header">
        <p>header zone</p>
    </div>
    <div class="content">
        <p>content</p>
    </div>
    <div class="cover">
        <p>scroll to soft fullscreen</p>
    </div>

</body>

Tam örnek bağlantı: https://repos.codehot.tech/misc/ios-webapp-example2.html



-3

İOS için web tasarımı yapmadım, ancak WWDC oturumlarında ve belgelerinde gördüğümden hatırladığım kadarıyla, Mobil Safari'deki arama çubuğu ve işletim sistemi genelinde gezinme çubukları, içeriğinizin daha fazlasını göstermek için otomatik olarak yeniden boyutlandırılacak ve küçülecek.

Bunu iPhone'da Safari'de test edebilir ve bir sayfada daha fazla içerik görmek için sayfayı aşağı kaydırdığınızda gezinme / arama çubuğunun otomatik olarak gizlendiğini fark edebilirsiniz.

Belki de adres çubuğunu / gezinme çubuğunu olduğu gibi bırakmak ve tam ekran deneyimi yaratmamak en iyisidir. Yakında Apple'ın bunu yaptığını görmüyorum. Ve en çok, adres çubuğu gösterildiğinde / gizlendiğinde otomatik olarak kontrol etmezler.

Tabii, özellikle iPhone 4 veya 4S'de ekran gayrimenkulünü kaybediyorsunuz, ancak Beta 4'ten başka bir alternatif yok gibi görünüyor.


1
İOS7 + 'nın bu özelliğini biliyordum, ancak yukarıdaki açıklamama bakın: belgenin yüksekliği tarayıcı görünümüyle tamamen aynı olduğundan, mobil tarayıcı adres çubuğunu / gezinme menüsünü gizlemeyecektir , çünkü belge düzeyinde kaydırma yapılmaz.
Bitinn

1
Bu, Beta 4'ün bu özelliği kaldırdığı için bir sınırlama olabilir. Apple'ın adres çubuğunu otomatik olarak kontrol etmesi ve geliştiricilerin erişmesini engellemesi olasıdır ve muhtemelen.
iFeli

8
I haven't done web design for iOS- web tasarımı yapıyorsanız, bunu her platform için yaparsınız. Çünkü web her platformda.
ProblemsOfSumit

4
@Sumit Web üzerinde çalışmanın evrensel olduğunu biliyorum, ancak her tarayıcının ve temel çerçevelerinin belirli CSS özellikleri var. Bu nedenle Chrome'un Safari ve FireFox ve viceversa için kullanılamayan bazı özellikleri olabilir.
iFeli
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.