ฉันจะรีเซ็ตขนาด / ซูมของเว็บแอพในการเปลี่ยนทิศทางบน iPhone ได้อย่างไร


97

เมื่อฉันเริ่มแอพในโหมดแนวตั้งมันก็ทำงานได้ดี จากนั้นฉันหมุนเป็นแนวนอนและปรับขนาดขึ้น ในการปรับขนาดให้ถูกต้องสำหรับโหมดแนวนอนฉันต้องแตะสองครั้งที่บางสิ่งสองครั้งก่อนอื่นเพื่อซูมเข้าจนสุด (ลักษณะการทำงานของการแตะสองครั้งตามปกติ) และอีกครั้งเพื่อซูมออกจนสุด (อีกครั้งพฤติกรรมการแตะสองครั้งตามปกติ) . เมื่อซูมออกมันจะซูมออกไปยังสเกลใหม่ที่ถูกต้องสำหรับโหมดแนวนอน

การเปลี่ยนกลับไปเป็นแนวตั้งดูเหมือนจะทำงานได้ดีกว่า นั่นคือมันจะจัดการการซูมเพื่อให้มาตราส่วนถูกต้องเมื่อการวางแนวเปลี่ยนกลับเป็นแนวตั้ง

ฉันกำลังพยายามหาว่านี่เป็นข้อบกพร่องหรือไม่? หรือนี่คือสิ่งที่สามารถแก้ไขได้ด้วย JavaScript?

ด้วยเนื้อหาเมตาของวิวพอร์ตฉันกำลังตั้งค่ามาตราส่วนเริ่มต้นเป็น 1.0 และฉันไม่ได้ตั้งค่ามาตราส่วนต่ำสุดหรือสูงสุด (และฉันไม่ต้องการ) ฉันกำลังตั้งค่าความกว้างเป็นความกว้างของอุปกรณ์

ความคิดใด ๆ ? ฉันรู้ว่าหลายคนจะขอบคุณที่มีวิธีแก้ปัญหาเพราะดูเหมือนว่าจะเป็นปัญหาที่เกิดขึ้นอย่างต่อเนื่อง


1
โซลูชั่นที่สมบูรณ์แบบ: ไม่มีจาวาสคริปต์! stackoverflow.com/a/8727440/805787
Steeven

คำตอบ:


89

Jeremy Keith ( @adactio ) มีทางออกที่ดีสำหรับเรื่องนี้ในการวางแนวและขนาดบล็อกของเขา

ทำให้มาร์กอัปปรับขนาดได้โดยไม่ตั้งค่ามาตราส่วนสูงสุดในมาร์กอัป

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

จากนั้นปิดใช้งานความสามารถในการปรับขนาดด้วยจาวาสคริปต์เมื่อโหลดจนกระทั่งท่าทางเริ่มต้นเมื่อคุณอนุญาตให้ปรับขนาดได้อีกครั้งด้วยสคริปต์นี้:

if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i)) {
    var viewportmeta = document.querySelector('meta[name="viewport"]');
    if (viewportmeta) {
        viewportmeta.content = 'width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0';
        document.body.addEventListener('gesturestart', function () {
            viewportmeta.content = 'width=device-width, minimum-scale=0.25, maximum-scale=1.6';
        }, false);
    }
}

อัปเดต 22-12-2557:
บน iPad 1 สิ่งนี้ใช้ไม่ได้มันล้มเหลวใน eventlistener ฉันพบว่าการลบการ.bodyแก้ไขนั้น:

document.addEventListener('gesturestart', function() { /* */ });

4
ดีกว่าปิดการซูมแน่นอน?! วิธีแก้ไขที่ดีที่สุดที่ฉันเคยพบ :)
danwellman

อืมยังคงปิดความสามารถในการซูม ใครมีวิธีง่ายๆที่ไม่ทำแบบนี้บ้าง?
Brad Swerdfeger

ได้ผลอย่างไรก็ตามฉันสังเกตว่าปัญหาจะเริ่มขึ้นอีกครั้งหากฉันใช้ท่าทางการบีบนิ้วแล้วหมุนหน้าจอ ไม่แน่ใจว่าจะแก้ไขอย่างไร
Nilesh

3
มันได้ผล. อย่างไรก็ตามฉันสังเกตเห็นว่าผู้ใช้ต้องเปิดนิ้วสองครั้งเพื่อซูม ฉันเดาว่านี่เป็นเพราะการmaximum-scale=1.0คงอยู่มีผลหลังจากท่าทางเริ่มต้น มีวิธีใดในการแก้ไขปัญหานี้หรือไม่?
LandonSchropp

3
วิธีนี้ใช้ไม่ได้ด้วยเหตุผล 2 ประการ: 1) ปิดใช้งานท่าทางเริ่มต้นหมายเลข 1 ทำให้ผู้ใช้ต้องใช้ท่าทางสองครั้ง 2) มันแตกหลังจากที่ผู้ใช้ใช้ท่าทางแรกเป็นสองเท่าดังนั้นจึงใช้ได้จริงก็ต่อเมื่อผู้ใช้ไม่เคยใช้ท่าทางสัมผัสเลย - ทุกคนควรดูวิธีแก้ปัญหาของ Andrew Ashbacher ด้านล่าง มันใช้งานได้จริง
tmsimont

18

Scott Jehlมาพร้อมกับโซลูชันที่ยอดเยี่ยมซึ่งใช้มาตรความเร่งเพื่อคาดการณ์การเปลี่ยนแปลงทิศทาง โซลูชันนี้ตอบสนองได้ดีมากและไม่รบกวนท่าทางการซูม

https://github.com/scottjehl/iOS-Orientationchange-Fix

วิธีการทำงาน: การแก้ไขนี้ทำงานโดยการฟังเครื่องวัดความเร่งของอุปกรณ์เพื่อคาดการณ์ว่าจะเกิดการเปลี่ยนแปลงทิศทางเมื่อใด เมื่อเห็นว่าใกล้จะมีการเปลี่ยนแปลงการวางแนวสคริปต์จะปิดใช้งานการซูมของผู้ใช้ทำให้การเปลี่ยนทิศทางเกิดขึ้นอย่างถูกต้องโดยปิดใช้งานการซูม สคริปต์จะคืนค่าการซูมอีกครั้งเมื่อวางอุปกรณ์ในแนวตั้งใกล้เคียงกับแนวตั้งหรือหลังจากเปลี่ยนการวางแนวแล้ว วิธีนี้จะไม่ปิดการซูมของผู้ใช้ในขณะที่ใช้งานเพจอยู่

แหล่งที่มาที่ลดลง:

/*! A fix for the iOS orientationchange zoom bug. Script by @scottjehl, rebound by @wilto.MIT License.*/(function(m){if(!(/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1)){return}var l=m.document;if(!l.querySelector){return}var n=l.querySelector("meta[name=viewport]"),a=n&&n.getAttribute("content"),k=a+",maximum-scale=1",d=a+",maximum-scale=10",g=true,j,i,h,c;if(!n){return}function f(){n.setAttribute("content",d);g=true}function b(){n.setAttribute("content",k);g=false}function e(o){c=o.accelerationIncludingGravity;j=Math.abs(c.x);i=Math.abs(c.y);h=Math.abs(c.z);if(!m.orientation&&(j>7||((h>6&&i<8||h<8&&i>6)&&j>5))){if(g){b()}}else{if(!g){f()}}}m.addEventListener("orientationchange",f,false);m.addEventListener("devicemotion",e,false)})(this);

ดี! ดูเหมือนโซลูชันที่สวยหรู
Elisabeth

1
นี่ควรเป็นคำตอบที่ยอมรับ !!!! ฉันหวังว่าฉันจะเห็นสิ่งนี้ก่อนที่จะเสียเวลาหนึ่งชั่วโมงในการแก้ปัญหาด้านบน :)
tmsimont

1
หลังจากการทดสอบเพิ่มเติมแล้วนี่เป็นวิธีแก้ปัญหาที่ไม่น่าเชื่อถือ :( มันไม่สอดคล้องกันและหลังจากดูรหัสแล้วฉันเห็นว่าทำไม ... ถึงไม่ถึง "ขีด จำกัด " ของการเคลื่อนไหวที่กำหนดไว้ตลอดเวลาโดยเฉพาะอย่างยิ่งถ้าคุณถือ iPad ที่ มุมขณะหมุน
tmsimont

อาจมีผลที่น่ารังเกียจสำหรับทุกคนที่ใช้การล็อคการหมุน ... พวกเขาสามารถถือโทรศัพท์ในมุมหนึ่งและสูญเสียความสามารถในการซูม - ผู้ใช้จะไม่รู้ว่าทำไม
1owk3y

13

ฉันมีปัญหาเดียวกันและการตั้งค่า maximum-scale = 1.0 ใช้ได้ผลสำหรับฉัน

แก้ไข: ตามที่ระบุไว้ในความคิดเห็นสิ่งนี้จะปิดใช้งานการซูมของผู้ใช้ยกเว้นเมื่อเนื้อหามีความละเอียดกว้างเกิน ดังที่กล่าวมานี้อาจไม่ฉลาดนัก อาจเป็นที่ต้องการในบางกรณี

รหัสวิวพอร์ต:

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

ทางออกที่ดี ทำได้ดีในการรักษาหน้าให้อยู่ในระดับการซูมคงที่ (สัมพันธ์กับความกว้างของอุปกรณ์) ผ่านการเปลี่ยนแปลงการวางแนว ขอบคุณสำหรับการแบ่งปัน!
Luke Stevenson

18
ข้อเสียคือผู้ใช้ที่ปิดใช้งานไม่สามารถซูมเข้าไซต์ของคุณได้!
Jess Jacobs

ฉันสังเกตเห็นว่าวิธีการทั้งหมดเหล่านี้ดูเหมือนจะป้องกันไม่ให้ CSS ที่ใช้การสืบค้นสื่อลงทะเบียนความกว้างของอุปกรณ์ใหม่อย่างถูกต้อง (เช่น @media all และ (max-width: 479px)
mheavers

2
การฆ่าผู้ใช้ซูมเป็นความคิดที่แย่มาก ดูวิธีแก้ปัญหาของ Andrew Ashbacher ด้านล่าง
tmsimont

ไม่แน่ใจเกี่ยวกับ iPhone แต่บน iPad สิ่งนี้ไม่สามารถแก้ปัญหาได้เพียงแค่ป้องกันไม่ให้ผู้ใช้สามารถซูมออกได้ด้วยตนเองเมื่อเบราว์เซอร์ซูมเข้าตามการเปลี่ยนทิศทาง
Alejo

3

หากคุณตั้งค่าความกว้างไว้ในวิวพอร์ต:

<meta name = "viewport" content = "width=device-width; initial-scale=1.0;
 maximum-scale=1.0;" />

จากนั้นเปลี่ยนทิศทางมันจะสุ่มซูมเข้าในบางครั้ง (โดยเฉพาะอย่างยิ่งถ้าคุณลากบนหน้าจอ) เพื่อแก้ไขสิ่งนี้ไม่ได้กำหนดความกว้างที่นี่ฉันใช้:

<meta id="viewport" name="viewport" content="initial-scale=1.0; user-scalable=0;
minimum-scale=1.0; maximum-scale=1.0" />

สิ่งนี้จะแก้ไขการซูมไม่ว่าจะเกิดอะไรขึ้นคุณสามารถใช้ window.onorientationchange เหตุการณ์หรือถ้าคุณต้องการให้เป็นอิสระจากแพลตฟอร์ม (สะดวกสำหรับการทดสอบ) วิธีwindow.innerWidth


1

MobileSafari สนับสนุนorientationchangeเหตุการณ์บนwindowวัตถุ น่าเสียดายที่ดูเหมือนจะไม่มีวิธีควบคุมการซูมผ่าน JavaScript โดยตรง บางทีคุณอาจเขียน / เปลี่ยนmetaแท็กแบบไดนามิกที่ควบคุมวิวพอร์ต - แต่ฉันสงสัยว่าจะได้ผล แต่จะมีผลกับสถานะเริ่มต้นของเพจเท่านั้น บางทีคุณอาจใช้เหตุการณ์นี้เพื่อปรับขนาดเนื้อหาของคุณโดยใช้ CSS โชคดี!


3
ขอบคุณ! ใช่ฉันพยายามเปลี่ยนค่าเมตาแท็กวิวพอร์ตแบบไดนามิกและไม่ได้ทำอะไรเลย สำหรับฉันแล้วดูเหมือนว่าถ้าคุณหมุนเป็นแนวนอนคุณต้องการให้ซูมอย่างถูกต้องเพื่อรักษามาตราส่วนให้พอดีกับหน้าเว็บในหน้าต่าง Safari มันดูแปลกมากสำหรับฉันที่นี่ไม่ใช่พฤติกรรมเริ่มต้น!
Elisabeth


1

ฉันใช้ฟังก์ชันนี้ในโครงการของฉัน

function changeViewPort(key, val) {
    var reg = new RegExp(key, "i"), oldval = document.querySelector('meta[name="viewport"]').content;
    var newval = reg.test(oldval) ? oldval.split(/,\s*/).map(function(v){ return reg.test(v) ? key+"="+val : v; }).join(", ") : oldval+= ", "+key+"="+val ;
    document.querySelector('meta[name="viewport"]').content = newval;
}

ดังนั้นเพียงแค่ addEventListener:

if( /iPad|iPhone|iPod|Android/i.test(navigator.userAgent) ){
    window.addEventListener("orientationchange", function() { 
        changeViewPort("maximum-scale", 1);
        changeViewPort("maximum-scale", 10);
    }
}

0

ฉันพบวิธีแก้ปัญหาใหม่ที่แตกต่างจากที่อื่น ๆ ที่ฉันเคยเห็นโดยการปิดใช้งานการซูมดั้งเดิมของ iOS และใช้ฟังก์ชันการซูมใน JavaScript แทน

พื้นหลังที่ยอดเยี่ยมในการแก้ปัญหาต่าง ๆ ในการแก้ไขปัญหาการซูม / ปฐมนิเทศเป็นเซร์คิโอเปส: การแก้ไขที่มีชื่อเสียง iOS ของคุณซูมข้อผิดพลาดเกี่ยวกับการเปลี่ยนแปลงการวางแนวเป็นแนวตั้ง

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" id="viewport" content="user-scalable=no,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0" />
    <title>Robocat mobile Safari zoom fix</title>
    <style>
        body {
            padding: 0;
            margin: 0;
        }
        #container {
            -webkit-transform-origin: 0px 0px;
            -webkit-transform: scale3d(1,1,1);
            /* shrink-to-fit needed so can measure width of container http://stackoverflow.com/questions/450903/make-css-div-width-equal-to-contents */
            display: inline-block;
            *display: inline;
            *zoom: 1;
        }
        #zoomfix {
            opacity: 0;
            position: absolute;
            z-index: -1;
            top: 0;
            left: 0;
        }
    </style>
</head>

<body>
    <input id="zoomfix" disabled="1" tabIndex="-1">
    <div id="container">
        <style>
            table {
                counter-reset: row cell;
                background-image: url(http://upload.wikimedia.org/wikipedia/commons/3/38/JPEG_example_JPG_RIP_010.jpg);
            }
            tr {
                counter-increment: row;
            }
            td:before {
                counter-increment: cell;
                color: white;
                font-weight: bold;
                content: "row" counter(row) ".cell" counter(cell);
            }
        </style>
        <table cellspacing="10">
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
            <tr><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td><td>
        </table>
    </div>

    <script>
    (function() {
        var viewportScale = 1;
        var container = document.getElementById('container');
        var scale, originX, originY, relativeOriginX, relativeOriginY, windowW, windowH, containerW, containerH, resizeTimer, activeElement;
        document.addEventListener('gesturestart', function(event) {
            scale = null;
            originX = event.pageX;
            originY = event.pageY;
            relativeOriginX = (originX - window.pageXOffset) / window.innerWidth;
            relativeOriginY = (originY - window.pageYOffset) / window.innerHeight;
            windowW = window.innerWidth;
            windowH = window.innerHeight;
            containerW = container.offsetWidth;
            containerH = container.offsetHeight;
        });
        document.addEventListener('gesturechange', function(event) {
            event.preventDefault();
            if (originX && originY && event.scale && event.pageX && event.pageY) {
                scale = event.scale;
                var newWindowW = windowW / scale;
                if (newWindowW > containerW) {
                    scale = windowW / containerW;
                }
                var newWindowH = windowH / scale;
                if (newWindowH > containerH) {
                    scale = windowH / containerH;
                }
                if (viewportScale * scale < 0.1) {
                    scale = 0.1/viewportScale;
                }
                if (viewportScale * scale > 10) {
                    scale = 10/viewportScale;
                }
                container.style.WebkitTransformOrigin = originX + 'px ' + originY + 'px';
                container.style.WebkitTransform = 'scale3d(' + scale + ',' + scale + ',1)';
            }
        });
        document.addEventListener('gestureend', function() {
            if (scale && (scale < 0.95 || scale > 1.05)) {
                viewportScale *= scale;
                scale = null;
                container.style.WebkitTransform = '';
                container.style.WebkitTransformOrigin = '';
                document.getElementById('viewport').setAttribute('content', 'user-scalable=no,initial-scale=' + viewportScale + ',minimum-scale=' + viewportScale + ',maximum-scale=' + viewportScale);
                document.body.style.WebkitTransform = 'scale3d(1,1,1)';
                // Without zoomfix focus, after changing orientation and zoom a few times, the iOS viewport scale functionality sometimes locks up (and completely stops working).
                // The reason I thought this hack would work is because showing the keyboard is the only way to affect the viewport sizing, which forces the viewport to resize (even though the keyboard doesn't actually get time to open!).
                // Also discovered another amazing side effect: if you have no meta viewport element, and focus()/blur() in gestureend, zoom is disabled!! Wow!
                var zoomfix = document.getElementById('zoomfix');
                zoomfix.disabled = false;
                zoomfix.focus();
                zoomfix.blur();
                setTimeout(function() {
                    zoomfix.disabled = true;
                    window.scrollTo(originX - relativeOriginX * window.innerWidth, originY - relativeOriginY * window.innerHeight);
                    // This forces a repaint. repaint *intermittently* fails to redraw correctly, and this fixes the problem.
                    document.body.style.WebkitTransform = '';
                }, 0);
            }
        });
    })();
    </script>
</body>
</html>

สามารถปรับปรุงได้ แต่สำหรับความต้องการของฉันมันหลีกเลี่ยงข้อเสียที่สำคัญที่เกิดขึ้นกับโซลูชันอื่น ๆ ทั้งหมดที่ฉันได้เห็น จนถึงตอนนี้ฉันได้ทดสอบโดยใช้ Safari บนมือถือบน iPad 2 ที่ใช้ iOS4 เท่านั้น

โฟกัส () / เบลอ () เป็นวิธีแก้ปัญหาเพื่อป้องกันการล็อคฟังก์ชันการซูมเป็นครั้งคราวซึ่งอาจเกิดขึ้นได้หลังจากเปลี่ยนทิศทางและซูมสองสามครั้ง

การตั้งค่า document.body.style บังคับให้มีการทาสีใหม่แบบเต็มหน้าจอซึ่งจะช่วยหลีกเลี่ยงปัญหาที่เกิดขึ้นเป็นครั้งคราวซึ่งการทาสีใหม่จะล้มเหลวหลังจากการซูม


0

อลิซาเบ ธ คุณสามารถเปลี่ยนเนื้อหาวิวพอร์ตแบบไดนามิกได้โดยเพิ่มคุณสมบัติ "id" ในเมตาแท็ก:

<meta name="viewport" id="view" content="user-scalable=yes, width=device-width minimum-scale=1, maximum-scale=1" />

จากนั้นคุณก็สามารถโทรโดยใช้จาวาสคริปต์:

document.getElementById("view").setAttribute('content','user-scalable=yes, width=device-width, minimum-scale=1, maximum-scale=10');

@bridgestew หากคุณต้องการเปลี่ยนการซูมหรือวิวพอร์ตโดยใช้การเลื่อนดูย่อยที่มีอยู่ใน uiwebview ฉันได้เพิ่มตัวอย่าง snipet ในหัวข้ออื่น ๆ : link
M Penades

4
@ อลิซาเบ ธ ทำงานให้คุณหรือไม่? มันไม่รีเซ็ตการซูมเมื่อเปลี่ยนเป็นโหมดแนวนอนให้ฉัน
เช่นฉัน

0

นี่เป็นอีกวิธีหนึ่งที่ทำได้ซึ่งดูเหมือนว่าจะได้ผลดี

  1. ตั้งค่าเมตาแท็กเพื่อ จำกัด วิวพอร์ตเป็นสเกล = 1 ซึ่งป้องกันการซูม:

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

  2. ด้วยจาวาสคริปต์ให้เปลี่ยนเมตาแท็ก 1/2 วินาทีในภายหลังเพื่ออนุญาตการซูม:

    setTimeout (ฟังก์ชัน () {document.querySelector ("meta [name = viewport]"). setAttribute ('content', 'width = device-width, initial-scale = 1');}, 500);

  3. อีกครั้งด้วย javascript เมื่อเปลี่ยนการวางแนวให้โหลดหน้าซ้ำ:

    window.onorientationchange = function () {window.location.reload ();};

ทุกครั้งที่คุณจัดเรียงอุปกรณ์ใหม่หน้าเว็บจะโหลดซ้ำในตอนแรกโดยไม่ต้องซูม แต่ 1/2 วินาทีต่อมาความสามารถในการซูมจะกลับคืนมา


6
การตอบคำถาม 5 ปีหลังจากที่ถูกถามคืออะไร .. น่าเสียดายที่นี่ไม่ใช่วิธีการทำงานของเว็บในปี 2015 คุณไม่ต้องโหลดหน้านี้ซ้ำเมื่อผู้ใช้หมุนอุปกรณ์
ปิแอร์

0

พบการแก้ไขที่ใช้งานได้ง่ายมาก กำหนดโฟกัสเป็นองค์ประกอบข้อความที่มีขนาดแบบอักษร 50px เมื่อกรอกแบบฟอร์มเสร็จสิ้น ดูเหมือนจะไม่ทำงานหากองค์ประกอบข้อความถูกซ่อนไว้ แต่การซ่อนองค์ประกอบนี้ทำได้อย่างง่ายดายโดยการตั้งค่าคุณสมบัติสีขององค์ประกอบให้ไม่มีความทึบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.