Home  >  Article  >  Web Front-end  >  How to use css3 to display multiple elements in sequence

How to use css3 to display multiple elements in sequence

不言
不言Original
2018-06-14 16:17:282483browse

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 need it can refer to it

As shown in the picture above, it is often used in many activities to promote HTML5 You need to use such an animation effect. 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 displacement animation effect from top to bottom. 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; 
  }
}

We also want to be able to control the display timing of elements. What should we do? 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. So 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 classes that control animation effects also make some adjustments to the 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. The complete code of the example demo 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);

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 at 0 before the element 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 what 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;
}

The above is the entire content of this article. I hope it will be helpful to everyone’s study. For more related content, please pay attention to the PHP Chinese website!

Related recommendations:

How to use css to make the background image stretch and fill to avoid repeated display

# #

The above is the detailed content of How to use css3 to display multiple elements in sequence. 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