บังคับให้วาดใหม่ / รีเฟรช DOM บน Chrome / Mac


216

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

ใช้ได้กับเบราว์เซอร์ / ระบบผสมส่วนใหญ่:

    el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
    el.offsetHeight
    el.style.cssText += ';-webkit-transform:none'

เช่นเดียวกับปรับแต่งคุณสมบัติ CSS ที่ไม่ได้ใช้แล้วขอข้อมูลบางอย่างที่บังคับให้วาดใหม่จากนั้นคลายคุณสมบัติ น่าเสียดายที่ทีมงานที่อยู่เบื้องหลัง Chrome สำหรับ Mac นั้นดูเหมือนจะพบวิธีที่จะชดเชยความสูงนั้นได้โดยไม่ต้องวาดใหม่ ดังนั้นการฆ่าแฮ็คที่มีประโยชน์อย่างอื่น

จนถึงตอนนี้สิ่งที่ดีที่สุดที่ฉันได้รับเพื่อให้ได้ผลเช่นเดียวกันกับ Chrome / Mac คือความอัปลักษณ์ชิ้นนี้:

    $(el).css("border", "solid 1px transparent");
    setTimeout(function()
    {
        $(el).css("border", "solid 0px transparent");
    }, 1000);

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

ทุกคนสนใจที่จะเสนอแฮ็ควาดใหม่ / รีเฟรชรุ่นที่ดีกว่านี้ (ควรพิจารณาจากตัวอย่างแรกด้านบน) ที่ทำงานบน Chrome / Mac


ฉันพบปัญหาเดียวกันเมื่อไม่กี่นาทีที่ผ่านมา ฉันเปลี่ยนองค์ประกอบสำหรับ div (มันคือการขยาย) และตอนนี้เบราว์เซอร์วาดการเปลี่ยนแปลงได้อย่างถูกต้อง ฉันรู้ว่ามันเก่าไปหน่อย แต่มันก็ช่วยฉันได้บ้าง
Andres Torres

2
โปรดดูคำตอบด้านล่างเกี่ยวกับความทึบ 0.99 - คำตอบที่ดีที่สุดที่นี่ - แต่ไม่ง่ายที่จะหาเพราะมันลึกมากในหน้า
Grouchal

1
สิ่งนี้เกิดขึ้นบน Linux ด้วย :-(
schlingel

1
คุณสามารถแทนที่การหมดเวลาด้วย requestAnimationFrame ซึ่งในกรณีนี้คุณจะได้สิ่งเดียวกัน แต่ด้วยความล่าช้า 16ms แทน 1000ms
trusktr

3
โปรดแจ้งปัญหา Chromiumสำหรับการแสดงผลที่ไม่ถูกต้อง ปรากฏว่าไม่มีใครทำเช่นนี้แม้จะเป็นเมื่อ 4 ปีก่อน
Bardi Harborow

คำตอบ:


183

ไม่แน่ใจว่าสิ่งที่คุณกำลังพยายามที่จะบรรลุ แต่นี่เป็นวิธีที่ฉันใช้ในอดีตกับความสำเร็จในการบังคับเบราว์เซอร์ที่จะวาดใหม่บางทีมันอาจจะทำงานให้คุณ

// in jquery
$('#parentOfElementToBeRedrawn').hide().show(0);

// in plain js
document.getElementById('parentOfElementToBeRedrawn').style.display = 'none';
document.getElementById('parentOfElementToBeRedrawn').style.display = 'block';

หากการวาดซ้ำอย่างง่ายนี้ไม่ทำงานคุณสามารถลองอันนี้ได้ มันแทรกโหนดข้อความที่ว่างเปล่าลงในองค์ประกอบที่รับประกันการวาดใหม่

var forceRedraw = function(element){

    if (!element) { return; }

    var n = document.createTextNode(' ');
    var disp = element.style.display;  // don't worry about previous display style

    element.appendChild(n);
    element.style.display = 'none';

    setTimeout(function(){
        element.style.display = disp;
        n.parentNode.removeChild(n);
    },20); // you can play with this timeout to make it as short as possible
}

แก้ไข: ในการตอบสนองต่อŠime Vidas สิ่งที่เราบรรลุที่นี่จะเป็นการ reflow บังคับ คุณสามารถหาข้อมูลเพิ่มเติมจากต้นแบบตัวเองhttp://paulirish.com/2011/dom-html5-css3-performance/


3
ตอนนี้, เป็นไปไม่ได้ที่จะวาดใหม่เพียงบางส่วนของวิวพอร์ต เบราว์เซอร์จะแสดงหน้าเว็บทั้งหน้าใหม่
Šime Vidas

39
แทน $ ('# parentOfElementToBeRedrawn'). hide (). show (); ฉันต้องการ. leather.show (0) เพื่อทำงานอย่างถูกต้องใน Chrome
l.poellabauer

1
@ l.poellabauer เหมือนกันที่นี่ - มันไม่สมเหตุสมผล ... แต่ขอบคุณ คุณรู้ได้ยังไง? :)
JohnIdol

6
FYI พื้นที่ที่เกี่ยวข้องที่ฉันกำลังทำอยู่คือรายการเลื่อนที่ไม่มีที่สิ้นสุด มันเป็นบิตทำไม่ได้ที่จะซ่อน / แสดงทั้ง UL ดังนั้นผมเล่นไปรอบ ๆ และพบว่าถ้าคุณทำ.hide().show(0)บนใด ๆองค์ประกอบ (ฉันเลือกที่ส่วนท้ายของหน้า) มันควรจะรีเฟรชหน้าเว็บ
treeface

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

62

คำตอบข้างต้นไม่เหมาะกับฉัน ฉันสังเกตเห็นว่าการปรับขนาดหน้าต่างทำให้เกิดการวาดใหม่ ดังนั้นนี่คือมันสำหรับฉัน:

$(window).trigger('resize');

11
คำใบ้: นี่จะวาดหน้าต่างที่สมบูรณ์ของคุณใหม่ซึ่งมีค่าใช้จ่ายสูงและอาจไม่ใช่สิ่งที่ OP ต้องการ
hereandnow78

7
การปรับขนาดหน้าต่างจะทำให้เกิดการ reflow แต่รหัส$(window).trigger('resize')ไม่ได้มันจะโยนเฉพาะเหตุการณ์ 'ปรับขนาด' ที่เรียกผู้จัดการที่เกี่ยวข้องถ้ามันได้รับมอบหมาย
guari

1
คุณช่วยฉันทั้งสัปดาห์! ปัญหาของฉันคือหลังจากการตั้งค่า <body style = "zoom: 67%"> หน้านั้นซูมไปยังระดับที่คาดไว้ แต่หน้านั้นค้างและไม่สามารถเลื่อนได้! คำตอบของคุณแก้ไขปัญหานี้ได้ทันที
user1143669

30

เราเพิ่งพบสิ่งนี้และค้นพบว่าการส่งเสริมองค์ประกอบที่ได้รับผลกระทบไปยังเลเยอร์คอมโพสิตที่มีtranslateZแก้ไขปัญหาโดยไม่ต้องใช้จาวาสคริปต์เพิ่มเติม

.willnotrender { 
   transform: translateZ(0); 
}

เนื่องจากปัญหาการทาสีเหล่านี้ส่วนใหญ่จะปรากฏใน Webkit / Blink และการแก้ไขนี้ส่วนใหญ่มุ่งไปที่ Webkit / Blink ดังนั้นจึงเป็นที่นิยมในบางกรณี โดยเฉพาะอย่างยิ่งเนื่องจากโซลูชัน JavaScript จำนวนมากทำให้เกิดการreflowและทาสีใหม่ไม่ใช่แค่ทาสีใหม่


1
สิ่งนี้ใช้ได้ผลดีสำหรับฉันเมื่อปัญหาคือองค์ประกอบ HTML ที่ลบออกที่วาดบนผืนผ้าใบแม้ว่าผ้าใบจะเคลื่อนไหวอย่างต่อเนื่อง
Knaģis

neon-animated-pagesการแก้ไขปัญหารูปแบบนี้ผมมีกับ ขอบคุณ: +1:
coffeesaga

1
สิ่งนี้ใช้ได้ผล Safari กำลังออกองค์ประกอบที่ซึ่งในชุด div เพื่อแสดงไม่มีใครสามารถมองเห็นและไม่สามารถเลือกได้ การปรับขนาดหน้าต่างทำให้พวกเขาหายไป การเพิ่มการแปลงนี้ทำให้ "สิ่งประดิษฐ์" หายไปอย่างที่คาดไว้
Jeff Mattson

28

วิธีการแก้ปัญหานี้โดยไม่ต้องหมดเวลา! วาดแรงจริง! สำหรับ Android และ iOS

var forceRedraw = function(element){
  var disp = element.style.display;
  element.style.display = 'none';
  var trick = element.offsetHeight;
  element.style.display = disp;
};

1
สิ่งนี้ไม่ได้ผลสำหรับฉันบน Chrome หรือ FF บน Linux อย่างไรก็ตามเพียงแค่เข้าถึง element.offsetHeight (โดยไม่ต้องแก้ไขคุณสมบัติการแสดงผล) จะทำงาน มันเป็นเหมือนที่เบราว์เซอร์จะข้ามการคำนวณ offsetHeight เมื่อองค์ประกอบไม่สามารถมองเห็นได้
Grodriguez

โซลูชันนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับการแก้ไขข้อบกพร่องที่ฉันพบในเบราว์เซอร์ที่ใช้โครเมียมซึ่งใช้ใน "overwolf" ฉันพยายามคิดวิธีการทำสิ่งนี้และคุณได้ช่วยฉัน
nacitar sevaht

13

มันใช้งานได้สำหรับฉัน รุ่งโรจน์ไปที่นี่

jQuery.fn.redraw = function() {
    return this.hide(0, function() {
        $(this).show();
    });
};

$(el).redraw();

1
แต่เหลือบางสิ่งที่แสดง 'ยังคง' เช่น ': บล็อก' ฯลฯ ซึ่งบางครั้งสามารถทำลายโครงสร้างหน้า
pie6k

สิ่งนี้ควรจะเหมือนกับ$().hide().show(0)
Mahn

@Mahn คุณลองดูไหม? ในการเดาของฉัน. leather () เป็นการไม่บล็อกดังนั้นมันจะข้ามการเรนเดอร์ใหม่ที่ทำงานในเบราว์เซอร์หรือที่รู้จักในจุดทั้งหมดของวิธี (และถ้าฉันจำได้อย่างถูกต้องฉันทดสอบมันแล้ว)
zupa

2
@zupa ได้รับการทดสอบและทำงานบน Chrome 38 เคล็ดลับคือshow()แตกต่างจากshow(0)ที่กล่าวโดยการระบุระยะเวลาในระยะหลังมันถูกเรียกใช้โดยวิธีการเคลื่อนไหว jQuery ในช่วงระยะเวลาหนึ่งซึ่งจะให้เวลาในการแสดงผลแบบเดียวกับที่hide(0, function() { $(this).show(); })ทำ .
Mahn

@ มานะโอเคจับได้ดีแล้ว แน่นอนว่าฉันจะแก้ปัญหาของคุณถ้ามันทำงานข้ามแพลตฟอร์มและไม่ใช่คุณสมบัติ jQuery ล่าสุด เนื่องจากฉันไม่มีเวลาที่จะทดสอบฉันจะเพิ่มมันตาม 'อาจทำงานได้' คุณสามารถแก้ไขคำตอบได้หากคุณคิดว่ามีผลข้างต้น
zupa

9

การซ่อนองค์ประกอบแล้วแสดงอีกครั้งภายใน setTimeout 0 จะบังคับให้วาดใหม่

$('#page').hide();
setTimeout(function() {
    $('#page').show();
}, 0);

1
หนึ่งนี้ทำงานเป็นข้อผิดพลาดที่ Chrome SVG กรองบางครั้งไม่ได้ทาสี, bugs.chromium.org/p/chromium/issues/detail?id=231560 การหมดเวลาเป็นสิ่งสำคัญ
Jason D

นี่คือสิ่งที่ใช้งานได้สำหรับฉันในขณะที่พยายามบังคับให้ Chrome คำนวณค่าใหม่myElement.getBoundingClientRect()ซึ่งมีการแคชซึ่งน่าจะเป็นจุดประสงค์ในการเพิ่มประสิทธิภาพ / ประสิทธิภาพ ฉันเพิ่มการหมดเวลาเป็นศูนย์เป็นมิลลิวินาทีสำหรับฟังก์ชันที่เพิ่มองค์ประกอบใหม่ลงใน DOM และรับค่าใหม่หลังจากองค์ประกอบเก่าที่มีค่า (แคช) ก่อนหน้านี้ถูกลบออกจาก DOM
TheDarkIn1978

6

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

$(el).css("opacity", .99);
setTimeout(function(){
   $(el).css("opacity", 1);
},20);

จะทำงานให้ฉันอยู่ในโครเมี่ยมรุ่น 60.0.3112.113 เกี่ยวกับข้อผิดพลาดนี้: ฉบับที่ 727076 มีประสิทธิภาพและละเอียดอ่อน; ขอบคุณมาก.
Lonnie Best

@ wiktus239 บางที 20 มิลลิวินาทีเร็วเกินไปและเบราว์เซอร์ไม่มีเวลาเปลี่ยนเป็น. 99 ก่อนที่เวลาจะเปลี่ยนกลับเป็น 1.0? - เคล็ดลับความทึบนี้เหมาะสำหรับฉันเพื่อสร้างเนื้อหาใน iframe ที่มองเห็นได้ใน iPhone iOS 12 Safari และฉันสลับทุก 1,000,000 มิลลิวินาที นั่นคือสิ่งที่อยู่ในปัญหาที่ถูกเชื่อมโยง 727076 ในความคิดเห็นด้านบน (1,000 มิลลิวินาที)
KajMagnus

4

โทรwindow.getComputedStyle()ควรบังคับ reflow


2
ไม่ได้ผลสำหรับฉัน แต่อาจเป็นเพราะฉันต้องการoffsetHeightคุณสมบัติที่ไม่ใช่ css
Sebas

3

ฉันพบกับความท้าทายนี้ใน OSX El Capitan ด้วย Chrome v51 หน้าเว็บดังกล่าวทำงานได้ดีใน Safari ฉันลองเกือบทุกข้อเสนอแนะในหน้านี้ - ไม่มีใครทำงานถูกต้อง - ทั้งหมดมีผลข้างเคียง ... ฉันลงเอยด้วยการใช้รหัสด้านล่าง - ง่ายมาก - ไม่มีผลข้างเคียง (ยังคงทำงานเหมือนเดิมใน Safari)

การแก้ไข: สลับคลาสกับองค์ประกอบที่มีปัญหาตามต้องการ สลับแต่ละครั้งจะบังคับให้วาดใหม่ (ฉันใช้ jQuery เพื่อความสะดวก แต่ JavaScript วานิลลาไม่น่าจะมีปัญหา ... )

jQuery Class Toggle

$('.slide.force').toggleClass('force-redraw');

คลาส CSS

.force-redraw::before { content: "" }

และนั่นคือ ...

หมายเหตุ: คุณต้องเรียกใช้ตัวอย่างข้อมูลด้านล่าง "เต็มหน้า" เพื่อดูผลกระทบ

$(window).resize(function() {
  $('.slide.force').toggleClass('force-redraw');
});
.force-redraw::before {
  content: "";
}
html,
body {
  height: 100%;
  width: 100%;
  overflow: hidden;
}
.slide-container {
  width: 100%;
  height: 100%;
  overflow-x: scroll;
  overflow-y: hidden;
  white-space: nowrap;
  padding-left: 10%;
  padding-right: 5%;
}
.slide {
  position: relative;
  display: inline-block;
  height: 30%;
  border: 1px solid green;
}
.slide-sizer {
  height: 160%;
  pointer-events: none;
  //border: 1px solid red;

}
.slide-contents {
  position: absolute;
  top: 10%;
  left: 10%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p>
  This sample code is a simple style-based solution to maintain aspect ratio of an element based on a dynamic height.  As you increase and decrease the window height, the elements should follow and the width should follow in turn to maintain the aspect ratio.  You will notice that in Chrome on OSX (at least), the "Not Forced" element does not maintain a proper ratio.
</p>
<div class="slide-container">
  <div class="slide">
    <img class="slide-sizer" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
    <div class="slide-contents">
      Not Forced
    </div>
  </div>
  <div class="slide force">
    <img class="slide-sizer" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
    <div class="slide-contents">
      Forced
    </div>
  </div>
</div>


2
function resizeWindow(){
    var evt = document.createEvent('UIEvents');
    evt.initUIEvent('resize', true, false,window,0);
    window.dispatchEvent(evt); 
}

เรียกใช้ฟังก์ชันนี้หลังจาก 500 มิลลิวินาที


2

หากคุณต้องการรักษาสไตล์ที่ประกาศไว้ในสไตล์ชีตของคุณควรใช้สิ่งต่อไปนี้:

jQuery.fn.redraw = function() {
    this.css('display', 'none'); 
    var temp = this[0].offsetHeight;
    this.css('display', '');
    temp = this[0].offsetHeight;
};

$('.layer-to-repaint').redraw();

หมายเหตุ: ด้วย webkit / กะพริบล่าสุดการจัดเก็บค่าของ offsetHeightเป็นสิ่งจำเป็นเพื่อกระตุ้นการทาสีมิฉะนั้น VM (สำหรับวัตถุประสงค์ในการปรับให้เหมาะสม) อาจข้ามคำสั่งนั้น

อัปเดต: เพิ่มการoffsetHeightอ่านครั้งที่สองเป็นสิ่งจำเป็นเพื่อป้องกันไม่ให้เบราว์เซอร์เข้าคิว / แคชการเปลี่ยนแปลงคุณสมบัติ / คลาส CSS ต่อไปนี้ด้วยการคืนdisplayค่า (วิธีนี้ควรเปลี่ยนการเปลี่ยน CSS ที่สามารถติดตามได้)


1

ตัวอย่าง Html:

<section id="parent">
  <article class="child"></article>
  <article class="child"></article>
</section>

js:

  jQuery.fn.redraw = function() {
        return this.hide(0,function() {$(this).show(100);});
        // hide immediately and show with 100ms duration

    };

ฟังก์ชั่นการโทร:

$('article.child').redraw(); // <== ความคิดที่ไม่ดี

$('#parent').redraw();

ใช้ได้กับ.fadeIn(1)แทน.show(300)สำหรับฉัน - ไม่ผลักองค์ประกอบไปรอบ ๆ ดังนั้นฉันเดาว่ามันคือการกระตุ้นdisplay:noneและกลับไปที่block
BananaAcid

0

วิธีการที่เหมาะกับฉันบน IE (ฉันไม่สามารถใช้เทคนิคการแสดงผลได้เพราะมีอินพุตที่ต้องไม่โฟกัสหลวม)

มันทำงานได้ถ้าคุณมีระยะขอบ 0 (การเปลี่ยนการแพ็ดดิ้งก็ใช้ได้เช่นกัน)

if(div.style.marginLeft == '0px'){
    div.style.marginLeft = '';
    div.style.marginRight = '0px';
} else {
    div.style.marginLeft = '0px';
    div.style.marginRight = '';
}

0

CSS เท่านั้น สิ่งนี้ใช้ได้กับสถานการณ์ที่องค์ประกอบลูกถูกลบหรือเพิ่ม ในสถานการณ์เหล่านี้เส้นขอบและมุมโค้งมนสามารถทิ้งสิ่งประดิษฐ์ไว้ได้

el:after { content: " "; }
el:before { content: " "; }

0

การแก้ไขของฉันสำหรับ IE10 + IE11 โดยทั่วไปสิ่งที่เกิดขึ้นคือคุณเพิ่ม DIV ภายในองค์ประกอบการห่อที่ต้องคำนวณใหม่ จากนั้นเพียงลบและ voila; ทำงานเหมือนมีเสน่ห์ :)

    _initForceBrowserRepaint: function() {
        $('#wrapper').append('<div style="width=100%" id="dummydiv"></div>');
        $('#dummydiv').width(function() { return $(this).width() - 1; }).width(function() { return $(this).width() + 1; });
        $('#dummydiv').remove();
    },

0

คำตอบส่วนใหญ่จำเป็นต้องใช้การหมดเวลาแบบอะซิงโครนัสซึ่งทำให้เกิดการกะพริบที่น่ารำคาญ

แต่ฉันมากับอันนี้ซึ่งทำงานได้อย่างราบรื่นเพราะมันเป็นซิงโครนัส:

var p = el.parentNode,
    s = el.nextSibling;
p.removeChild(el);
p.insertBefore(el, s);

กิจกรรมที่แนบกับองค์ประกอบเหล่านี้จะยังใช้งานได้หรือไม่
Kerry Johnson

0

นี่คือโซลูชันของฉันที่ใช้ในการหายไปของเนื้อหา ...

<script type = 'text/javascript'>
    var trash_div;

    setInterval(function()
    {
        if (document.body)
        {
            if (!trash_div)
                trash_div = document.createElement('div');

            document.body.appendChild(trash_div);
            document.body.removeChild(trash_div);
        }
    }, 1000 / 25); //25 fps...
</script>

0

ฉันพบปัญหาที่คล้ายกันและบรรทัดง่ายๆของ JS นี้ช่วยแก้ไข:

document.getElementsByTagName('body')[0].focus();

ในกรณีของฉันมันเป็นข้อผิดพลาดที่มีนามสกุล Chrome ไม่ได้วาดหน้าใหม่หลังจากเปลี่ยน CSS จากภายในส่วนขยาย


4
นี่คือการแบ่งการเข้าถึงแป้นพิมพ์
Pangamma

0

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

// Set initial HTML description
var defaultHTML;
function DefaultSave() {
  defaultHTML = document.body.innerHTML;
}
// Restore HTML description to initial state
function HTMLRestore() {
  document.body.innerHTML = defaultHTML;
}



DefaultSave()
<input type="button" value="Restore" onclick="HTMLRestore()">

0

ฉันมีรายการส่วนประกอบการตอบสนองซึ่งเมื่อเลื่อนแล้วเปิดอีกหน้าจากนั้นเมื่อย้อนกลับรายการจะไม่แสดงผลบน Safari iOS จนกว่าหน้าจะถูกเลื่อน นี่คือการแก้ไข

    componentDidMount() {
        setTimeout(() => {
            window.scrollBy(0, 0);
        }, 300);
    }

0

css ด้านล่างใช้ได้กับฉันบน IE 11 และ Edge ไม่จำเป็นต้องใช้ JS scaleY(1)ไม่หลอกลวงที่นี่ ดูเหมือนทางออกที่ง่ายที่สุด

.box {
    max-height: 360px;
    transition: all 0.3s ease-out;
    transform: scaleY(1);
}
.box.collapse {
    max-height: 0;
}


0

2020: เบาและแข็งแรง

โซลูชันก่อนหน้านี้ไม่ทำงานอีกต่อไปสำหรับฉัน

ฉันเดาว่าเบราว์เซอร์จะปรับกระบวนการวาดภาพให้เหมาะสมที่สุดโดยตรวจพบการเปลี่ยนแปลงที่ "ไร้ประโยชน์" มากขึ้นเรื่อย ๆ

วิธีนี้ทำให้เบราว์เซอร์วาดโคลนเพื่อแทนที่องค์ประกอบเดิม มันใช้งานได้และอาจยั่งยืนกว่า:

const element = document.querySelector('selector');
if (element ) {
  const clone = element.cloneNode(true);
  element.replaceWith(clone);
}

ทดสอบบน Chrome 80 / Edge 80 / Firefox 75

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