How to make a loading gif in JavaScript?

1

I have a very stupid problem with my HTML project, where I wanted to show a gif of a page being uploaded, but it stays a lot longer than I can tell and with that, my real page does not come to be seen. Could someone help me with this?

HTML:

</head>
  <body onload="myFunction()" style="margin:0;">
    <div class="loader"></div>
    <div style="display:none;" class="myDiv" class="animate-bottom">
<header>

CSS:

/* Center the loader */
.loader {
  position: absolute;
  left: 50%;
  top: 50%;
  z-index: 1;
  width: 150px;
  height: 150px;
  margin: -75px 0 0 -75px;
  border: 16px solid #f3f3f3;
  border-radius: 50%;
  border-top: 16px solid #3498db;
  width: 120px;
  height: 120px;
  -webkit-animation: spin 2s linear infinite;
  animation: spin 2s linear infinite;
}

@-webkit-keyframes spin {
  0% { -webkit-transform: rotate(0deg); }
  100% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

/* Add animation to "page content" */
.animate-bottom {
  position: relative;
  -webkit-animation-name: animatebottom;
  -webkit-animation-duration: 1s;
  animation-name: animatebottom;
  animation-duration: 1s
}

@-webkit-keyframes animatebottom {
  from { bottom:-100px; opacity:0 } 
  to { bottom:0px; opacity:1 }
}

@keyframes animatebottom { 
  from{ bottom:-100px; opacity:0 } 
  to{ bottom:0; opacity:1 }
}

.myDiv {
  display: none;
  text-align: center;
}

JS:

var myVar;

function myFunction() {
    myVar = setTimeout(showPage, 30);
}

function showPage() {
  document.getElementById("loader").style.display = "none";
  document.getElementById("myDiv").style.display = "block";
}
    
asked by anonymous 05.06.2018 / 21:41

2 answers

3

You are trying to select elements that do not have the id indicated, but classes:

       ↓
<div class="loader"></div>
                             ↓
<div style="display:none;" class="myDiv" class="animate-bottom">

                     ↓
document.getElementById("loader").style.display = "none";
                     ↓
document.getElementById("myDiv").style.display = "block";
  

There is also an error that is the double declaration of class . This will   that the second is ignored. Change to: class="myDiv animate-bottom" , putting both classes in the same statement.

But since they are unique elements, change class to id in HTML:

<div id="loader"></div>
<div style="display:none;" id="myDiv" class="animate-bottom">

And in CSS also change . by # :

↓
#loader {
  position: absolute;
  left: 50%;
  top: 50%;
  z-index: 1;
  width: 150px;
  height: 150px;
  margin: -75px 0 0 -75px;
  border: 16px solid #f3f3f3;
  border-radius: 50%;
  border-top: 16px solid #3498db;
  width: 120px;
  height: 120px;
  -webkit-animation: spin 2s linear infinite;
  animation: spin 2s linear infinite;
}

↓    
#myDiv {
  display: none;
  text-align: center;
}

See:

var myVar;

function myFunction() {
    myVar = setTimeout(showPage, 2000); // aumentei o tempo para ilustração
}

function showPage() {
   document.getElementById("loader").style.display = "none";
   document.getElementById("myDiv").style.display = "block";
}
#loader {
  position: absolute;
  left: 50%;
  top: 50%;
  z-index: 1;
  width: 150px;
  height: 150px;
  margin: -75px 0 0 -75px;
  border: 16px solid #f3f3f3;
  border-radius: 50%;
  border-top: 16px solid #3498db;
  width: 120px;
  height: 120px;
  -webkit-animation: spin 2s linear infinite;
  animation: spin 2s linear infinite;
}

@-webkit-keyframes spin {
  0% { -webkit-transform: rotate(0deg); }
  100% { -webkit-transform: rotate(360deg); }
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

/* Add animation to "page content" */
.animate-bottom {
  position: relative;
  -webkit-animation-name: animatebottom;
  -webkit-animation-duration: 1s;
  animation-name: animatebottom;
  animation-duration: 1s
}

@-webkit-keyframes animatebottom {
  from { bottom:-100px; opacity:0 } 
  to { bottom:0px; opacity:1 }
}

@keyframes animatebottom { 
  from{ bottom:-100px; opacity:0 } 
  to{ bottom:0; opacity:1 }
}

#myDiv {
  display: none;
  text-align: center;
}
<body onload="myFunction()" style="margin:0;">
<div id="loader"></div>
<div style="display:none;" id="myDiv" class="animate-bottom">
  

Or you can simply select the elements by class with    getElementsByClassName :

function showPage() {
   document.getElementsByClassName("loader")[0].style.display = "none";
   document.getElementsByClassName("myDiv")[0].style.display = "block";
}

Where index [0] means that these elements are the first of the classes present on the page.

But I find it much more recommended in this case to use id s as I indicated at the beginning of the answer.

    
05.06.2018 / 23:12
0

Try using JavaScript .BlockUI, see the example

if (id > 0) {
    //Bloquei a tela e mostra a mensagem
       $.blockUI({ message: " Carregando informações da base de dados, isso pode demorar alguns segundos... " });

        ChamaCarregaDados(); // depois que carregar todos os dados

     $.unblockUI(); //Desbloquear UI

    }


    -> não esqueça de colocar a biblioteca
    <script src="jquery.blockUI.1.33.js"></script>

download on
link

Example of how to get

    
05.06.2018 / 21:57