Zapobiegaj powiększaniu iPhone'a na `wybierz 'w aplikacji internetowej


87

Mam ten kod:

<select>
    <option value="c">Klassen</option>
    <option value="t">Docenten</option>
    <option value="r">Lokalen</option>
    <option value="s">Leerlingen</option>
</select>

Działa w pełnoekranowej aplikacji internetowej na iPhonie.

Wybierając coś z tej listy, iPhone powiększa select-element. I nie zmniejsza się po wybraniu czegoś.

Jak mogę temu zapobiec? Albo pomniejszyć?

Odpowiedzi:


108

Dzieje się tak prawdopodobnie dlatego, że przeglądarka próbuje powiększyć obszar, ponieważ rozmiar czcionki jest mniejszy niż próg, zwykle dzieje się tak w przypadku iPhone'a.

Podanie atrybutu metatagu „user-scalable = no” ograniczy użytkownikowi możliwość powiększania w innym miejscu. Ponieważ problem dotyczy tylko elementu select , spróbuj użyć poniższego w swoim css, ten hack jest pierwotnie używany w jquery mobile.

HTML:

<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">

CSS:

select{
font-size: 50px;
}

src: unzoom po wybraniu w iphone


21
Jeśli tekst jest widoczny (tak jak w moim przypadku), wydaje się, że 16px to minimum przed włączeniem powiększenia.
Marlon Creative

6
Żeby było jaśniej, ta linia zapobiegnie autoskalowaniu:$('<meta>', {name: 'viewport',content: 'user-scalable=no'}).appendTo('head');
Abbas

11
Od kiedy tekst jest ukryty w zaznaczonym elemencie? „Nie spowoduje żadnych problemów z układem”
Bill

1
@Billy Mam na myśli to, że kiedy rozmiar czcionki ma wartość 50px, wygląda to dziwnie na innych elementach html niż lista rozwijana, którą nazwałem problemem z układem.
Sasi Dhar

1
Ale jeśli chcesz zezwolić na skalowanie użytkownika ze względu na problemy z dostępnością lub z jakiegokolwiek innego powodu, zapoznaj się z odpowiedzią poniżej stackoverflow.com/questions/6483425/ ...
otrzymałem

53

user-scalable = no jest tym, czego potrzebujesz, tak więc istnieje ostateczna odpowiedź na to pytanie

<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">

4
Właściwie dodanie width = device-width, initial-scale = 1.0, maximum-scale = 1.0 powinno wystarczyć. Nie wierzę, że potrzebujesz skalowalności użytkownika z maksymalną skalą.
Dan Smart,

2
@DanSmart, przynajmniej w moim przypadku (i nie wiem, co go wyróżnia), skala min / max nie wystarczyła - dodanie user-scalable = no zrobiło różnicę.
corolla

8
Wydaje się, że jest to bardzo trudne podejście - zalecam ostrożnie używanie skalowalnego przez użytkownika = nie. Od Dev.Opera : „Możliwe jest również całkowite wyłączenie powiększania, jednak należy pamiętać, że powiększanie jest ważną funkcją ułatwień dostępu, z której korzysta wiele osób. Dlatego wyłączanie jej powinno mieć miejsce tylko wtedy, gdy jest to naprawdę konieczne, na przykład określone typy gier i aplikacji ”.
Charlie Stanard

4
skalowalne przez użytkownika jest ignorowane od iOS 10.
nickdnk,

1
Gdy czcionka jest większa niż 16 pikseli, przeglądarka może pomniejszyć, gdy fokusuje wejście. U mnie wystarczyło tylko dodać minimum-scale=1, co jednocześnie zachowuje możliwość powiększania przez użytkownika.
Micros

33

Wydawało się, że działa to w moim przypadku w rozwiązaniu tego problemu:

@media screen and (-webkit-min-device-pixel-ratio: 0) {
select:focus, textarea:focus, input:focus {
        font-size: 16px;
    }
}

Zaproponowane tutaj przez Christinę Arasmo Beymer


2
W moim przypadku IOS 7x stary skalowalny przez użytkownika nie wystarczył. Powyższe załatwiło sprawę, dziękuję za udostępnienie.
wylądował

27

iPhone nieznacznie powiększy pola formularza, jeśli tekst jest ustawiony na mniej niż 16 pikseli . Sugerowałbym ustawienie tekstu pola formularza mobilnego na 16 pikseli, a następnie zastąpienie rozmiaru z powrotem w przypadku komputerów stacjonarnych.

Odpowiedzi mówiące o wyłączeniu zoomu nie są pomocne dla niedowidzących użytkowników, którzy mogą nadal chcieć powiększać na mniejszych telefonach komórkowych.

Przykład:

# Mobile first
input, textarea, select {
  font-size: 16px;
}

# Tablet upwards
@media (min-width: 768px) {
  font-size: 14px;
}

Dobre! Ale co się stanie, jeśli mój tekst zajmie całą szerokość pola wyboru? Co mogę zrobić w takim przypadku?
Gota

Jeśli komunikat o opcji początkowej pasuje, to powinno wystarczyć. Gdy już wybrali opcję, nawet jeśli była nieco skrócona, prawdopodobnie zapamiętają, co to było. Ale tak, większy problem, jeśli jest napisane „Proszę wybrać ko ...”
martinedwards

Ta odpowiedź działa i wydaje się być najmniej natrętną metodą. Dzięki!
DeBraid

6

Trochę spóźniłem się na imprezę, ale znalazłem całkiem zgrabne obejście, które rozwiązuje ten problem tylko z manipulacją CSS. W moim przypadku nie mogłem zmienić rozmiaru czcionki ze względów projektowych, a także nie mogłem wyłączyć powiększania.

Ponieważ iPhone nieznacznie powiększy pola formularza, jeśli tekst jest ustawiony na mniej niż 16 pikseli, możemy oszukać iPhone'a, aby pomyślał, że rozmiar czcionki to 16px, a następnie przekształcić go do naszego rozmiaru.

Na przykład weźmy przykład, gdy nasz tekst ma 14 pikseli, więc powiększa się, ponieważ jest mniejszy niż 16 pikseli. Dlatego możemy przekształcić skalę zgodnie z 0,875.

W poniższym przykładzie dodałem wypełnienie, aby pokazać, jak odpowiednio przekonwertować inne właściwości.

.no-zoom {
    font-size: 16px;
    transform-origin: top left;
    transform: scale(0.875);            //  14px / 16px
    padding: 4.57px;                    // 4px / 0.875
}

Mam nadzieję, że to pomoże!


To paskudny, ale też sprytny hack i nie lubię hacków ... ale w tym przypadku to najlepsza odpowiedź na tej stronie i nie ma alternatywy, jeśli musisz zatrzymać zoom i nadal chcesz zachować projekt tak, jak jest . Wielkie dzięki! :)
roNn23

2

Spróbuj tego:

function DisablePinchZoom() 
{
    $('meta[name=viewport]').attr("content", "");
    $('meta[name=viewport]').attr("content", "width=yourwidth, user-scalable=no");
}

function myFunction() 
{
    $('meta[name=viewport]').attr("content", "width=1047, user-scalable=yes");
}


<select id="cmbYo" onchange="javascript: myFunction();" onclick="javascript: DisablePinchZoom();">
</select>

DisablePinchZoom zostanie uruchomiony przed zmianą, więc powiększenie zostanie wyłączone w momencie uruchomienia zmiany. W funkcji onchange na koniec możesz przywrócić sytuację początkową.

Przetestowano na telefonie iPhone 5S


2

iOS powiększa stronę, aby wyświetlić większe pole wejściowe, jeśli rozmiar czcionki jest mniejszy niż 16 pikseli.

Tylko kliknięcie dowolnego pola powoduje powiększenie strony. więc po kliknięciu zmieniamy go na 16 pikseli, a następnie zmieniamy na wartość domyślną

poniższy fragment działa dobrze i jest przeznaczony dla urządzeń mobilnych,

@media screen and (max-width: 767px) {
 select:active, input:active,textarea:active{
        font-size: 16px;
 }
}


1

Ustaw rozmiar wszystkich czcionek „wybierz” na 16 pikseli

select {font-size: 16px; }


0

Nie sądzę, że nie możesz nic zrobić z tym zachowaniem w izolacji.

Możesz w ogóle zapobiec powiększaniu strony. Jest to dobre, jeśli Twoja strona jest przeznaczona dla telefonu.

<meta name="viewport" content="width=device-width" />

Inną rzeczą, którą możesz spróbować, jest użycie konstrukcji JavaScript zamiast ogólnej instrukcji „select”. Utwórz ukryty div, aby pokazać swoje menu, przetwarzaj kliknięcia w javascript.

Powodzenia!


0

Jak odpowiedział tutaj: Wyłącz automatyczne powiększanie w tagu „tekst” wprowadzania danych - Safari na iPhonie

Możesz uniemożliwić Safari automatyczne powiększanie pól tekstowych podczas wprowadzania danych przez użytkownika bez wyłączania możliwości powiększania przez szczypanie. Po prostu dodaj, maximum-scale=1ale pomiń atrybut skali użytkownika sugerowany w innych odpowiedziach.

Jest to opłacalna opcja, jeśli masz formularz w warstwie, która „pływa” po powiększeniu, co może spowodować, że ważne elementy interfejsu użytkownika znikną z ekranu.

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">


0

Spróbuj dodać ten CSS, aby wyłączyć domyślny styl Ios:

-webkit-appearance: none;

Będzie to działać również w przypadku innych elementów, które mają specjalny styl, takich jak input [type = search].


0

Czytałem o tym przez kilka godzin i najlepszym rozwiązaniem jest ta jquery. Pomaga to również w opcji „następna karta” w Safari na iOS. Mam tutaj również dane wejściowe, ale możesz je usunąć lub dodać, jak chcesz. Zasadniczo mousedown uruchamia się przed zdarzeniem fokusu i wprawia przeglądarkę w myślenie o 16 pikselach. Ponadto fokus zostanie uruchomiony w funkcji „następna karta” i powtórzy proces.

$(function(){
    $('input, select').on("mousedown focusout", function(){
        $('input, select').css('font-size','16px');
    });
    $('input, select').on("focus", function(){
        $('input, select').css('font-size','');
    });
})
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.