การเลื่อน iPad ของ Safari ทำให้องค์ประกอบ HTML หายไปและปรากฏขึ้นอีกครั้งด้วยความล่าช้า


165

ฉันกำลังพัฒนาเว็บแอปโดยใช้ HTML5 และ jQuery สำหรับ iPad ซาฟารี ฉันพบปัญหาที่พื้นที่เลื่อนขนาดใหญ่ทำให้องค์ประกอบที่อยู่นอกจอปรากฏหลังจากล่าช้าเมื่อฉันเลื่อนลงไปที่องค์ประกอบเหล่านั้น

สิ่งที่ฉันหมายถึงคือถ้าฉันมีแถวของภาพ (หรือแม้กระทั่ง div ที่มีการไล่ระดับสี) ที่เป็นหน้าจอเมื่อฉันเลื่อนลง (หรือขึ้น) ไปที่มันพฤติกรรมที่คาดหวังสำหรับองค์ประกอบที่จะปรากฏบนหน้าจอเป็น ฉันกำลังเลื่อนไปที่มัน

อย่างไรก็ตามสิ่งที่ฉันเห็นก็คือองค์ประกอบจะไม่ปรากฏขึ้นจนกว่าฉันจะยกนิ้วออกจากหน้าจอและผู้เลื่อนภาพเคลื่อนไหวเสร็จสิ้น

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


ปัญหา / วิธีแก้ไขนี้ช่วยฉันแก้ไขปัญหาเกี่ยวกับ jPanelMenu 1.3 CSS Transforms เวอร์ชันซึ่งเปลี่ยนทุกอย่างบนไซต์ของฉัน invisibie จนกว่าฉันจะเพิ่มข้อมูลโค้ดด้านบน
75 ทรอมโบน

2
ใช้ *: ไม่ (html) จะใช้ translate3d กับด้านอื่น ๆ ทั้งหมดของเว็บไซต์ของคุณและฉันไม่แนะนำ มันจะทำให้รูปภาพในแท็บหายไปเมื่อคุณเลื่อนลง ฯลฯ ข้อบกพร่องที่คุณอาจใช้ในการมองเห็นเพียงแค่ภาพ 3 มิติของคุณจะปรากฏในด้านอื่น ๆ ของไซต์ของคุณ
Jonathan Tonge

1
ฉันมี<svg>องค์ประกอบสองสามอย่างที่แสดงภาพวาด / เรนเดอร์ที่คล้ายกันล่าช้า น่าเสียดายที่*:not(html) { ... }นำไปสู่พฤติกรรมแปลก ๆ ทุกประเภทเนื่องจาก @JonathanTonge ชี้ให้เห็นว่าอาจเกิดขึ้นได้ อย่างไรก็ตามการเลือก<svg>องค์ประกอบเท่านั้นและการใช้translate3d(0, 0, 0,);ดูเหมือนว่าจะมีการแก้ไขปัญหาการเลื่อนของฉัน
Zephyr Mays

ยกเว้นกรณีการใช้งานที่เฉพาะเจาะจงมากนี้เป็นขยะ เลอะเลย์เอาต์ที่ขึ้นกับองค์ประกอบตำแหน่งที่แน่นอนจริงๆ
Stoutie

2
โปรดโพสต์คำตอบเป็นคำตอบไม่ใช่ "แก้ไข" ในคำถามของคุณ ฉันรู้ว่าคุณชอบคำตอบที่ดีที่สุดและก็ดี แต่ StackOverflow มีรูปแบบคำถามและคำตอบที่ทำงานได้ดีที่สุดเมื่อคำถามของ Q นั้นแตกต่างจากของ A
Slipp D. Thompson

คำตอบ:


184

คุณต้องใช้เบราว์เซอร์เพื่อใช้การเร่งความเร็วฮาร์ดแวร์อย่างมีประสิทธิภาพยิ่งขึ้น คุณสามารถทำได้ด้วยการแปลงว่างเปล่า 3 มิติ:

-webkit-transform: translate3d(0,0,0)

โดยเฉพาะอย่างยิ่งคุณจะต้องใช้สิ่งนี้กับองค์ประกอบย่อยที่มีการposition:relative;ประกาศ (หรือออกไปทั้งหมดและทำกับองค์ประกอบย่อยทั้งหมด)

ไม่ใช่การแก้ไขที่รับประกันได้ แต่ประสบความสำเร็จเป็นส่วนใหญ่

เคล็ดลับหมวก: https://web.archive.org/web/20131005175118/http://cantina.co/2012/03/06/ios-5-native-scrolling-grins-and-gothcas/


3
ฉันพยายามที่ดี น่าเศร้าที่การเพิ่ม translate3d กำลังตัดองค์ประกอบที่แสดงอย่างถูกต้องมาก่อน ฉันยังต้องการการเร่งด้วยฮาร์ดแวร์สำหรับวัตถุสองอย่างที่เป็นหน้าจอและต้องเป็นภาพเคลื่อนไหวเพื่อ "บินเข้า" บนหน้าจอ ฉันใช้ภาพเคลื่อนไหวของ jQuery () ซึ่งช้ามาก ฉันเปลี่ยนไปใช้การเร่งด้วยฮาร์ดแวร์ แม้ว่ามันจะเร่งความเร็วให้กับอนิเมชั่น แต่ก็สร้างผลลัพธ์ที่ผิดปกติในแง่ที่ว่าองค์ประกอบย่อย ๆ ของ div (ภาพเคลื่อนไหว) ของผู้ปกครองถูกตัดออก สิ่งนี้ไม่ได้เกิดขึ้นเมื่อฉันใช้ภาพเคลื่อนไหว ()
codeBearer

1
@Colin Williams คุณเพิ่งทำวันของฉัน! : D
ลุ

9
ว้าวนั่นช่างน่ากลัว แต่ก็มีประสิทธิภาพ ขอบคุณ.
ทิมลง

ลิงค์เสีย การเชื่อมโยงใหม่: cantina.co/thought_leadership/... Cached: web.archive.org/web/20131005175118/http://cantina.co/2012/03/06/...
thinsoldier

1
ชายทอง freakin ดาว! ผมเพิ่มไปยังทุกองค์ประกอบของ li ของฉันใน div เลื่อน เกย์. ทำงาน
ไบรอันจอห์นสัน

68

นี่คือคำตอบที่สมบูรณ์สำหรับคำถามของฉัน เดิมทีฉันทำเครื่องหมายคำตอบ @Colin Williams เป็นคำตอบที่ถูกต้องเพราะมันช่วยให้ฉันแก้ปัญหาได้อย่างสมบูรณ์ สมาชิกชุมชน @Slipp D. Thompson แก้ไขคำถามของฉันหลังจากนั้นประมาณ 2.5 ปีที่ฉันถามคำถามและบอกฉันว่าฉันใช้รูปแบบ Q & A ของการดูถูกเหยียดหยาม เขาบอกให้ฉันแยกโพสต์นี้เป็นคำตอบ ดังนั้นนี่คือคำตอบที่สมบูรณ์ที่แก้ปัญหาของฉัน:

@Colin Williams ขอขอบคุณ! คำตอบของคุณและบทความที่คุณเชื่อมโยงไว้ทำให้ฉันมีโอกาสลองใช้ CSS

ดังนั้นฉันเคยใช้ translate3d มาก่อน มันผลิตผลลัพธ์ที่ไม่พึงประสงค์ โดยพื้นฐานแล้วมันจะตัดออกและไม่แสดงองค์ประกอบที่เป็นหน้าจอจนกว่าฉันจะโต้ตอบกับพวกเขา ดังนั้นโดยพื้นฐานแล้วในการวางแนวนอนครึ่งหนึ่งของไซต์ของฉันที่เป็นหน้าจอไม่แสดงให้เห็น นี่คือแอปพลิเคชันบนเว็บของ iPad เนื่องจากฉันแก้ไขปัญหาได้

การใช้ translate3d กับองค์ประกอบที่มีตำแหน่งค่อนข้างจะช่วยแก้ปัญหาสำหรับองค์ประกอบเหล่านั้นได้ แต่องค์ประกอบอื่น ๆ หยุดการแสดงผลทันทีที่ปิดหน้าจอ องค์ประกอบที่ฉันไม่สามารถโต้ตอบกับได้ (อาร์ตเวิร์ค) จะไม่สามารถแสดงผลได้อีกเว้นแต่ฉันจะโหลดหน้าซ้ำ

ทางออกที่สมบูรณ์:

*:not(html) {
    -webkit-transform: translate3d(0, 0, 0);
}

ถึงแม้ว่านี่อาจไม่ใช่โซลูชันที่ "มีประสิทธิภาพ" มากที่สุด แต่ก็เป็นโซลูชั่นเดียวที่ใช้งานได้ มือถือ Safari ไม่แสดงองค์ประกอบที่ Offscreen -webkit-overflow-scrolling: touchหรือบางครั้งการแสดงผลผิดพลาดเมื่อใช้ เว้นแต่ว่าจะมีการใช้ translate3d กับองค์ประกอบอื่น ๆ ทั้งหมดที่อาจปิดหน้าจอเนื่องจากการเลื่อนนั้นองค์ประกอบเหล่านั้นจะถูกสับออกหลังจากเลื่อน

ดังนั้นขอขอบคุณอีกครั้งและหวังว่าสิ่งนี้จะช่วยให้วิญญาณที่หลงหายอีก นี่ช่วยฉันได้ครั้งใหญ่!


2
ว้าว. ขอบคุณสำหรับสิ่งนี้. มันช่วยให้ฉันปวดหัวจำนวนมากสำหรับแอพ phonegap / cordova ของฉัน ในกรณีของฉันฉันต้องเปลี่ยน*:not(html)เป็นbody *
อานนท์

9
เพียงแค่ใช้-webkit-transform: translate3d(0, 0, 0);กับองค์ประกอบปัญหาทำงานให้ฉัน ในกรณีของฉันฉันใช้ScrollMagic
fidev

สิ่งนี้ไม่ได้ผลสำหรับฉันเช่นกัน ทันทีที่ฉันเลื่อนลงมาถึงจุดหนึ่งสิ่งที่มองไม่เห็นอีกต่อไปจะปรากฏขึ้นเหนือหน้าต่างและองค์ประกอบบางอย่างในวิวพอร์ต ฉันสังเกตเห็น "jolt" เล็กน้อย แต่ไม่ผิดเพี้ยนในขณะที่มันเลื่อนหลังจากที่องค์ประกอบถูก hosed (เช่น: เรียบ - กระวนกระวายใจ - มีพฤติกรรมที่ราบเรียบเหมือนกับการสะดุดในระหว่างการเลื่อน) สิ่งนี้อยู่ใน iPad
cbmtrx

BTW ฉันเพิ่งค้นพบว่าใน iPad Air 2 เมื่อองค์ประกอบบนหน้าจอเฉพาะ (navbar ในกรณีนี้) ปิดหน้าจออุปกรณ์ "reloads" ที่บล็อก - ใช้เฉพาะรุ่นที่มีขนาดใหญ่ไม่ใช่สื่อดั้งเดิม หน้าที่โหลดด้วย อะไร ...
cbmtrx

ในกรณีที่ทุกคนประสบความแปลกประหลาดเหมือนฉัน - แตกต่างจากที่อธิบายไว้ในหน้านี้เล็กน้อย - ฉันพบว่าการใช้$(window).width()แทนที่จะเป็นwindow.innerWidthใน jQuery ทำให้ความแตกต่างสำหรับ iOS ใครจะรู้.
cbmtrx

13

การกำหนดเป้าหมายองค์ประกอบทั้งหมดยกเว้น html: *:not(html) ทำให้เกิดปัญหากับองค์ประกอบอื่น ๆ ในกรณีของฉัน มันแก้ไขบริบทการสแต็กทำให้ดัชนี z บางตัวหยุดทำงาน

เราดีขึ้นควรพยายามที่จะกำหนดเป้าหมายองค์ประกอบที่เหมาะสมและใช้-webkit-transform: translate3d(0,0,0)มันเท่านั้น

แก้ไข: บางครั้งใช้translate3D(0,0,0)ไม่ได้เราสามารถใช้วิธีการต่อไปนี้กำหนดเป้าหมายองค์ประกอบที่เหมาะสม:

@keyframes redraw{
    0% {opacity: 1;}
    100% {opacity: .99;}
}

// ios redraw fix
animation: redraw 1s linear infinite;

ฉันกำลังเผชิญปัญหาเดียวกัน คุณสามารถใช้ตัวเลือกแทนbody * *:not(html)มันจะแก้ปัญหาของคุณ
Kunal

รุ่งโรจน์สำหรับข้อเสนอแนะในการกำหนดเป้าหมายองค์ประกอบที่เหมาะสมมากกว่ามลพิษทุกอย่างด้วย *
Maciek Rek

7

เมื่อ translate3d ไม่ทำงานให้ลองเพิ่มมุมมอง มันได้ผลสำหรับฉันเสมอ

transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
perspective: 1000;
-webkit-perspective: 1000;

http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css


ศักดิ์สิทธิ์ c $ # @ ในที่สุดก็แก้ปัญหาสำหรับเชิงมุม / อิออน -webkit-perspective: 1000;
lilbiscuit

อ่าบันทึกวันของฉัน +1 สำหรับคุณ;)
โอมาร์ Bahir

นี่ทำให้เบราว์เซอร์ iOS ของฉันทำงานขัดข้อง
Andreas Richter

-webkit-perspective: 1000;ทำเพื่อฉัน - ขอบคุณ
jHilscher

2

เพิ่ม-webkit-transform: translate3d(0,0,0)ไปยังองค์ประกอบแบบคงที่ไม่ทำงานสำหรับฉัน

ฉันใช้คุณสมบัตินี้แบบไดนามิก ตัวอย่างเช่นเมื่อเลื่อนหน้าฉันตั้งค่า-webkit-transform: translate3d(0,0,0)องค์ประกอบ ฉันก็รีเซ็ตคุณสมบัตินี้นั่นคือ-webkit-transform: none วิธีนี้ดูเหมือนจะใช้งานได้

ขอบคุณ @Colin Williams ที่ชี้ให้ฉันไปในทิศทางที่ถูกต้อง


คำแนะนำนี้ช่วยฉันได้มากเนื่องจากรูปแบบเหล่านี้มีผลข้างเคียงที่ไม่พึงประสงค์ฉันมักจะต้องการหลีกเลี่ยง ดังนั้นฉันใช้เหตุการณ์เริ่มต้น / สัมผัสเพื่อเพิ่มและลบออก ขอบคุณ!
Windwalker

1

ผมมีปัญหาเดียวกันกับ iscroll 4.2.5 บน iOS7 องค์ประกอบทั้งเลื่อนเพียงแค่หายไป ผมเคยพยายามที่จะเพิ่มtranslate3d(0,0,0)ตามที่ได้แนะนำที่นี่ก็มีการแก้ไขปัญหาที่เกิดขึ้น แต่มันปิดการใช้งาน iscroll ว่า "แน็ป" ผล วิธีการแก้ปัญหาให้มาพร้อมกับ"position:relative; z-index:1000;display:block"คุณสมบัติ CSS เพื่อภาชนะทั้งที่มีองค์ประกอบเลื่อนและไม่มีความจำเป็นที่จะให้ translate3d องค์ประกอบเด็ก


ผมใช้เทคนิคนี้ในการแก้ปัญหาที่คล้ายกันบน Android Chrome เลื่อนแนวตั้งดูเหมือนจะทำงานได้ดีขึ้นกว่าเมื่อฉันพยายามแก้ไข translate3d ใน<body>องค์ประกอบเคสของฉันคือสิ่งที่ฉันใช้ในการเลื่อนและเวอร์ชันที่เรียบง่ายทำงาน:body { position: relative; z-index: 0; }
BumbleB2na

1

ในช่วงเวลาtranslate3dอาจไม่ทำงานในกรณีดังกล่าวperspectiveสามารถนำมาใช้

transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
perspective: 1000;
-webkit-perspective: 1000;

0

ฉันค่อนข้างแน่ใจว่าฉันเพิ่งจะแก้ปัญหานี้ด้วย:

overflow-y: auto;

(สมมุติว่าoverflow: auto;จะใช้งานได้มากเกินไปตามความต้องการของคุณ


มันไม่ทำอะไรเลยสำหรับฉันในขณะที่คำตอบที่ยอมรับนั้นอาจเป็นสถานการณ์ที่แตกต่างออกไป
โทนี

0

มีหลายกรณีที่มีการหมุนถูกนำไปใช้และ / หรือดัชนี Zถูกนำมาใช้

การหมุน : การประกาศที่มีอยู่ของ-webkit-transformการหมุนองค์ประกอบอาจจะไม่เพียงพอที่จะจัดการปัญหาลักษณะนี้เช่นกัน (ชอบ-webkit-transform: rotate(-45deg)) ในกรณีนี้คุณสามารถใช้-webkit-transform: translateZ(0px) rotateZ(-45deg)เป็นเคล็ดลับ ( คิดหมุนZ )

Z ดัชนี : ร่วมกันกับการหมุนที่คุณอาจกำหนดเป็นบวกคุณสมบัติเช่นz-index z-index: 42ขั้นตอนข้างต้นที่อธิบายไว้ภายใต้ "การหมุน" อยู่ในกรณีของฉันเพียงพอที่จะแก้ไขปัญหาแม้ว่าจะว่างเปล่าtranslateZ(0px)ก็ตาม ฉันสงสัยว่าที่ดัชนี Z ในกรณีนี้อาจจะเกิดจากการหายไปและโผล่มาให้เห็นในสถานที่แรก ไม่ว่าในกรณีใด ๆz-index: 42สถานที่ให้บริการจะต้องเก็บไว้ - -webkit-transform: translateZ(42px)เท่านั้นไม่เพียงพอ


0

ปัญหานี้เป็นปัญหาที่พบบ่อยมากต้องเผชิญกับนักพัฒนาและนั่นคือสาเหตุหลักมาจากคุณสมบัติขององค์ประกอบไม่ได้สร้างตามที่กำหนดไว้Safari'sposition : fixed

ดังนั้นเปลี่ยนคุณสมบัติตำแหน่งหรือแฮ็คบางตัวที่ต้องนำไปใช้ตามที่ระบุไว้ในคำตอบอื่น ๆ

link1

link2


0

ในกรณีของฉัน (แอพ iOS Phonegap) การใช้ translate3d กับองค์ประกอบย่อยสัมพันธ์ไม่สามารถแก้ไขปัญหาได้ องค์ประกอบที่เลื่อนได้ของฉันไม่ได้มีความสูงตามที่กำหนดไว้อย่างแน่นอนและฉันกำหนดตำแหน่งด้านบนและด้านล่าง สิ่งที่แก้ไขให้ฉันคือการเพิ่มความสูงขั้นต่ำ (จาก 100px)


0

ฉันมีปัญหาเดียวกันโดยใช้ Fancybox รุ่นเก่ากว่า การอัพเกรดเป็น v3 จะช่วยแก้ปัญหาของคุณหรือคุณสามารถเพิ่ม:

html, body {
    -webkit-overflow-scrolling : touch !important;
    overflow: auto !important;
    height: 100% !important;
}

0

ฉันประสบปัญหานี้ในโครงการ Framework7 & Cordova ฉันลองวิธีแก้ปัญหาทั้งหมดข้างต้น พวกเขาไม่ได้แก้ปัญหาของฉัน

ในกรณีของฉันฉันใช้ภาพเคลื่อนไหว 10+ css ในหน้าเดียวกันกับการหมุนแบบไม่สิ้นสุด (เปลี่ยนรูป) ผมต้องลบภาพเคลื่อนไหว ตอนนี้มันก็โอเคกับการขาดคุณสมบัติภาพบางอย่าง

หากวิธีการข้างต้นไม่ช่วยคุณคุณอาจเริ่มกำจัดภาพเคลื่อนไหวบางอย่าง


0

-webkit-transform: translate3d(0, 0, 0);เคล็ดลับไม่ทำงานสำหรับฉัน ในกรณีของฉันฉันได้ตั้งผู้ปกครองเป็น:

// parent
height: 100vh;

การเปลี่ยนเป็น:

height: auto;
min-height: 100vh;

แก้ไขปัญหาในกรณีที่คนอื่นกำลังเผชิญสถานการณ์เดียวกัน


0

ในกรณีของฉัน CSS ไม่ได้แก้ไขปัญหา ฉันสังเกตเห็นปัญหาขณะใช้ jQuery แสดงปุ่มใหม่

$("#myButton").html("text")

ลองสิ่งนี้

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