Mobile Safari bug on fixed pozycjonowany przycisk po scrolltop programowo zmieniony...?

Właśnie skończyłem stronę internetową, ale jest jeden błąd w mobilnym Safari (iPhone i iPad iOS 5.0.1) z dwoma przyciskami, które są przymocowane do górnego i dolnego prawego rogu..

Przyciski są wyblakłe dopiero po kliknięciu Wyślij na polu tekstowym, które otwiera się na resztę strony... Po załadowaniu reszty strony i wyblaknięciu przycisków możesz kliknąć jeden z nich i oba działają...

Jednak ich kliknięcie powoduje programowy zwój i po przewijanie jest zakończone nie możesz już klikać żadnego z przycisków, dopóki fizycznie nie przewijasz strony palcem nawet o jeden piksel...

Zauważyłem, że po programowym przewijaniu, jeśli dotkniesz nieco poniżej górnego przycisku, zobaczysz podświetlenie tak, jakbyś dotykał dolnego przycisku, a działanie dolnego przycisku jest przetwarzane, co mówi mi, że błąd polega na tym, że podczas przewijania programowo przycisk o ustalonej pozycji nadal porusza się z reszta strony i nie wraca do stałej pozycji, dopóki nie zostanie wykonane rzeczywiste przewinięcie dotykowe....

Czy ktoś wie jak to obejść..?

Dodałem wyskakujące okienko, które pokazuje, który przycisk został naciśnięty, abyś mógł go przetestować, pamiętaj, że po pierwszym naciśnięciu przycisku w dół (co działa), próbując ponownie nacisnąć w dół, nie zadziała, ale kliknij tuż pod przyciskiem w górę, a zobaczysz akcje przycisku w dół dzieje się....

Http://www.tsdexter.com/ceos

Dzięki za pomoc.

Tomasz

(również jeśli możesz wskazać mi gdzie mogę zgłosić błąd Do Apple ' a to też by było dobre, chyba że już taki był)

EDIT: po prostu kliknij jedną ze strzałek wyślij, nie musisz wpisywać wynagrodzenia / wynagrodzenia, które ma domyślne

EDIT 2: Oto prostszy przykład do pokazania tego samego problem..

Http://www.tsdexter.com/MobileSafariFixedPosBug.html

EDIT 3: błąd zgłoszony do Apple

Author: tsdexter, 2012-01-06

11 answers

Obejrzałem go dodając 101% wysoki div, a następnie (prawie) natychmiast usuwając go.

Try:

<style>
.iosfix {
  height: 101%;
  overflow: hidden;
}
</style>

A kiedy przewijasz:

window.scrollTo(0, _NEW_SCROLLTOP_);
$('body').append($('<div></div>').addClass('iosfix'));
setTimeout(function() {
  $('.iosfix').remove();
}, 500);

Działa również z jQuery.scrollTo.

Zobacz przykład tutaj .

 13
Author: Chad Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-03 21:36:01

Napotkaliśmy również ten błąd na 2 różnych aplikacjach na iPada, dla nas najlepszą poprawką było tymczasowe usunięcie stałej pozycji ze stałego elementu po zakończeniu animowanego przewijania, a następnie użycie okna.przewijanie z wartością pionową, do której właśnie wykonaliśmy animowane przewijanie, a następnie ponownie Zastosuj styl pozycji stałej. Powoduje to bardzo niewielki blip, ponieważ ipad ponownie renderuje element, ale jest lepszy od błędu.

var $fixedElement = $('#fixedNavigation');
var topScrollTarget = 300;
$("html:not(:animated),body:not(:animated)").stop().animate({ scrollTop: topScrollTarget }, 500, "swing", function(evt) {
    $fixedElement.css({ "position": "relative" });
    window.scroll(0, topScrollTarget );
    $fixedElement.css({ "position": "fixed" });
});
 28
Author: Dominic Warren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-21 16:26:19

Miałem wiele linków na oddzielnych stałych elementów (modalne popup + stałe div blackout + normalny stały pasek narzędzi) i żadna z tych odpowiedzi nie działała, więc miałem Majsterkowanie o próbowaniu wariacji na ten sam temat. Jak wszystko to sugeruje, kluczem jest ponowne renderowanie elementów.

Początkowo próbowałem dodać 1px do szerokości elementów stałych i usunąć go. To spowodowało ponowne renderowanie, ale ponownie renderowane elementy stały się źle dopasowane do elementów Nie ponownie renderowanych - kolejny wynik tego systemu iOS bug, którego podejrzewam. Odpowiedź brzmiała po prostu dodać do szerokości ciała i odjąć ponownie (lub ustawić na auto), czyli:

//jQuery will calculate the current width and then +1 to this and set it
$('body').css('width', '+=1');

//Remove width css
setTimeout(function() {
  $('body').css('width', '');
}, 1);

Jeśli nie używasz jquery, będziesz musiał uzyskać bieżącą szerokość ciała +1px do niego, a następnie ustawić szerokość.

 7
Author: Ed Kirk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-09 13:01:00

Oto moje rozwiązanie, jeśli tak jak ja, żadne z poprzednich rozwiązań nie działa dla Ciebie.

Sztuczka jest:

  • wykonaj swój scroll (Animate lub scrollTo itp.)
  • tuż po przewijaniu, pozycja: absolute your fixed elements
  • w zdarzeniu 'touchmove' Przywróć pozycję: fixed

Oto przykład:

  $('body').animate({
       scrollTop: newPos}, 1000, 'jswing', function () {
          $('header').css({position:'absolute', top:newPos});
  });

  $(document).bind('touchmove',function(){
       $('header').css({position:'fixed', top:'0px'});
  });   

Użyłem tej samej sztuczki dla lepkiej stopki i innych pływających elementów stałych.

 4
Author: Stephane Brillant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-03 20:21:18

U mnie też zadziałała taka odmiana. Staram się nie używać frameworków, gdzie mogę na komórce.

    var d = document.createElement("div");
    d.style.height = "101%";
    d.style.overflow = "hidden";
    document.body.appendChild(d);
    window.scrollTo(0, scrollToM);
    setTimeout(function() {
        d.parentNode.removeChild(d);
    }, 10);
 3
Author: httpete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 18:17:09


Po spędzeniu kilku godzin nad tym, znalazłem obejście: spróbuj przewijać (może z animacją), a następnie przewijać ponownie do tego samego punktu (bez animacji).
W ten sposób zmuszasz przeglądarkę do usunięcia błędnego renderowania z widoku.

Przykład:

$('body, html')
    .animate({scrollTop: 0})
    .scrollTop(0);
 2
Author: Luca De Angelis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-24 03:18:48

Miałem ten sam problem z iOS5 i JQueryMobile. Poprawiono Nagłówek I Stopkę. Rozszerzalna zawartość i nagle miałem stopkę ducha, którą można było zobaczyć, ale nie dotknąć. Miałem mały problem z uzyskaniem prostej zmiany pozycji na absolute, a następnie z powrotem do pracy. Wydawało się, że działa tylko przez jakiś czas. Skończyło się na tym.

        $(myFixedFooter).css("position", "relative").hide(0, function () {
            $(this).show(0).css("position", "");
        });

To wyzywająco tworzy "blip", gdy stopka robi swoje. Hoever znalazłem, że około 98% czasu stopka pozostała na dole strony. Wszystkie inne poprawki i poprawki, które znalazłem i próbowałem, nie zawsze zostawiały stopkę na dole lub nie rozwiązywały problemu w pierwszej kolejności.

Mam nadzieję, że Apple wkrótce naprawi.

 1
Author: JDubDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-19 05:49:53

Odkryłem dokładnie zachowanie, które opisujesz w aplikacji na iPhone ' a, którą piszę. Ładuję kilka tekstu HTML z indeksem po prawej stronie. Po wybraniu elementu z menu i przewinięciu tekstu menu przestało odpowiadać (ponieważ strefa lądowania przewijała się spod niego). Zauważyłem również, że nawet mały przewijak tekstu przywróci menu indeksu.

Stworzyłem przypadek testowy i wgrałem tutaj Plik (jeśli wyświetlasz go w przeglądarce innej niż iPhone, zrób okno małe pionowo, aby zobaczyć poprawne zachowanie):

Http://www.misterpeachy.com/index_test.html

Zorientowałem się, że menu indeks przewijało się wraz z tekstem (nawet jeśli widoczne menu się nie poruszało) po tym, jak stuknąłem B, a następnie ponownie stuknąłem B. Zamiast przewijać do B (w zasadzie nie poruszając się), przewijało się do D.

Teraz utknąłem. Mam nadzieję, że uda mi się dodać jakiś kod JavaScript (nigdy nie programowałem w JavaScript, więc jest to mały problem), który przewija tekst o jeden piksel po uniesieniu palca z pozycji menu (i oczywiście po przewinięciu tekstu w wybrane miejsce). Może JavaScript może wykryć przewijanie, a następnie dodać kolejne przewijanie do tego.

 0
Author: Cliff Harris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 04:38:54

W przypadku, gdy może komuś pomóc:

Miałem dokładnie ten sam problem, a mój kod wyglądał mniej więcej tak (jest to jednostronicowa webapp):

window.scrollTo(0,0);
$('section.current').removeClass('current');
$(target).addClass('current');
Spędziłem godziny próbując wszystkiego (101% wysokości divów, zmieniając typ pozycji...), ale w końcu ostatnia sugestia opisana na Device-Bugs uratowała dzień. W moim przypadku to tylko kwestia przewijania, gdy divy nie są renderowane:
$('section.current').removeClass('current');
window.scrollTo(0,0);
$(target).addClass('current');
 0
Author: Gromix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 15:25:15

Inną odmianą rozwiązania jest zwiększenie rozmiaru szerokości dokumentu o 1px, a następnie natychmiastowe jego cofnięcie. Ma to tę zaletę, że nie tworzy więcej elementów i nie ma żadnego migotania, którego doświadczyłem.

Https://stackoverflow.com/a/11479118/43217

 0
Author: mckamey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:32:31

Przykładowy kod

if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
    $(document).on('focus', 'input, textarea', function() {
        $('header').css({'position':'static'});
    });
    $(document).on('blur', 'input, textarea', function() {
        $('header').css({'position':'fixed'});
    });
}
 0
Author: ShibinRagh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 11:29:41