我的网站上有一个部分加载速度很慢,因为它正在进行一些密集的调用。
任何想法如何让div
说出类似于“加载”的内容,以便在页面准备好时显示,然后在一切准备就绪时消失?
答案 0 :(得分:182)
我需要这个,经过互联网上的一些研究,我想出了这个(需要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;
}
最后将此javascript添加到您的页面(最好在页面末尾,然后在关闭<body>
标记之前):
<script language="javascript" type="text/javascript">
$(window).load(function() {
$('#loading').hide();
});
</script>
然后使用帮助样式类调整加载图像的位置和加载div的背景颜色。
这就是它,工作正常。但是当然你必须在某处ajax-loader.gif
。
答案 1 :(得分:24)
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>
在JS中创建最简单fadeout效果的页面加载图片:
答案 2 :(得分:23)
此脚本将在页面加载时添加覆盖整个屏幕的div。它将自动显示仅CSS加载微调器。它将一直等到窗口(不是文档)完成加载,然后等待可选的额外几秒钟。
来自https://projects.lukehaas.me/css-loaders
的CSS加载程序代码
$('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 screen 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>
答案 3 :(得分:6)
将内容默认为display:none
,然后有一个事件处理程序,在完全加载后将其设置为display:block
或类似内容。然后将一个div设置为display:block
,其中包含“正在加载”,并在与之前相同的事件处理程序中将其设置为display:none
。
答案 4 :(得分:6)
我还有另外一个简单的解决方案,对我来说非常有用。
首先,创建一个名为 Lockon 类的CSS,该类是透明叠加层,同时加载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,这会产生结果,一旦页面准备好在窗口上加载功能一旦屏幕满载,它将触发并隐藏封面屏幕。
答案 5 :(得分:2)
嗯,这在很大程度上取决于你如何加载“密集调用”中所需的元素,我最初的想法是你通过ajax进行这些加载。如果是这种情况,那么您可以使用'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'
选项之一和jQuery中的$(document).ready(...)
可能是要走的路。 $(document).ready()
函数在执行之前等待加载整个文档结构(但它不等待所有媒体加载)。你会做这样的事情:
$(document).ready( function() {
$('table#with_slow_data').show();
$('div#loading image or text').hide();
});
答案 6 :(得分:2)
我的博客将百分之百地工作。
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">
答案 7 :(得分:1)
创建包含加载消息的<div>
元素,为<div>
提供ID,然后在内容加载完成后隐藏<div>
:
$("#myElement").css("display", "none");
...或纯JavaScript:
document.getElementById("myElement").style.display = "none";
答案 8 :(得分:1)
这里是我最终使用的jQuery,它监视所有ajax启动/停止,所以你不需要将它添加到每个ajax调用中:
$(document).ajaxStart(function(){
$("#loading").removeClass('hide');
}).ajaxStop(function(){
$("#loading").addClass('hide');
});
装载容器的CSS&amp;内容(主要来自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>
答案 9 :(得分:0)
基于@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();
});
答案 10 :(得分:0)
这将与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); }
}
答案 11 :(得分:0)
主题中的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;
}
答案 12 :(得分:0)
我需要一个闪屏,我通过重用这里列出的部分解决方案来实现。它使用 Vanilla JS 实现完全向后兼容性。
第 1 步:在页面顶部添加带有微调 gif 的背景,然后在加载所有内容后将其删除。
body.has-js::before {
content: '';
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 10;
height: 100vh;
width: 100vw;
pointer-events: none;
transition: all .2s;
background: white url('/img/spinner.gif') no-repeat center center / 50px;
}
body.loaded::before {
opacity: 0;
width: 0;
height: 0;
}
第 2 步:在打开 body 标签之后添加一个小脚本以开始显示加载/启动画面。
<body>
<script>
// Only show loader if JS is available
document.body.className += ' has-js';
// Option 1: Hide loader when 'load' event fires
window.onload = function() { document.body.className += ' loaded'; }
// Option 2: Hide loader after 2 seconds, in case the 'load' event never fires
setTimeout(function(){ document.body.className += ' loaded'; }, 1000 * 2);
</script>
<!-- Page content goes after this -->
</body>