search
HomeWeb Front-endHTML TutorialHow to use Vue+CSS3 to create interactive effects

We know that interactive effects or special effects will definitely be used when doing projects. I once developed a project in which Guo has been using Vue. In terms of developing the technology stack, I used Vue+CSS3. In the process, I found that vue+css3 development special effects are very useful. It’s easy to use. Today I will bring you such a tutorial.

1. Although the code in the article is very simple and not difficult to understand, it is recommended that you read it while writing to avoid confusion.
2. The small examples mentioned in the article are very basic. You can expand or modify them based on your own ideas, which may have unexpected effects. When I write this type of article, I also want to teach people how to fish, not teach them how to fish!
3. These examples are taken from my own daily practice projects, and the code has been mentioned on github (vue-demos). Welcome everyone to star.

2. Opening animation

Principle analysis

Speaking of principle analysis, there is actually nothing to analyze. It is to replace the text when the page is in the following state. Lose. As for seeing the font shrinking into a ball, it is the control effect of the letter-spacing css attribute. Font blur is the control effect of the filter: blur() css attribute! You can see that there are gradual changes, which is the effect of CSS3 animation.

Let’s briefly analyze the steps of this animation. As you can see from the bottom, this animation has a total of 8 steps.

Now it is clear. We want to start changing the text at the moment shown in the picture below, that is, two seconds after the page is loaded, and the animation is executed twice before starting to change the text. Then change the text every two seconds until the end!

The codes of vue and javascript are given below to see which method is simpler!

vue method

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <style>     body{         background: #ccc;     }     h1 {         color: white;         text-transform: uppercase;         margin-top: 100px;         text-align: center;         font-size: 6rem;         line-height: 1;         animation: letterspacing 1s 7 alternate ease-in-out;         display: block;         letter-spacing: .5rem;     }     @keyframes letterspacing {         0% {             letter-spacing: -72px;             filter: blur(20px);         }         40% {             filter: blur(6px);         }         80% {             letter-spacing: 8px;             filter: blur(0);         }     } </style> <body> <div id="text">     <h1 id="testText">{{testText}}</h1> </div> </body> <script src="vue.min.js"></script> <script type="text/javascript">     new Vue({         el:&#39;#text&#39;,         data:{             nowIndex:0,             testText:&#39;欢迎浏览&#39;         },         mounted(){             let _this=this;             let timer = setInterval(function(){                 _this.nowIndex++;                 switch (_this.nowIndex) {                     case 1:                         _this.testText = &#39;守候的文章&#39;;                         break;                     case 2:                         _this.testText = &#39;愿您浏览愉快&#39;;                         break;                     case 3:                         _this.testText = &#39;学到知识&#39;;                         break;                 }                 if (_this.nowIndex > 3) {                     setTimeout(() => {                         clearInterval(timer);                     }, 2000)                 }             }, 2000)         }     }) </script> </html>

javascript method

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <style>     body{         background: #ccc;     }     h1 {         color: white;         text-transform: uppercase;         margin-top: 100px;         text-align: center;         font-size: 6rem;         line-height: 1;         animation: letterspacing 1s 7 alternate ease-in-out;         display: block;         letter-spacing: .5rem;     }     @keyframes letterspacing {         0% {             letter-spacing: -6rem;             filter: blur(1rem);         }         40% {             filter: blur(.3rem);         }         80% {             letter-spacing: .5rem;             filter: blur(0rem);         }     } </style> <body> <div id="text">     <h1 id="欢迎浏览">欢迎浏览</h1> </div> </body> <script>     var oH1=document.querySelector(&#39;h1&#39;),nowIndex=0;     console.log(oH1)     var timer = setInterval(function () {         nowIndex++;         switch (nowIndex) {             case 1:                 oH1.innerHTML = &#39;守候的文章&#39;;                 break;             case 2:                 oH1.innerHTML = &#39;愿您浏览愉快&#39;;                 break;             case 3:                 oH1.innerHTML = &#39;学到知识&#39;;                 break;         }         if (nowIndex > 3) {             setTimeout(() => {                 clearInterval(timer);             }, 2000)         }     }, 2000) </script> </html>

3. Navigation slider

Operation effect

Principle analysis

First of all, the following is the position of the orange slider when the page is initialized

Put the mouse on the second tab. You can see that the orange slider is offset to the right by a tab distance

Put the mouse on the third tab, you can see that the orange slider is offset to the right by the distance of two tabs

If from the first tab to the sixth tab The indices are 0,1,2,3,4,5.

Then the formula of the slider is (index * width of tab). As you can see, the effect that gradually passes is actually the effect of CSS3 transition. Just look at the code below, you will understand it at a glance! The code is as follows:

vue method

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <link rel="stylesheet" href="reset.css"> <style>     .nav{         margin: 40px;         position: relative;     } .nav li{     float: left;     width: 100px;     height: 40px;     line-height: 40px;     color: #fff;     text-align: center;     background: #09f;     cursor: pointer; }     .nav span{         position: relative;         z-index: 2;     }     .nav .slider{         position: absolute;         transition: all .5s cubic-bezier(0.4, -0.3, 0.57, 1.38);         width: 100px;         height: 40px;         background: #f90;         top: 0;         left: 0;         z-index: 1;     } </style> <body> <div class="nav clear" id="nav" @mouseleave="nowIndex=0">     <ul>         <li @mouseenter.stop="nowIndex=0"><span>Tab One</span></li>         <li @mouseenter.stop="nowIndex=1"><span>Tab Two</span></li>         <li @mouseenter.stop="nowIndex=2"><span>Tab Three</span></li>         <li @mouseenter.stop="nowIndex=3"><span>Tab four</span></li>         <li @mouseenter.stop="nowIndex=4"><span>Tab five</span></li>         <li @mouseenter.stop="nowIndex=5"><span>Tab six</span></li>     </ul>     <div class="slider" :style="{&#39;transform&#39;:&#39;translate3d(&#39;+nowIndex*100+&#39;px,0,0)&#39;}"></div> </div> </body> <script src="vue.min.js"></script> <script type="text/javascript">    new Vue({        el:&#39;#nav&#39;,        data:{            nowIndex:0        }    }) </script> </html>

javascript method

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title> </head> <link rel="stylesheet" href="reset.css"> <style>     .nav{         position: relative;     } .nav li{     float: left;     width: 100px;     height: 40px;     line-height: 40px;     color: #fff;     text-align: center;     background: #09f;     cursor: pointer; }     .nav span{         position: relative;         z-index: 2;     }     .nav .slider{         position: absolute;         transition: all .5s cubic-bezier(0.4, -0.3, 0.57, 1.38);         width: 100px;         height: 40px;         background: #f90;         top: 0;         left: 0;         z-index: 1;     } </style> <body> <div class="nav clear" id="nav">     <ul>         <li><span>Tab One</span></li>         <li><span>Tab Two</span></li>         <li><span>Tab Three</span></li>         <li><span>Tab four</span></li>         <li><span>Tab five</span></li>         <li><span>Tab six</span></li>     </ul>     <div class="slider"></div> </div> </body> <script type="text/javascript">     var oDiv=document.querySelector("#nav"),oLi=oDiv.querySelectorAll("li"),oSlider=document.querySelector(".slider");     oDiv.addEventListener("mouseleave",function () {         oSlider.style.transform=&#39;translate3d(0,0,0)&#39;;     })     for(var i=0;i<oLi.length;i++){         oLi[i].index=i;         oLi[i].addEventListener("mouseenter",function (e) {             oSlider.style.transform=&#39;translate3d(&#39;+this.index*100+&#39;px,0,0)&#39;;         })     } </script> </html>

4. Carousel image

The blue box is li and the black box is div

Seeing the above, it actually controls the offset of ul (transform:translate3d). The calculation formula is similar to the slider above, index (0|1|2|3)*width of li. The difference is that the offset of ul is a negative number, because ul wants to move to the left, and the slider above wants to move to the right!
When the first picture is taken, the ul offset is set (transform: translate3d(0px, 0px, 0px)).
When the second picture is taken, the ul offset is set (transform: translate3d(-1000px, 0px, 0px)).
When the second picture is taken, the ul offset is set (transform: translate3d(-2000px, 0px, 0px)). By analogy, the offset can be calculated easily!

Maybe everyone is a little confused by what I said, but if you look at the code below, you won’t be confused, because the code is also very simple!

vue way

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title>     <link rel="stylesheet" href="reset.css">     <style>         .slide-img {             width: 1000px;             height: 500px;             overflow: hidden;             position: relative;             margin: 20px auto;         }         ul {             transition: all .5s ease;         }         li {             float: left;         }         .slide-arrow div {             width: 50px;             height: 100px;             position: absolute;             margin: auto;             top: 0;             bottom: 0;             background: url("http://i1.bvimg.com/1949/4d860a3067fab23b.jpg") no-repeat;         }         .arrow-right {             transform: rotate(180deg);             right: 0;         }         .arrow-left {             left: 0;         }         .slide-option{             position: absolute;             bottom: 10px;             width: 100%;             left: 0;             text-align: center;         }         .slide-option span{             display: inline-block;             width: 14px;             height: 14px;             border-radius: 100%;             background: #ccc;             margin: 0 10px;         }         .slide-option .active{             background: #09f;         }     </style> </head> <body> <div class="slide-img clear" id="slide-img">     <!--用tran这个class控制ul是否含有过渡效果,样式已经写好-->     <ul :style="{&#39;width&#39;:(listWidth*list.length)+&#39;px&#39;,&#39;transform&#39;:&#39;translate3d(-&#39;+(listWidth*nowIndex)+&#39;px,0,0)&#39;}">         <!--遍历出来的图片-->         <li v-for="(li,index) in list" :style="{&#39;width&#39;:listWidth+&#39;px&#39;}">             <a href="javascript:;">                 <img  class="slider-img lazy"  src="/static/imghwm/default1.png"  data-src="li"  : / alt="How to use Vue+CSS3 to create interactive effects" >             </a>         </li>     </ul>     <div class="slide-option">         <span v-for="(li,index) in list" :class="{&#39;active&#39;:index===nowIndex}"></span>     </div>     <div class="slide-arrow">         <div class="arrow-left" @click.stop="switchDo(&#39;reduce&#39;)"></div>         <div class="arrow-right" @click.stop="switchDo"></div>     </div> </div> </body> <script src="vue.min.js"></script> <script type="text/javascript">     new Vue({         el: &#39;#slide-img&#39;,         data: {             nowIndex: 0,             listWidth: &#39;1000&#39;,             list: [&#39;./images/timg1.jpg&#39;, &#39;./images/timg2.jpg&#39;, &#39;./images/timg3.jpg&#39;, &#39;./images/timg4.jpg&#39;],             timer:null         },         methods: {             //滑动操作             switchDo(reduce){                 clearInterval(this.timer);                 //根据reduce判断this.nowIndex的增加或者减少!                 if(reduce===&#39;reduce&#39;){                     //如果是第一张,就返回最后一张                     if(this.nowIndex===0){                         this.nowIndex=this.list.length-1;                     }                     else{                         this.nowIndex--;                     }                 }                 else{                     //如果是最后一张,就返回第一张                     if(this.nowIndex===this.list.length-1){                         this.nowIndex=0;                     }                     else{                         this.nowIndex++;                     }                 }                 var _this=this;                 this.timer=setInterval(function () {                     _this.switchDo();                 },4000)             },         },         mounted(){             var _this=this;             this.timer=setInterval(function () {                 _this.switchDo();             },4000)         }     }) </script> </html>

javascript way

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title>     <link rel="stylesheet" href="reset.css">     <style>         .slide-img {             width: 1000px;             height: 500px;             overflow: hidden;             position: relative;             margin: 20px auto;         }         ul {             transition: all .5s ease;         }         li {             float: left;         }         .slide-arrow div {             width: 50px;             height: 100px;             position: absolute;             margin: auto;             top: 0;             bottom: 0;             background: url("http://i1.bvimg.com/1949/4d860a3067fab23b.jpg") no-repeat;         }         .arrow-right {             transform: rotate(180deg);             right: 0;         }         .arrow-left {             left: 0;         }         .slide-option{             position: absolute;             bottom: 10px;             width: 100%;             left: 0;             text-align: center;         }         .slide-option span{             display: inline-block;             width: 14px;             height: 14px;             border-radius: 100%;             background: #ccc;             margin: 0 10px;         }         .slide-option .active{             background: #09f;         }     </style> </head> <body> <div class="slide-img clear" id="slide-img">     <!--用tran这个class控制ul是否含有过渡效果,样式已经写好-->     <ul id="slide-img-ul">         <!--遍历出来的图片-->         <li   style="max-width:90%"><a href="javascript:;"><img  class="slider-img lazy"  src="/static/imghwm/default1.png"  data-src="images/timg1.jpg"   / alt="How to use Vue+CSS3 to create interactive effects" ></a></li>         <li   style="max-width:90%"><a href="javascript:;"><img  class="slider-img lazy"  src="/static/imghwm/default1.png"  data-src="images/timg2.jpg"   / alt="How to use Vue+CSS3 to create interactive effects" ></a></li>         <li   style="max-width:90%"><a href="javascript:;"><img  class="slider-img lazy"  src="/static/imghwm/default1.png"  data-src="images/timg3.jpg"   / alt="How to use Vue+CSS3 to create interactive effects" ></a></li>         <li   style="max-width:90%"><a href="javascript:;"><img  class="slider-img lazy"  src="/static/imghwm/default1.png"  data-src="images/timg4.jpg"   / alt="How to use Vue+CSS3 to create interactive effects" ></a></li>     </ul>     <div class="slide-option">         <span></span>         <span></span>         <span></span>         <span></span>     </div>     <div class="slide-arrow">         <div class="arrow-left"></div>         <div class="arrow-right"></div>     </div> </div> </body> <script type="text/javascript">     window.onload=function () {         var oUl=document.querySelector(&#39;#slide-img-ul&#39;);         var oLi=oUl.querySelectorAll(&#39;li&#39;);         var oSpan=document.querySelector(&#39;.slide-option&#39;).querySelectorAll(&#39;span&#39;);         var oArrowLeft=document.querySelector(&#39;.arrow-left&#39;);         var oArrowRight=document.querySelector(&#39;.arrow-right&#39;);         oUl.style.width=&#39;4000px&#39;;         oArrowLeft.addEventListener(&#39;click&#39;,function () {             switchDo(&#39;reduce&#39;);         })         oArrowRight.addEventListener(&#39;click&#39;,function () {             switchDo();         })         var timer=null,nowIndex=0;         function switchDo(reduce){             clearInterval(timer);             //设置样式             oUl.style.transform=&#39;translate3d(-&#39;+(1000*nowIndex)+&#39;px,0,0)&#39;;             for (var i=0;i<oSpan.length;i++){                 if(i===nowIndex){                     oSpan[i].className=&#39;active&#39;;                 }                 else{                     oSpan[i].className=&#39;&#39;;                 }             }             //根据reduce判断this.nowIndex的增加或者减少!             if(reduce===&#39;reduce&#39;){                 //如果是第一张,就返回最后一张                 if(nowIndex===0){                     nowIndex=oLi.length-1;                 }                 else{                     nowIndex--;                 }             }             else{                 //如果是最后一张,就返回第一张                 if(nowIndex===oLi.length-1){                     nowIndex=0;                 }                 else{                     nowIndex++;                 }             }             timer=setInterval(function () {                 switchDo();             },4000)         }         switchDo();     } </script> </html>

5. Summary

Okay, about the special effects of vue+css3 development, and the use of javascript+css3 That’s it for comparison. I hope these three small examples can help everyone understand how to use vue+css3 to develop special effects. The three small examples I'm talking about today are not meant to give you codes for you to copy and paste, but I hope they can serve as a starting point and expand your thinking! As I said in my previous article, I write the article hoping to play a role in teaching people how to fish, rather than teaching people how to fish! Finally, if you think there is anything I wrote wrong or wrong, or if you have any other suggestions, please point it out! Let everyone learn from each other and make progress together!

I believe you have mastered the methods after reading these cases. For more exciting information, please pay attention to other related articles on the php Chinese website!


Related reading:

How to create the loading effect of CSS3

##CSS How to convert the encoding

#How to use canvas to create the effect of particle fountain animation

The above is the detailed content of How to use Vue+CSS3 to create interactive effects. 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
Why are HTML tags important for web development?Why are HTML tags important for web development?May 02, 2025 am 12:03 AM

HTMLtagsareessentialforwebdevelopmentastheystructureandenhancewebpages.1)Theydefinelayout,semantics,andinteractivity.2)SemantictagsimproveaccessibilityandSEO.3)Properuseoftagscanoptimizeperformanceandensurecross-browsercompatibility.

Explain the importance of using consistent coding style for HTML tags and attributes.Explain the importance of using consistent coding style for HTML tags and attributes.May 01, 2025 am 12:01 AM

A consistent HTML encoding style is important because it improves the readability, maintainability and efficiency of the code. 1) Use lowercase tags and attributes, 2) Keep consistent indentation, 3) Select and stick to single or double quotes, 4) Avoid mixing different styles in projects, 5) Use automation tools such as Prettier or ESLint to ensure consistency in styles.

How to implement multi-project carousel in Bootstrap 4?How to implement multi-project carousel in Bootstrap 4?Apr 30, 2025 pm 03:24 PM

Solution to implement multi-project carousel in Bootstrap4 Implementing multi-project carousel in Bootstrap4 is not an easy task. Although Bootstrap...

How does deepseek official website achieve the effect of penetrating mouse scroll event?How does deepseek official website achieve the effect of penetrating mouse scroll event?Apr 30, 2025 pm 03:21 PM

How to achieve the effect of mouse scrolling event penetration? When we browse the web, we often encounter some special interaction designs. For example, on deepseek official website, �...

How to modify the playback control style of HTML videoHow to modify the playback control style of HTML videoApr 30, 2025 pm 03:18 PM

The default playback control style of HTML video cannot be modified directly through CSS. 1. Create custom controls using JavaScript. 2. Beautify these controls through CSS. 3. Consider compatibility, user experience and performance, using libraries such as Video.js or Plyr can simplify the process.

What problems will be caused by using native select on your phone?What problems will be caused by using native select on your phone?Apr 30, 2025 pm 03:15 PM

Potential problems with using native select on mobile phones When developing mobile applications, we often encounter the need for selecting boxes. Normally, developers...

What are the disadvantages of using native select on your phone?What are the disadvantages of using native select on your phone?Apr 30, 2025 pm 03:12 PM

What are the disadvantages of using native select on your phone? When developing applications on mobile devices, it is very important to choose the right UI components. Many developers...

How to optimize collision handling of third-person roaming in a room using Three.js and Octree?How to optimize collision handling of third-person roaming in a room using Three.js and Octree?Apr 30, 2025 pm 03:09 PM

Use Three.js and Octree to optimize collision handling of third-person roaming in the room. Use Octree in Three.js to implement third-person roaming in the room and add collisions...

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)