好用的css特效
一些好用的css样式设计
·
好用的css特效
1.圆点动画
效果如下:
-
查看代码:
<div class="loading"> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> <div class="dot"></div> </div>
body { display: flex; height: 100vh; justify-content: center; align-items: center; background: #222; } .loading { display: flex; } .loading .dot { position: relative; width: 2em; height: 2em; margin: 0.8em; border-radius: 50%; } .loading .dot::before { position: absolute; content: ""; width: 100%; height: 100%; background: inherit; border-radius: inherit; animation: wave 2s ease-out infinite; } .loading .dot:nth-child(1) { background: #7ef9ff; } .loading .dot:nth-child(1)::before { animation-delay: 0.2s; } .loading .dot:nth-child(2) { background: #89cff0; } .loading .dot:nth-child(2)::before { animation-delay: 0.4s; } .loading .dot:nth-child(3) { background: #4682b4; } .loading .dot:nth-child(3)::before { animation-delay: 0.6s; } .loading .dot:nth-child(4) { background: #0f52ba; } .loading .dot:nth-child(4)::before { animation-delay: 0.8s; } .loading .dot:nth-child(5) { background: #000080; } .loading .dot:nth-child(5)::before { animation-delay: 1s; } @keyframes wave { 50%, 75% { transform: scale(2.5); } 80%, 100% { opacity: 0; } }
2.文本渐进显示
效果如下:
-
查看代码:
<p class="landIn">Ano hi watashitachi mada shiranai no Fushigi no monogatari desu.</p>
@import url("https://fonts.googleapis.com/css?family=Lora:400,400i,700"); body { display: flex; flex-direction: column; height: 100vh; justify-content: center; align-items: center; background-image: linear-gradient(rgba(16, 16, 16, 0.8), rgba(16, 16, 16, 0.8)), url(https://i.loli.net/2019/10/18/buDT4YS6zUMfHst.jpg); background-size: cover; } p { margin: 0 9em; font-size: 2em; font-weight: 600; } .landIn { display: flex; flex-wrap: wrap; line-height: 1.8; color: white; font-family: Lora, serif; white-space: pre; } .landIn span { animation: landIn 0.8s ease-out both; } @keyframes landIn { from { opacity: 0; transform: translateY(-20%); } to { opacity: 1; transform: translateY(0); } }
"use strict"; let landInTexts = document.querySelectorAll(".landIn"); landInTexts.forEach(landInText => { let letters = landInText.textContent.split(""); landInText.textContent = ""; letters.forEach((letter, i) => { let span = document.createElement("span"); span.textContent = letter; span.style.animationDelay = `${i * 0.05}s`; landInText.append(span); }); });
3.飘雪动画
效果如下:
注:雪花数量取决于你的snow块数量;
-
查看代码
<div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div> <div class="snow"></div>
body { height: 100vh; background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%); overflow: hidden; filter: drop-shadow(0 0 10px white); } @function random_range($min, $max) { $rand: random(); $random_range: $min + floor($rand * (($max - $min) + 1)); @return $random_range; } .snow { $total: 200; position: absolute; width: 10px; height: 10px; background: white; border-radius: 50%; @for $i from 1 through $total { $random-x: random(1000000) * 0.0001vw; $random-offset: random_range(-100000, 100000) * 0.0001vw; $random-x-end: $random-x + $random-offset; $random-x-end-yoyo: $random-x + ($random-offset / 2); $random-yoyo-time: random_range(30000, 80000) / 100000; $random-yoyo-y: $random-yoyo-time * 100vh; $random-scale: random(10000) * 0.0001; $fall-duration: random_range(10, 30) * 1s; $fall-delay: random(30) * -1s; &:nth-child(#{$i}) { opacity: random(10000) * 0.0001; transform: translate($random-x, -10px) scale($random-scale); animation: fall-#{$i} $fall-duration $fall-delay linear infinite; } @keyframes fall-#{$i} { #{percentage($random-yoyo-time)} { transform: translate($random-x-end, $random-yoyo-y) scale($random-scale); } to { transform: translate($random-x-end-yoyo, 100vh) scale($random-scale); } } } }
4.按钮悬停边框描边
效果如下:
-
查看代码
<button data-text="Start" class="btn btn-primary btn-ghost btn-border-stroke btn-text-float-up" > <div class="btn-borders"> <div class="border-top"></div> <div class="border-right"></div> <div class="border-bottom"></div> <div class="border-left"></div> </div> <span class="btn-text">Start</span> </button>
@import url(https://fonts.googleapis.com/css?family=Lato); body { display: flex; height: 100vh; justify-content: center; align-items: center; text-align: center; background: #1A1E23; } .btn { --hue: 190; --ease-in-duration: 0.25s; --ease-in-exponential: cubic-bezier(0.95, 0.05, 0.795, 0.035); --ease-out-duration: 0.65s; --ease-out-delay: var(--ease-in-duration); --ease-out-exponential: cubic-bezier(0.19, 1, 0.22, 1); position: relative; padding: 1rem 3rem; font-size: 1rem; line-height: 1.5; color: white; text-decoration: none; background-color: hsl(var(--hue), 100%, 41%); border: 1px solid hsl(var(--hue), 100%, 41%); outline: transparent; overflow: hidden; cursor: pointer; user-select: none; white-space: nowrap; transition: 0.25s; } .btn:hover { background: hsl(var(--hue), 100%, 31%); } .btn-primary { --hue: 171; } .btn-ghost { color: hsl(var(--hue), 100%, 41%); background-color: transparent; border-color: hsl(var(--hue), 100%, 41%); } .btn-ghost:hover { color: white; } .btn-border-stroke { border-color: hsla(var(--hue), 100%, 41%, 0.35); } .btn-border-stroke .btn-borders { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .btn-border-stroke .btn-borders .border-top { position: absolute; top: 0; width: 100%; height: 1px; background: hsl(var(--hue), 100%, 41%); transform: scaleX(0); transform-origin: left; } .btn-border-stroke .btn-borders .border-right { position: absolute; right: 0; width: 1px; height: 100%; background: hsl(var(--hue), 100%, 41%); transform: scaleY(0); transform-origin: bottom; } .btn-border-stroke .btn-borders .border-bottom { position: absolute; bottom: 0; width: 100%; height: 1px; background: hsl(var(--hue), 100%, 41%); transform: scaleX(0); transform-origin: left; } .btn-border-stroke .btn-borders .border-left { position: absolute; left: 0; width: 1px; height: 100%; background: hsl(var(--hue), 100%, 41%); transform: scaleY(0); transform-origin: bottom; } .btn-border-stroke .btn-borders .border-left { transition: var(--ease-out-duration) var(--ease-out-delay) var(--ease-out-exponential); } .btn-border-stroke .btn-borders .border-bottom { transition: var(--ease-out-duration) var(--ease-out-delay) var(--ease-out-exponential); } .btn-border-stroke .btn-borders .border-right { transition: var(--ease-in-duration) var(--ease-in-exponential); } .btn-border-stroke .btn-borders .border-top { transition: var(--ease-in-duration) var(--ease-in-exponential); } .btn-border-stroke:hover { color: hsl(var(--hue), 100%, 41%); background: transparent; } .btn-border-stroke:hover .border-top, .btn-border-stroke:hover .border-bottom { transform: scaleX(1); } .btn-border-stroke:hover .border-left, .btn-border-stroke:hover .border-right { transform: scaleY(1); } .btn-border-stroke:hover .border-left { transition: var(--ease-in-duration) var(--ease-in-exponential); } .btn-border-stroke:hover .border-bottom { transition: var(--ease-in-duration) var(--ease-in-exponential); } .btn-border-stroke:hover .border-right { transition: var(--ease-out-duration) var(--ease-out-delay) var(--ease-out-exponential); } .btn-border-stroke:hover .border-top { transition: var(--ease-out-duration) var(--ease-out-delay) var(--ease-out-exponential); } .btn-text-float-up::after { position: absolute; content: attr(data-text); top: 0; left: 0; width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; opacity: 0; transform: translateY(35%); transition: 0.25s ease-out; } .btn-text-float-up .btn-text { display: block; transition: 0.75s 0.1s var(--ease-out-exponential); } .btn-text-float-up:hover .btn-text { opacity: 0; transform: translateY(-25%); transition: 0.25s ease-out; } .btn-text-float-up:hover::after { opacity: 1; transform: translateY(0); transition: 0.75s 0.1s var(--ease-out-exponential); }
5.绝对定位实现多重边框
效果如下:
-
查看代码
<button class="btn btn-primary btn-ghost btn-multiple-border-stroke"> <div class="btn-borders-group"> <div class="border-top"></div> <div class="border-right"></div> <div class="border-bottom"></div> <div class="border-left"></div> </div> <div class="btn-borders-group"> <div class="border-top"></div> <div class="border-right"></div> <div class="border-bottom"></div> <div class="border-left"></div> </div> <div class="btn-borders-group"> <div class="border-top"></div> <div class="border-right"></div> <div class="border-bottom"></div> <div class="border-left"></div> </div> <span class="btn-text">Start</span> </button>
@import url(https://fonts.googleapis.com/css?family=Lato); body { display: flex; height: 100vh; justify-content: center; align-items: center; text-align: center; background: #1A1E23; } .btn { --hue: 190; --ease-in-duration: 0.25s; --ease-out-duration: 0.65s; --ease-out-delay: var(--ease-in-duration); position: relative; padding: 1rem 3rem; font-size: 1rem; line-height: 1.5; color: white; text-decoration: none; background-color: hsl(var(--hue), 100%, 41%); border: 1px solid hsl(var(--hue), 100%, 41%); outline: transparent; cursor: pointer; user-select: none; white-space: nowrap; transition: 0.25s; } .btn:hover { background: hsl(var(--hue), 100%, 31%); } .btn-primary { --hue: 171; } .btn-ghost { color: hsl(var(--hue), 100%, 41%); background-color: transparent; border-color: hsl(var(--hue), 100%, 41%); } .btn-ghost:hover { color: white; } .btn-multiple-border-stroke { border-color: transparent; } .btn-multiple-border-stroke .btn-borders-group { position: absolute; top: 0; left: 0; display: flex; justify-content: center; align-items: center; width: 100%; height: 100%; border: 1px solid hsla(var(--hue), 100%, 41%, 0.35); } .btn-multiple-border-stroke .btn-borders-group:nth-child(1) { left: -8px; padding: 0 8px; } .btn-multiple-border-stroke .btn-borders-group:nth-child(2) { top: -8px; padding: 8px 0; } .btn-multiple-border-stroke .btn-borders-group:nth-child(3) { top: -4px; left: -4px; padding: 4px; } .btn-multiple-border-stroke .btn-borders-group .border-top { position: absolute; top: 0; width: 100%; height: 1px; background: hsl(var(--hue), 100%, 41%); transform: scaleX(0); transform-origin: left; } .btn-multiple-border-stroke .btn-borders-group .border-right { position: absolute; right: 0; width: 1px; height: 100%; background: hsl(var(--hue), 100%, 41%); transform: scaleY(0); transform-origin: bottom; } .btn-multiple-border-stroke .btn-borders-group .border-bottom { position: absolute; bottom: 0; width: 100%; height: 1px; background: hsl(var(--hue), 100%, 41%); transform: scaleX(0); transform-origin: left; } .btn-multiple-border-stroke .btn-borders-group .border-left { position: absolute; left: 0; width: 1px; height: 100%; background: hsl(var(--hue), 100%, 41%); transform: scaleY(0); transform-origin: bottom; } .btn-multiple-border-stroke .btn-borders-group .border-left { transition: var(--ease-out-duration) var(--ease-out-delay) cubic-bezier(0.2, 1, 0.2, 1); } .btn-multiple-border-stroke .btn-borders-group .border-bottom { transition: var(--ease-out-duration) var(--ease-out-delay) cubic-bezier(0.2, 1, 0.2, 1); } .btn-multiple-border-stroke .btn-borders-group .border-right { transition: var(--ease-in-duration) cubic-bezier(1, 0, 0.8, 0); } .btn-multiple-border-stroke .btn-borders-group .border-top { transition: var(--ease-in-duration) cubic-bezier(1, 0, 0.8, 0); } .btn-multiple-border-stroke:hover { color: hsl(var(--hue), 100%, 41%); background: transparent; } .btn-multiple-border-stroke:hover .border-top, .btn-multiple-border-stroke:hover .border-bottom { transform: scaleX(1); } .btn-multiple-border-stroke:hover .border-left, .btn-multiple-border-stroke:hover .border-right { transform: scaleY(1); } .btn-multiple-border-stroke:hover .border-left { transition: var(--ease-in-duration) cubic-bezier(1, 0, 0.8, 0); } .btn-multiple-border-stroke:hover .border-bottom { transition: var(--ease-in-duration) cubic-bezier(1, 0, 0.8, 0); } .btn-multiple-border-stroke:hover .border-right { transition: var(--ease-out-duration) var(--ease-out-delay) cubic-bezier(0.2, 1, 0.2, 1); } .btn-multiple-border-stroke:hover .border-top { transition: var(--ease-out-duration) var(--ease-out-delay) cubic-bezier(0.2, 1, 0.2, 1); }
6.带幻灯片条的标题
效果如下:
-
查看代码
<header> <h1 class="title slide-bar">I'm alphardex.</h1> <p class="subtitle slide-bar">A CSS Wizard</p> </header>
@import url("https://fonts.googleapis.com/css?family=Lato"); @import url("https://fonts.googleapis.com/css?family=Lora:400,400i,700"); body { display: flex; justify-content: center; align-items: center; height: 100vh; background: #222; } .slide-bar { position: relative; color: transparent; animation: fill-text-white 2s 1.6s forwards; } .slide-bar::before { position: absolute; content: ""; top: 0; left: 0; width: 100%; height: 100%; background: #35b9f1; transform: scaleX(0); transform-origin: left; animation: slide-in-out 2s cubic-bezier(0.75, 0, 0, 1) forwards; } @keyframes slide-in-out { 50% { transform: scaleX(1); transform-origin: left; } 50.1% { transform-origin: right; } 100% { transform: scaleX(0); transform-origin: right; } } @keyframes fill-text-white { to { color: white; } } header .title, header .subtitle { width: 250px; height: 30px; } header .title { margin: 0; font-family: Lora, serif; font-size: 32px; line-height: 30px; } header .title::before { background: #FF4081; } header .subtitle { margin: 10px 0 0 0; font-family: Lato, sans-serif; font-size: 12px; line-height: 30px; letter-spacing: 5px; text-transform: uppercase; animation-delay: 3.2s; } header .subtitle::before { background: #03A9F4; animation-delay: 2s; }
7.交错浮动文本菜单
效果如下:
-
查看代码
<ul class="float-text-menu"> <li><a href="#" data-text="Home">Home</a></li> <li><a href="#" data-text="Archives">Archives</a></li> <li><a href="#" data-text="Tags">Tags</a></li> <li><a href="#" data-text="Categories">Categories</a></li> <li><a href="#" data-text="About">About</a></li> </ul>
@import url(https://fonts.googleapis.com/css?family=Lato); body { display: flex; justify-content: center; align-items: center; height: 100vh; background: #1A1E23; } .float-text-menu { display: flex; flex-direction: column; list-style-type: none; } .float-text-menu li a { display: flex; padding: 6px; color: white; font-family: Lato, sans-serif; text-decoration: none; overflow: hidden; } .float-text-menu li a span { position: relative; transition: 0.3s; } .float-text-menu li a span::before { position: absolute; content: attr(data-text); transform: translateY(130%); } .float-text-menu li a:hover span { transform: translateY(-130%); }
"use strict"; let floatTextMenuLinks = document.querySelectorAll(".float-text-menu li a"); floatTextMenuLinks.forEach(link => { let letters = link.textContent.split(""); link.textContent = ""; letters.forEach((letter, i) => { let span = document.createElement("span"); span.textContent = letter; span.style.transitionDelay = `${i / 20}s`; span.dataset.text = letter; link.append(span); }); });
8. 按钮悬停闪烁
效果如下:
-
查看代码
<button class="btn btn-primary btn-ghost btn-shine"> hover me </button>
@import url(https://fonts.googleapis.com/css?family=Lato); body { display: flex; height: 100vh; justify-content: center; align-items: center; background: #1A1E23; } .btn { --hue: 190; position: relative; padding: 1rem 3rem; font-size: 1rem; line-height: 1.5; color: white; text-decoration: none; text-transform: uppercase; background-color: hsl(var(--hue), 100%, 41%); border: 1px solid hsl(var(--hue), 100%, 41%); outline: transparent; overflow: hidden; cursor: pointer; user-select: none; white-space: nowrap; transition: 0.25s; } .btn:hover { background: hsl(var(--hue), 100%, 31%); } .btn-primary { --hue: 187; } .btn-ghost { color: hsl(var(--hue), 100%, 41%); background-color: transparent; border-color: hsl(var(--hue), 100%, 41%); } .btn-ghost:hover { color: white; } .btn-shine { color: white; } .btn-shine::before { position: absolute; content: ""; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(120deg, transparent, hsla(var(--hue), 100%, 41%, 0.5), transparent); transform: translateX(-100%); transition: 0.6s; } .btn-shine:hover { background: transparent; box-shadow: 0 0 20px 10px hsla(var(--hue), 100%, 41%, 0.5); } .btn-shine:hover::before { transform: translateX(100%); }
9. TODO List
效果如下:
-
查看代码
<form> <fieldset class="todo-list"> <legend class="todo-list__title">My Special Todo List</legend> <label class="todo-list__label"> <input type="checkbox" name="" id="" /> <i class="check"></i> <span>Make awesome CSS animation</span> </label> <label class="todo-list__label"> <input type="checkbox" name="" id="" /> <i class="check"></i> <span>Watch awesome bangumi</span> </label> <label class="todo-list__label"> <input type="checkbox" name="" id="" /> <i class="check"></i> <span>Encounter awesome people</span> </label> <label class="todo-list__label"> <input type="checkbox" name="" id="" /> <i class="check"></i> <span>Be an awesome man</span> </label> </fieldset> </form>
@import url("https://fonts.googleapis.com/css?family=Lato:400,400i,700"); body { display: flex; justify-content: center; align-items: center; height: 100vh; background: #1A1E23; } .todo-list { display: flex; flex-direction: column; padding: 0 75px 10px 30px; background: #162740; border: transparent; } .todo-list .todo-list__title { padding: 3px 6px; color: #f1faee; background-color: #264456; } .todo-list .todo-list__label { display: flex; align-items: center; margin: 40px 0; font-size: 24px; font-family: Lato, sans-serif; color: #f1faee; cursor: pointer; } .todo-list .todo-list__label input[type=checkbox] { opacity: 0; -webkit-appearance: none; -moz-appearance: none; appearance: none; } .todo-list .todo-list__label input[type=checkbox] + .check { position: absolute; width: 25px; height: 25px; border: 2px solid #f1faee; transition: 0.2s; } .todo-list .todo-list__label input[type=checkbox]:checked + .check { width: 25px; height: 15px; border-top: transparent; border-right: transparent; transform: rotate(-45deg); } .todo-list .todo-list__label input[type=checkbox] ~ span { position: relative; left: 40px; white-space: nowrap; transition: 0.5s; } .todo-list .todo-list__label input[type=checkbox] ~ span::before { position: absolute; content: ""; top: 50%; left: 0; width: 100%; height: 1px; background: #f1faee; transform: scaleX(0); transform-origin: right; transition: transform 0.5s; } .todo-list .todo-list__label input[type=checkbox]:checked ~ span { color: #585b57; } .todo-list .todo-list__label input[type=checkbox]:checked ~ span::before { transform: scaleX(1); transform-origin: left; }
10. 分页选择器
效果如下:
-
查看代码
<ul class="pagination"> <li class="page-prev"> <a class="prev" href="#"><svg t="1580195949197" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4493" width="20" height="20"><path d="M906.78272 588.78976c-0.02048 8.4992-6.88128 15.36-15.38048 15.37024l-443.6992-0.01024 75.70432 191.68256c2.51904 6.42048 0.48128 13.76256-5.03808 17.90976-5.51936 4.16768-13.13792 4.1472-18.61632-0.09216l-376.5248-289.47456c-3.77856-2.89792-6.00064-7.41376-6.00064-12.16512 0-4.78208 2.22208-9.27744 6.00064-12.1856l376.5248-289.47456c2.7648-2.11968 6.06208-3.19488 9.37984-3.19488 3.23584 0 6.5024 1.03424 9.23648 3.10272 5.51936 4.1472 7.5776 11.48928 5.03808 17.90976L447.68256 419.84l443.71968-0.01024c8.4992 0.01024 15.36 6.88128 15.36 15.36L906.78272 588.78976z" p-id="4494" fill="#777777"></path></svg></a> </li> <li class="page-number active"><a href="#">1</a></li> <li class="page-number"><a href="#">2</a></li> <li class="page-number"><a href="#">3</a></li> <li class="page-number"><a href="#">4</a></li> <li class="page-number"><a href="#">5</a></li> <li class="page-number"><a href="#">6</a></li> <li class="page-next"> <a class="next" href="#"><svg t="1580195920917" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4995" width="20" height="20"><path d="M906.77248 512c0 4.77184-2.21184 9.2672-5.9904 12.17536l-376.5248 289.4848c-2.7648 2.11968-6.06208 3.18464-9.3696 3.18464-3.25632 0-6.5024-1.03424-9.24672-3.09248-5.50912-4.15744-7.5776-11.48928-5.03808-17.90976l75.71456-191.67232L132.58752 604.17024c-8.48896 0-15.36-6.88128-15.36-15.36l0-153.6c0-8.48896 6.87104-15.36 15.36-15.36l443.72992 0-75.71456-191.68256c-2.53952-6.42048-0.47104-13.75232 5.04832-17.90976 5.50912-4.15744 13.12768-4.13696 18.60608 0.09216l376.5248 289.4848C904.56064 502.7328 906.77248 507.22816 906.77248 512z" p-id="4996" fill="#777777"></path></svg></a> </li> </ul>
body { display: flex; justify-content: center; align-items: center; height: 100vh; background: #ECEFFC; } .pagination { --active-index: 0; display: flex; padding: 10px 20px; background: white; border-radius: 50px; box-shadow: 0 0.3px 0.6px rgba(0, 0, 0, 0.056), 0 0.7px 1.3px rgba(0, 0, 0, 0.081), 0 1.3px 2.5px rgba(0, 0, 0, 0.1), 0 2.2px 4.5px rgba(0, 0, 0, 0.119), 0 4.2px 8.4px rgba(0, 0, 0, 0.144), 0 10px 20px rgba(0, 0, 0, 0.2); list-style-type: none; } .pagination li { margin: 0 5px; } .pagination li.page-number { width: 50px; height: 50px; line-height: 50px; text-align: center; } .pagination li.page-number:hover a { color: white; background: #777; } .pagination li.page-number.active a { color: white; background: #333; } .pagination li.page-prev, .pagination li.page-next { font-weight: 700; } .pagination li.page-prev { margin-right: 20px; } .pagination li.page-next { margin-left: 20px; } .pagination li a { display: block; line-height: 50px; font-size: 20px; font-weight: 600; text-decoration: none; color: #777; border-radius: 50%; transition: 0.3s; } .pagination li a.prev:hover path, .pagination li a.next:hover path { fill: black; }
"use strict"; let prevLink = document.querySelector(".prev"); let nextLink = document.querySelector(".next"); let pagination = document.querySelector(".pagination"); let pageNumberLinks = document.querySelectorAll(".page-number a"); let maxPageIndex = pageNumberLinks.length - 1; pageNumberLinks.forEach((pageNumberLink, activeIndex) => { pageNumberLink.addEventListener("click", () => { pageNumberLinks.forEach(pageNumberLink => pageNumberLink.parentElement.classList.remove("active")); pageNumberLink.parentElement.classList.add("active"); pagination.style.setProperty("--active-index", `${activeIndex}`); }); }); prevLink.addEventListener("click", () => { pageNumberLinks.forEach(pageNumberLink => pageNumberLink.parentElement.classList.remove("active")); let activeIndex = Number(pagination.style.getPropertyValue("--active-index")); activeIndex = activeIndex > 0 ? activeIndex - 1 : 0; pageNumberLinks[activeIndex].parentElement.classList.add("active"); pagination.style.setProperty("--active-index", `${activeIndex}`); }); nextLink.addEventListener("click", () => { pageNumberLinks.forEach(pageNumberLink => pageNumberLink.parentElement.classList.remove("active")); let activeIndex = Number(pagination.style.getPropertyValue("--active-index")); activeIndex = activeIndex < maxPageIndex ? activeIndex + 1 : maxPageIndex; pageNumberLinks[activeIndex].parentElement.classList.add("active"); pagination.style.setProperty("--active-index", `${activeIndex}`); });
11. 遮罩
效果如下:
-
查看代码
<input type="checkbox" id="burger-toggle"> <label for="burger-toggle" class="burger-menu"> <div class="line"></div> <div class="line"></div> <div class="line"></div> </label> <div class="overlay"></div>
body { display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; overflow: hidden; background: #ECEFFC; } #burger-toggle { appearance: none; opacity: 0; } #burger-toggle:checked ~ .overlay { opacity: 1; transform: scale(160); } #burger-toggle:checked ~ .burger-menu .line:nth-child(1) { transform: translateY(calc(var(--burger-menu-radius) / 5)) rotate(45deg); } #burger-toggle:checked ~ .burger-menu .line:nth-child(2) { transform: scaleX(0); } #burger-toggle:checked ~ .burger-menu .line:nth-child(3) { transform: translateY(calc(var(--burger-menu-radius) / -5)) rotate(-45deg); } .burger-menu { --burger-menu-radius: 4em; position: relative; z-index: 100; display: block; width: var(--burger-menu-radius); height: var(--burger-menu-radius); background: white; border: solid 2px rgba(149, 166, 167, 0.4); border-radius: 50%; outline: none; cursor: pointer; transition: 0.5s ease-in-out; } .burger-menu .line { position: absolute; left: 25%; width: 50%; height: 3px; background: rgba(43, 61, 79, 0.3); border-radius: 10px; overflow: hidden; transition: all 0.5s ease; } .burger-menu .line:nth-child(1) { top: 30%; } .burger-menu .line:nth-child(2) { top: 50%; } .burger-menu .line:nth-child(3) { top: 70%; } .burger-menu .line::after { position: absolute; content: ""; top: 0; left: 0; width: 100%; height: 100%; background: #2980b9; transform: translateX(-100%); transition: all 0.25s ease; } .burger-menu .line:nth-child(2)::after { transition-delay: 0.1s; } .burger-menu .line:nth-child(3)::after { transition-delay: 0.2s; } .burger-menu:hover { box-shadow: 0.4px 0.4px 0.8px rgba(0, 0, 0, 0.042), 1px 1px 2px rgba(0, 0, 0, 0.061), 1.9px 1.9px 3.8px rgba(0, 0, 0, 0.075), 3.4px 3.4px 6.7px rgba(0, 0, 0, 0.089), 6.3px 6.3px 12.5px rgba(0, 0, 0, 0.108), 15px 15px 30px rgba(0, 0, 0, 0.15); } .burger-menu:hover .line::after { transform: translateX(0); } .overlay { position: absolute; width: 2em; height: 2em; background: rgba(40, 127, 184, 0.9); border-radius: 50%; opacity: 0; transition: 0.5s ease-in-out; will-change: transform; }
更多推荐
已为社区贡献2条内容
所有评论(0)