Home  >  Article  >  Web Front-end  >  css3 realizes the effect of displaying multiple elements in sequence_css3_CSS_web page production

css3 realizes the effect of displaying multiple elements in sequence_css3_CSS_web page production

韦小宝
韦小宝Original
2017-12-16 10:25:433702browse

In CSS3, we use animation combined with keyframes to add various animation effects to elements. This article mainly introduces the effect of CSS3 to realize the sequential display of multiple elements. Friends who are interested in CSS3 and those who need it can refer to

As shown in the picture above, in Many event promotions often need to use such an animation effect in HTML5. Especially as the end of the year is approaching, some students may be busy working on the company’s event page. It may be helpful to get such a small skill.

In CSS3, we use animation combined with keyframes to add various animation effects to elements. Specific animations are defined in keyframes and used in animation. For example, you can define an animation effect that flies in from above.


@keyframes topIn {
  from { transform: translateY(-50px) }
  to { transform: translateY(0px) }
}


and use animation through animation in the target element.


<p class="target topIn"></p>
.topIn {
  animation: topIn 1s ease;
}


In this way, when the element is rendered into the DOM for the first time, there will be a top-to-bottom displacement animation effect. Of course, this effect is not what we want. Often we also add a transparency gradient from 0 to 1 to the animation.


@keyframes topIn {
  from { 
    transform: translateY(-50px);
    opacity: 0; 
  }
  to { 
    transform: translateY(0px);
    opacity: 1; 
  }
}


What should we do if we also want to be able to control the display timing of elements? A simpler way is to add a class style that controls animation to the target element only when animation effects are needed.


btn.addEventListener(&#39;click&#39;, function() {
  document.querySelector(&#39;.target&#39;).classList.add(&#39;topIn&#39;);
}, !1);


But there is a problem with this. I believe that friends who have practiced it have already discovered this. We expect elements to be in an invisible state before entering the scene. But just by doing the above, the element can be seen before the animation starts. So what should be done?

We can easily think of adding display: none or visibility: hidden to the element. But after display: none, the element does not occupy space. Therefore, if this is the case, it will cause confusion in the page layout. So before we start, we add a new class to the element.


.aninode {
  visibility: hidden;
}


And add a new class to display the element.


.animated .aninode {
  visibility: visible;
}


The class that controls the animation effect also needs some adjustments in css.


.animated .topIn {
  animation: topIn 1s ease;
}


The advantage of this is that we only need to add an animated to the class to achieve our effect. Example demoThe complete code is as follows:


<p class="container">
  <p class="target aninode leftIn"></p>
  <button class="btn show">show</button>
  <button class="btn hide">hide</button>
</p>
.container {
  width: 100px;
  margin: 0 auto;
}
.aninode {
  visibility: hidden;
}
.animated .aninode {
  visibility: visible;
}
.target {
  width: 100px;
  height: 100px;
  background: orange;
  border-radius: 4px;
  margin: 20px 0;
}
.animated .topIn {
  animation: topIn 1s ease;
}
.animated .leftIn {
  animation: leftIn 1s ease;
}
.btn {
  width: 100px;
  height: 30px;
  border: 1px solid #ccc;
  outline: none;
  transition: 0.1s;
}
.btn:active {
  border: none;
  background: orange;
  color: #fff;
}
@keyframes topIn {
  from { 
    transform: translateY(-50px);
    opacity: 0; 
  }
  to { 
    transform: translateY(0px);
    opacity: 1; 
  }
}
@keyframes leftIn {
  from { 
    transform: translateX(-50px);
    opacity: 0; 
  }
  to { 
    transform: translateX(0px);
    opacity: 1; 
  }
}
var show = document.querySelector(&#39;.show&#39;);
var hide = document.querySelector(&#39;.hide&#39;);
var container = document.querySelector(&#39;.container&#39;);
show.addEventListener(&#39;click&#39;, function() {
  container.classList.add(&#39;animated&#39;);
}, !1);
hide.addEventListener(&#39;click&#39;, function() {
  container.classList.remove(&#39;animated&#39;);
}, !1);


The Demo is displayed as follows:


See the Pen <a href=&#39;https://codepen.io/yangbo5207/pen/NXKrPg/&#39;>NXKrPg</a> by Ormie (<a href=&#39;https://codepen.io/yangbo5207&#39;>@yangbo5207</a>) on <a href=&#39;https://codepen.io&#39;>CodePen</a>.


codepen demo address

But this seems to be a little short of the effect we want. Keep thinking. First of all, if you want the following elements to appear later than the previous elements, then you must control the delay time. We must have many classes that set the delay time.


.delay200 {
    animation-delay: 200ms;
    animation-fill-mode: backwards!important;
}
.delay400 {
    animation-delay: 400ms;
    animation-fill-mode: backwards!important;
}
.delay600 {
    animation-delay: 600ms;
    animation-fill-mode: backwards!important;
}
.delay800 {
    animation-delay: 800ms;
    animation-fill-mode: backwards!important;
}


animation-fill-mode: backwards!important; The purpose is to keep the transparency of the element at 0 before it appears . Prevent the element from appearing directly after adding animated.

The addition of !important is to prevent the animation-fill-mode property from being overwritten when the animation abbreviation is used in a new class. If !important is not written here, the abbreviated form cannot be used in animation classes like topIn.

After this, we only need to add the above code to the css and make some changes to the html to achieve the effect we want.


See the Pen <a href=&#39;https://codepen.io/yangbo5207/pen/mpbEEE/&#39;>mpbEEE</a> by Ormie (<a href=&#39;https://codepen.io/yangbo5207&#39;>@yangbo5207</a>) on <a href=&#39;https://codepen.io&#39;>CodePen</a>.


codepen demo address

The complete code is as follows:


<p class="container">
  <p class="targets aninode">
      <p class="item leftIn">春晓</p>
      <p class="item leftIn delay200">春眠不觉晓</p>
      <p class="item leftIn delay400">处处蚊子咬</p>
      <p class="item leftIn delay600">夜来风雨声</p>
      <p class="item leftIn delay800"><此处请留下你们的才华></p>
  </p>
  <button class="btn show">show</button>
  <button class="btn hide">hide</button>
</p>
.container {
  width: 200px;
  margin: 0 auto;
}
.aninode {
  visibility: hidden;
}
.animated .aninode {
  visibility: visible;
}
.targets {
  margin: 20px 0;
}
.targets .item {
    border: 1px solid #ccc;
    margin: 10px 0;
    line-height: 2;
    padding: 2px 6px;
    border-radius: 4px;
}
.animated .topIn {
  animation: topIn 1s ease;
}
.animated .leftIn {
  animation-name: leftIn;
  animation-duration: 1s;
}
.btn {
  width: 100px;
  height: 30px;
  border: 1px solid #ccc;
  outline: none;
  transition: 0.1s;
}
.btn:active {
  border: none;
  background: orange;
  color: #fff;
}
@keyframes topIn {
  from { transform: translateY(-50px) }
  to { transform: translateY(0px) }
}
@keyframes leftIn {
  from { 
    transform: translateX(-50px);
    opacity: 0; 
  }
  to { 
    transform: translateX(0px);
    opacity: 1; 
  }
}
.delay200 {
    animation-delay: 200ms;
    animation-fill-mode: backwards!important;
}
.delay400 {
    animation-delay: 400ms;
    animation-fill-mode: backwards!important;
}
.delay600 {
    animation-delay: 600ms;
    animation-fill-mode: backwards!important;
}
.delay800 {
    animation-delay: 800ms;
    animation-fill-mode: backwards!important;
}
var show = document.querySelector(&#39;.show&#39;);
var hide = document.querySelector(&#39;.hide&#39;);
var container = document.querySelector(&#39;.container&#39;);
show.addEventListener(&#39;click&#39;, function() {
  container.classList.add(&#39;animated&#39;);
}, !1);
hide.addEventListener(&#39;click&#39;, function() {
  container.classList.remove(&#39;animated&#39;);
}, !1);


We found that the logic of js has not changed in any way. It's still just a matter of adding/removing animations where appropriate.

Easter egg:

In practice we will also encounter a more troublesome thing. It is to delay the writing of classes. We may not know which time differences will be used and how many elements will be used. If we write them all by hand, it will be too troublesome to repeat the work. So we can use js to insert dynamically. The code is as follows:


const styleSheet = getSheet();
var delay = 100;
while (delay < 10000) {
    styleSheet.insertRule(`.animated .delay${delay}{ animation-delay: ${delay}ms; animation-fill-mode: backwards; }`, styleSheet.cssRules.length);
    delay += delay < 3000 ? 100 : 1000;
}
function getSheet() {
    var sheets = document.styleSheets;
    var len = sheets.length;
    for(var i = 0; i <= len; i++) {
        var sheet = sheets.item(i);
        try {
            if (sheet.cssRules) {
                return sheet;
            }
        } catch(e) {} 
    }
    var style = document.createElement(&#39;style&#39;);
    style.type = "text/css";
    document.getElementsByTagName(&#39;head&#39;)[0].appendChild(style);
    return style.sheet;
}


##Summary

The above This is the css3 that the editor introduces to you to achieve the effect of displaying multiple elements in sequence. I hope it will be helpful to everyone! !

Related recommendations:

How to use window units for layout in CSS3

CSS3 Example of Gradually Glowing Square Border

Pure CSS3 effect resource collection

The above is the detailed content of css3 realizes the effect of displaying multiple elements in sequence_css3_CSS_web page production. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn