ฉันมีส่วนหนึ่งในเว็บไซต์ของเราที่โหลดค่อนข้างช้าเนื่องจากมีการโทรจำนวนมาก
ความคิดใดที่ฉันสามารถdiv
บอกสิ่งที่คล้ายกับ "กำลังโหลด" เพื่อแสดงในขณะที่หน้าเตรียมตัวเองแล้วหายไปเมื่อทุกอย่างพร้อม?
ฉันมีส่วนหนึ่งในเว็บไซต์ของเราที่โหลดค่อนข้างช้าเนื่องจากมีการโทรจำนวนมาก
ความคิดใดที่ฉันสามารถdiv
บอกสิ่งที่คล้ายกับ "กำลังโหลด" เพื่อแสดงในขณะที่หน้าเตรียมตัวเองแล้วหายไปเมื่อทุกอย่างพร้อม?
คำตอบ:
ฉันต้องการสิ่งนี้และหลังจากการวิจัยบางอย่างฉันมาด้วยสิ่งนี้ ( จำเป็นต้องjQuery ):
ก่อนอื่นหลังจาก<body>
ติดป้ายเพิ่มแล้ว:
<div id="loading">
<img id="loading-image" src="images/ajax-loader.gif" alt="Loading..." />
</div>
จากนั้นเพิ่มคลาสสไตล์สำหรับ div และรูปภาพใน CSS ของคุณ:
#loading {
width: 100%;
height: 100%;
top: 0;
left: 0;
position: fixed;
display: block;
opacity: 0.7;
background-color: #fff;
z-index: 99;
text-align: center;
}
#loading-image {
position: absolute;
top: 100px;
left: 240px;
z-index: 100;
}
จากนั้นเพิ่มจาวาสคริปต์นี้ในหน้าของคุณ (โดยเฉพาะอย่างยิ่งในตอนท้ายของหน้าของคุณก่อนที่</body>
แท็กปิดของคุณ):
<script>
$(window).load(function() {
$('#loading').hide();
});
</script>
ในที่สุดปรับตำแหน่งของภาพการโหลดและbackground-colour
div ของการโหลดด้วยคลาสสไตล์
นี่มันควรจะทำงานได้ดี แต่แน่นอนคุณต้องมีajax-loader.gif
ที่ไหนสักแห่ง freebies ที่นี่ (คลิกขวา> บันทึกภาพเป็น ... )
$('#loading').hide();
ในการโหลดแต่ละหน้า
สคริปต์นี้จะเพิ่ม div ที่ครอบคลุมทั้งหน้าต่างเมื่อโหลดหน้าเว็บ มันจะแสดงเพียงแค่โหลดสปินเนอร์ CSS เท่านั้นโดยอัตโนมัติ มันจะรอจนกว่าหน้าต่าง (ไม่ใช่เอกสาร) โหลดเสร็จแล้วมันจะรออีกไม่กี่วินาทีพิเศษ
โค้ดตัวโหลด CSS จากhttps://projects.lukehaas.me/css-loaders
$('body').append('<div style="" id="loadingDiv"><div class="loader">Loading...</div></div>');
$(window).on('load', function(){
setTimeout(removeLoader, 2000); //wait for page load PLUS two seconds.
});
function removeLoader(){
$( "#loadingDiv" ).fadeOut(500, function() {
// fadeOut complete. Remove the loading div
$( "#loadingDiv" ).remove(); //makes page more lightweight
});
}
.loader,
.loader:after {
border-radius: 50%;
width: 10em;
height: 10em;
}
.loader {
margin: 60px auto;
font-size: 10px;
position: relative;
text-indent: -9999em;
border-top: 1.1em solid rgba(255, 255, 255, 0.2);
border-right: 1.1em solid rgba(255, 255, 255, 0.2);
border-bottom: 1.1em solid rgba(255, 255, 255, 0.2);
border-left: 1.1em solid #ffffff;
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
-webkit-animation: load8 1.1s infinite linear;
animation: load8 1.1s infinite linear;
}
@-webkit-keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes load8 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#loadingDiv {
position:absolute;;
top:0;
left:0;
width:100%;
height:100%;
background-color:#000;
}
This script will add a div that covers the entire window as the page loads. It will show a CSS-only loading spinner automatically. It will wait until the window (not the document) finishes loading.
<ul>
<li>Works with jQuery 3, which has a new window load event</li>
<li>No image needed but it's easy to add one</li>
<li>Change the delay for branding or instructions</li>
<li>Only dependency is jQuery.</li>
</ul>
Place the script below at the bottom of the body.
CSS loader code from https://projects.lukehaas.me/css-loaders
<!-- Place the script below at the bottom of the body -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
$(window).on("load", handler)
ยิงเมื่อวัตถุ DOM ทั้งหมดโหลดเสร็จรวมถึงรูปภาพสคริปต์หรือแม้แต่ iframes หากคุณต้องการรอให้โหลดภาพที่เฉพาะเจาะจงใช้$('#imageId').on("load", handler)
$( "#loadingDiv" ).remove();
ด้วย$( "#loadingDiv" ).hide();
และเพิ่มก่อน$( "#loadingDiv" ).show();
setTimeout(removeLoader, 2000);
ฉันได้ลบ div ออกเพื่อทำให้หน้าเว็บมีน้ำหนักเบาขึ้น แต่การแก้ไขนี้ทำให้สามารถใช้ซ้ำได้
window.onload = function(){ document.getElementById("loading").style.display = "none" }
#loading {width: 100%;height: 100%;top: 0px;left: 0px;position: fixed;display: block; z-index: 99}
#loading-image {position: absolute;top: 40%;left: 45%;z-index: 100}
<div id="loading">
<img id="loading-image" src="img/loading.gif" alt="Loading..." />
</div>
รูปภาพการโหลดหน้าเว็บที่มีเอฟเฟกต์fadeout ที่ง่ายที่สุดที่สร้างใน JS
ฉันมีวิธีแก้ไขปัญหาง่ายๆด้านล่างนี้สำหรับการทำงานที่สมบูรณ์แบบสำหรับฉัน
ก่อนอื่นให้สร้าง CSS ที่มีชื่อคลาสLockonซึ่งเป็นโอเวอร์เลย์แบบโปร่งใสพร้อมกับโหลด GIF ดังที่แสดงด้านล่าง
.LockOn {
display: block;
visibility: visible;
position: absolute;
z-index: 999;
top: 0px;
left: 0px;
width: 105%;
height: 105%;
background-color:white;
vertical-align:bottom;
padding-top: 20%;
filter: alpha(opacity=75);
opacity: 0.75;
font-size:large;
color:blue;
font-style:italic;
font-weight:400;
background-image: url("../Common/loadingGIF.gif");
background-repeat: no-repeat;
background-attachment: fixed;
background-position: center;
}
ตอนนี้เราจำเป็นต้องสร้าง div ของเราด้วยคลาสนี้ซึ่งครอบคลุมทั้งหน้าเป็นการวางซ้อนเมื่อใดก็ตามที่หน้าโหลด
<div id="coverScreen" class="LockOn">
</div>
ตอนนี้เราต้องซ่อนหน้าจอปกนี้เมื่อใดก็ตามที่หน้าพร้อมและเพื่อให้เราสามารถ จำกัด ผู้ใช้จากการคลิก / ยิงเหตุการณ์ใด ๆ จนกว่าหน้าจะพร้อม
$(window).on('load', function () {
$("#coverScreen").hide();
});
วิธีแก้ปัญหาข้างต้นจะใช้ได้เมื่อใดก็ตามที่มีการโหลดหน้าเว็บ
ตอนนี้คำถามคือหลังจากโหลดหน้าเว็บแล้วเมื่อใดก็ตามที่เราคลิกปุ่มหรือเหตุการณ์ที่ใช้เวลานานเราจำเป็นต้องแสดงสิ่งนี้ในเหตุการณ์การคลิกของลูกค้าดังแสดงด้านล่าง
$("#ucNoteGrid_grdViewNotes_ctl01_btnPrint").click(function () {
$("#coverScreen").show();
});
ซึ่งหมายความว่าเมื่อเราคลิกปุ่มพิมพ์นี้ (ซึ่งจะใช้เวลานานในการรายงาน) มันจะแสดงหน้าจอปกของเราด้วย GIF ซึ่งให้ผลลัพธ์และเมื่อหน้าพร้อมหน้าต่างด้านบนเมื่อฟังก์ชั่นโหลดจะเริ่มทำงานและที่ซ่อนหน้าจอปก เมื่อหน้าจอเต็มแล้ว
เริ่มต้นเนื้อหาไปที่display:none
แล้วมีตัวจัดการเหตุการณ์ที่กำหนดเป็นdisplay:block
หรือคล้ายกันหลังจากที่โหลดเต็ม จากนั้นให้ div ที่ถูกตั้งค่าเป็นdisplay:block
"กำลังโหลด" อยู่ในนั้นและตั้งค่าdisplay:none
เป็นตัวจัดการเหตุการณ์เดียวกับเมื่อก่อน
ส่วนใหญ่นี้ขึ้นอยู่กับว่าคุณกำลังโหลดองค์ประกอบที่จำเป็นใน 'การโทรอย่างเข้มข้น' ความคิดเริ่มต้นของฉันคือการที่คุณโหลดสิ่งเหล่านี้ผ่านทางอาแจ็กซ์ หากเป็นเช่นนั้นคุณสามารถใช้ตัวเลือก 'beforeSend' และทำการโทร ajax ดังนี้:
$.ajax({
type: 'GET',
url: "some.php",
data: "name=John&location=Boston",
beforeSend: function(xhr){ <---- use this option here
$('.select_element_you_want_to_load_into').html('Loading...');
},
success: function(msg){
$('.select_element_you_want_to_load_into').html(msg);
}
});
แก้ไข
ฉันเห็นว่าในกรณีนั้นใช้หนึ่งใน'display:block'/'display:none'
ตัวเลือกข้างต้นร่วมกับ$(document).ready(...)
จาก jQuery น่าจะเป็นวิธีที่จะไป $(document).ready()
รอฟังก์ชั่นสำหรับโครงสร้างเอกสารทั้งหมดที่จะโหลดก่อนที่จะดำเนิน ( แต่ก็ไม่ได้รอให้ทุกสื่อโหลด ) คุณต้องการทำสิ่งนี้:
$(document).ready( function() {
$('table#with_slow_data').show();
$('div#loading image or text').hide();
});
beforeSend
และsuccess
การโทร ajax แต่ละครั้ง
บล็อกของฉันจะใช้งานได้ 100 เปอร์เซ็นต์
function showLoader()
{
$(".loader").fadeIn("slow");
}
function hideLoader()
{
$(".loader").fadeOut("slow");
}
.loader {
position: fixed;
left: 0px;
top: 0px;
width: 100%;
height: 100%;
z-index: 9999;
background: url('pageLoader2.gif') 50% 50% no-repeat rgb(249,249,249);
opacity: .8;
}
<div class="loader">
สร้าง<div>
องค์ประกอบที่มีข้อความการโหลดของคุณกำหนด<div>
ID จากนั้นเมื่อเนื้อหาของคุณโหลดเสร็จแล้วให้ซ่อน<div>
:
$("#myElement").css("display", "none");
... หรือใน JavaScript ธรรมดา:
document.getElementById("myElement").style.display = "none";
$("#myElement").hide()
ง่ายในสายตา?
นี่คือ jQuery ที่ฉันใช้ซึ่งจะตรวจสอบ ajax ทั้งหมดเริ่ม / หยุดดังนั้นคุณไม่จำเป็นต้องเพิ่มมันลงในการโทร ajax แต่ละครั้ง:
$(document).ajaxStart(function(){
$("#loading").removeClass('hide');
}).ajaxStop(function(){
$("#loading").addClass('hide');
});
CSS สำหรับการโหลดคอนเทนเนอร์ & เนื้อหา (ส่วนใหญ่มาจากคำตอบของ mehyaa) เช่นเดียวกับhide
คลาส:
#loading {
width: 100%;
height: 100%;
top: 0px;
left: 0px;
position: fixed;
display: block;
opacity: 0.7;
background-color: #fff;
z-index: 99;
text-align: center;
}
#loading-content {
position: absolute;
top: 50%;
left: 50%;
text-align: center;
z-index: 100;
}
.hide{
display: none;
}
HTML:
<div id="loading" class="hide">
<div id="loading-content">
Loading...
</div>
</div>
ตามคำตอบ @mehyaa แต่สั้นกว่ามาก:
HTML (ทันทีหลังจาก<body>
):
<img id = "loading" src = "loading.gif" alt = "Loading indicator">
CSS:
#loading {
position: absolute;
top: 50%;
left: 50%;
width: 32px;
height: 32px;
/* 1/2 of the height and width of the actual gif */
margin: -16px 0 0 -16px;
z-index: 100;
}
Javascript (jQuery เนื่องจากฉันใช้อยู่แล้ว):
$(window).load(function() {
$('#loading').remove();
});
hide()
องค์ประกอบมากกว่าremove()
มันเพื่อให้คุณสามารถใช้งานได้อีกครั้ง
นี่จะเป็นการซิงโครไนซ์กับการเรียก api, เมื่อการเรียก api ถูกทริกเกอร์, โหลดเดอร์จะปรากฏขึ้น เมื่อการเรียก api สำเร็จแล้วตัวโหลดจะถูกลบออก สิ่งนี้สามารถใช้สำหรับการโหลดหน้าหรือระหว่างการเรียก API
$.ajax({
type: 'GET',
url: url,
async: true,
dataType: 'json',
beforeSend: function (xhr) {
$( "<div class='loader' id='searching-loader'></div>").appendTo("#table-playlist-section");
$("html, body").animate( { scrollTop: $(document).height() }, 100);
},
success: function (jsonOptions) {
$('#searching-loader').remove();
.
.
}
});
CSS
.loader {
border: 2px solid #f3f3f3;
border-radius: 50%;
border-top: 2px solid #3498db;
width: 30px;
height: 30px;
margin: auto;
-webkit-animation: spin 2s linear infinite; /* Safari */
animation: spin 2s linear infinite;
margin-top: 35px;
margin-bottom: -35px;
}
/* Safari */
@-webkit-keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
สำหรับ drupal ในไฟล์ custom_theme.theme ธีมของคุณ
function custom_theme_preprocess_html(&$variables) {
$variables['preloader'] = 1;
}
ในไฟล์ html.html.twig หลังจากข้ามลิงค์เนื้อหาหลักในเนื้อหา
{% if preloader %}
<div id="test-preloader" >
<div id="preloader-inner" class="cssload-container">
<div class="wait-text">{{ 'Please wait...'|t }} </div>
<div class="cssload-item cssload-moon"></div>
</div>
</div>
{% endif %}
ในไฟล์ css
#test-preloader {
position: fixed;
background: white;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 9999;
}
.cssload-container .wait-text {
text-align: center;
padding-bottom: 15px;
color: #000;
}
.cssload-container .cssload-item {
margin: auto;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 131px;
height: 131px;
background-color: #fff;
box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-shadow: 0 0 21px 3px rgba(130, 130, 130, 0.26);
-o-box-shadow: 0 0 21px 3px rgba(130, 130, 130, 0.26);
-ms-box-shadow: 0 0 21px 3px rgba(130, 130, 130, 0.26);
-webkit-box-shadow: 0 0 21px 3px rgba(130, 130, 130, 0.26);
-moz-box-shadow: 0 0 21px 3px rgba(130, 130, 130, 0.26);
}
.cssload-container .cssload-moon {
border-bottom: 26px solid #008AFA;
border-radius: 50%;
-o-border-radius: 50%;
-ms-border-radius: 50%;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
animation: spin 1.45s ease infinite;
-o-animation: spin 1.45s ease infinite;
-ms-animation: spin 1.45s ease infinite;
-webkit-animation: spin 1.45s ease infinite;
-moz-animation: spin 1.45s ease infinite;
}