HTML,CSS,JavaScript实例 —— 齿轮,按钮

文章目录


一、动态按钮

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			html,
			body {
				background: black;
				height: 100%;
				display: flex;
				align-items: center;
				justify-content: center;
			}

			.circle {
				width: 8px;
				height: 8px;
				border-radius: 50%;
				position: absolute;
				top: 50%;
				left: 50%;
				margin: -4px 0 0 -4px;
				pointer-events: none;
				mix-blend-mode: screen;
				z-index: 10;
				box-shadow: 0px 0px 8px 0px #FDFCA9 inset, 0px 0px 24px 0px #FFEB3B, 0px 0px 8px 0px #FFFFFF42;
			}

			.button-wrapper {
				position: relative;
			}

			.button {
				z-index: 1;
				position: relative;
				text-decoration: none;
				text-align: center;
				appearance: none;
				display: inline-block;
			}

			.button::before {
				content: "";
				box-shadow: 0px 0px 24px 0px #FFEB3B;
				mix-blend-mode: screen;
				transition: opacity 0.3s;

				position: absolute;
				top: 0;
				right: 0;
				left: 0;
				bottom: 0;
				border-radius: 999px;
				opacity: 0;
			}

			.button::after {
				content: "";
				box-shadow: 0px 0px 23px 0px #FDFCA9 inset, 0px 0px 8px 0px #FFFFFF42;
				transition: opacity 0.3s;

				position: absolute;
				top: 0;
				right: 0;
				left: 0;
				bottom: 0;
				border-radius: 999px;
				opacity: 0;
			}

			.button-wrapper:hover {

				.button::before,
				.button::after {
					opacity: 1;
				}

				.dot {
					transform: translate(0, 0) rotate(var(--rotatation));
				}

				.dot::after {
					animation-play-state: running;
				}
			}

			.dot {
				display: block;
				position: absolute;
				transition: transform calc(var(--speed) / 12) ease;
				width: var(--size);
				height: var(--size);
				transform: translate(var(--starting-x), var(--starting-y)) rotate(var(--rotatation));
			}

			.dot::after {
				content: "";
				animation: hoverFirefly var(--speed) infinite, dimFirefly calc(var(--speed) / 2) infinite calc(var(--speed) / 3);
				animation-play-state: paused;
				display: block;
				border-radius: 100%;
				background: yellow;
				width: 100%;
				height: 100%;
				box-shadow: 0px 0px 6px 0px #FFEB3B, 0px 0px 4px 0px #FDFCA9 inset, 0px 0px 2px 1px #FFFFFF42;
			}

			.dot-1 {
				--rotatation: 0deg;
				--speed: 14s;
				--size: 6px;
				--starting-x: 30px;
				--starting-y: 20px;
				top: 2px;
				left: -16px;
				opacity: 0.7;
			}

			.dot-2 {
				--rotatation: 122deg;
				--speed: 16s;
				--size: 3px;
				--starting-x: 40px;
				--starting-y: 10px;
				top: 1px;
				left: 0px;
				opacity: 0.7;
			}

			.dot-3 {
				--rotatation: 39deg;
				--speed: 20s;
				--size: 4px;
				--starting-x: -10px;
				--starting-y: 20px;
				top: -8px;
				right: 14px;
			}

			.dot-4 {
				--rotatation: 220deg;
				--speed: 18s;
				--size: 2px;
				--starting-x: -30px;
				--starting-y: -5px;
				bottom: 4px;
				right: -14px;
				opacity: 0.9;
			}

			.dot-5 {
				--rotatation: 190deg;
				--speed: 22s;
				--size: 5px;
				--starting-x: -40px;
				--starting-y: -20px;
				bottom: -6px;
				right: -3px;
			}

			.dot-6 {
				--rotatation: 20deg;
				--speed: 15s;
				--size: 4px;
				--starting-x: 12px;
				--starting-y: -18px;
				bottom: -12px;
				left: 30px;
				opacity: 0.7;
			}

			.dot-7 {
				--rotatation: 300deg;
				--speed: 19s;
				--size: 3px;
				--starting-x: 6px;
				--starting-y: -20px;
				bottom: -16px;
				left: 44px;
			}

			@keyframes dimFirefly {
				0% {
					opacity: 1;
				}

				25% {
					opacity: 0.4;
				}

				50% {
					opacity: 0.8;
				}

				75% {
					opacity: 0.5;
				}

				100% {
					opacity: 1;
				}
			}

			@keyframes hoverFirefly {
				0% {
					transform: translate(0, 0);
				}

				12% {
					transform: translate(3px, 1px);
				}

				24% {
					transform: translate(-2px, 3px);
				}

				37% {
					transform: translate(2px, -2px);
				}

				55% {
					transform: translate(-1px, 0);
				}

				74% {
					transform: translate(0, 2px);
				}

				88% {
					transform: translate(-3px, -1px);
				}

				100% {
					transform: translate(0, 0);
				}
			}
		</style>
	</head>
	<body>
		<a class="button-wrapper">
			<span class="dot dot-1"></span>
			<span class="dot dot-2"></span>
			<span class="dot dot-3"></span>
			<span class="dot dot-4"></span>
			<span class="dot dot-5"></span>
			<span class="dot dot-6"></span>
			<span class="dot dot-7"></span>
			<span class="button bg-yellow-500 px-16 py-4 rounded-full uppercase">Button<span>
		</a>

		<div id="circle" class="circle bg-yellow-500"></div>
	</body>
	<script type="text/javascript">
		var kinet = new Kinet({
			acceleration: 0.02,
			friction: 0.25,
			names: ["x", "y"],
		});

		var circle = document.getElementById('circle');

		kinet.on('tick', function(instances) {
			circle.style.transform =
				`translate3d(${ (instances.x.current) }px, ${ (instances.y.current) }px, 0) rotateX(${ (instances.x.velocity/2) }deg) rotateY(${ (instances.y.velocity/2) }deg)`;
		});

		document.addEventListener('mousemove', function(event) {
			kinet.animate('x', event.clientX - window.innerWidth / 2);
			kinet.animate('y', event.clientY - window.innerHeight / 2);
		});

		kinet.on('start', function() {
			console.log('start');
		});

		kinet.on('end', function() {
			console.log('end');
		});
	</script>
</html>

二、CSS实例

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			.text-effect-wrapper,
			.text {

				&::before,
				&::after {
					content: "";
					position: absolute;
					inset: 0;
					pointer-events: none;
				}
			}

			.text-effect-wrapper {
				--spotlight-color: white;

				overflow: hidden;
				position: relative;

				&::before {
					animation: shimmer 5s infinite linear;
					background:
						radial-gradient(circle, var(--spotlight-color), transparent 25%) 0 0 / 25% 25%,
						radial-gradient(circle, var(--spotlight-color), black 25%) 50% 50% / 12.5% 12.5%;
					inset-block-start: -100%;
					inset-inline-start: -100%;
					mix-blend-mode: color-dodge;
					z-index: 3;
				}

				&::after {
					backdrop-filter: blur(1px) brightness(90%) contrast(150%);
					z-index: 4;
				}
			}

			@keyframes shimmer {
				100% {
					transform: translate3d(50%, 50%, 0);
				}
			}

			.text {
				--background-color: black;
				--text-color: white;
				
				--color-1: red;
				--color-2: blue;

				color: transparent;
				text-shadow:
					0 0 0.02em var(--background-color),
					0 0 0.02em var(--text-color),
					0 0 0.02em var(--text-color),
					0 0 0.02em var(--text-color);

				&::before {
					backdrop-filter: blur(0.013em) brightness(400%);
					z-index: 1;
				}

				&::after {
					background: linear-gradient(45deg, var(--color-1), var(--color-2));
					mix-blend-mode: multiply;
					z-index: 2;
				}
			}
			
			body:has(#option-toggle:checked) {
				& .text-effect-wrapper {
					--spotlight-color: orange;

					&::after {
						backdrop-filter: brightness(90%) contrast(150%);
					}
				}

				& .text {
					--angle: 5deg;
					--color-1: hsl(163, 100%, 51%);
					--color-2: hsl(295, 88%, 32%);
					--color-3: hsl(59, 100%, 50%);

					text-shadow:
						0 0 0.03em var(--background-color),
						0 0 0.03em var(--text-color);

					&::before {
						backdrop-filter: brightness(150%) contrast(200%);
					}

					&::after {
						background: linear-gradient(var(--angle), var(--color-1), var(--color-2), var(--color-3));
						mix-blend-mode: color-dodge;
					}
				}
			}


			h1 {
				--font-size: clamp(6.25rem, 3.25rem + 15vw, 13.75rem);

				font: 700 var(--font-size)/1 "Lato", sans-serif;
				text-transform: uppercase;
				text-align: center;
				margin: 0;

				&:empty,
				&:focus {
					border: 2px dotted white;
					min-width: 1ch;
					outline-offset: 5px;
				}
			}

			body {
				background: black;
				display: flex;
				min-height: 100vh;
				justify-content: center;
				align-content: center;
				align-items: center;
			}

			label {
				background-color: hsl(240deg, 20%, 50%);
				border-radius: 5px;
				color: #fff;
				padding: 0.5em 1em;

				position: fixed;
				bottom: 1rem;
				right: 1rem;
				z-index: 1000;

				&:has(:checked) {
					background-color: hsl(350deg, 60%, 50%);
				}
			}

			input {
				position: absolute;
				opacity: 0;
			}
		</style>
	</head>
	<body>
		<div class="text-effect-wrapper">
			<h1 class="text" contenteditable>WanderTp</h1>
		</div>

		<label for="option-toggle">
			<input type="checkbox" id="option-toggle"> Version toggle
		</label>
	</body>
</html>

三、滚动的齿轮

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			html {
				display: grid;
				place-items: center;
				min-height: 100vh;
				background: #111;
			}

			#machine {
				width: 300px;
				aspect-ratio: 1/1;
				/*   outline: 1px solid black;   */
			}

			.gear {
				width: 100px;
				aspect-ratio: 1/1;
				/*   border-radius: 50%; */
				background:
					radial-gradient(circle at 5% 5%, transparent 20px, gray 21px, transparent 30px),
					radial-gradient(circle at 50% -10px, transparent 20px, gray 21px, transparent 30px),
					radial-gradient(circle at 95% 5%, transparent 20px, gray 21px, transparent 30px),
					radial-gradient(circle at 110px 50%, transparent 20px, gray 21px, transparent 30px),
					radial-gradient(circle at 95% 95%, transparent 20px, gray 21px, transparent 30px),
					radial-gradient(circle at 50% 110px, transparent 20px, gray 21px, transparent 30px),
					radial-gradient(circle at 5% 95%, transparent 20px, gray 21px, transparent 30px),
					radial-gradient(circle at -10px 50%, transparent 20px, gray 21px, transparent 30px),
					radial-gradient(circle at 50% 50%, transparent 25px, gray 26px, transparent 50px);
			}

			.gear:nth-child(1) {
				transform: scale(.75) translate(45%, 45%) rotate(22.5deg);
				animation: roll1 3s linear infinite;
			}

			@keyframes roll1 {
				100% {
					transform: scale(.75) translate(45%, 45%) rotate(-341.5deg);
				}
			}

			.gear:nth-child(2) {
				transform: translateX(100%);
				animation: roll2 3s linear infinite;
			}

			@keyframes roll2 {
				100% {
					transform: translateX(100%) rotate(359deg);
				}
			}

			.gear:nth-child(3) {
				transform: scale(.75) translate(180%, -20%) rotate(22.5deg);
				animation: roll3 3s linear infinite;
			}

			@keyframes roll3 {
				100% {
					transform: scale(.75) translate(180%, -20%) rotate(-341.5deg);
				}
			}
		</style>
	</head>
	<body>
		<div id='machine'>
			<div class='gear'></div>
			<div class='gear'></div>
			<div class='gear'></div>
		</div>
	</body>

</html>
相关推荐
Justinc.3 分钟前
CSS3新增边框属性(五)
前端·css·css3
fruge11 分钟前
纯css制作声波扩散动画、js+css3波纹催眠动画特效、【css3动画】圆波扩散效果、雷达光波效果完整代码
javascript·css·css3
neter.asia19 分钟前
vue中如何关闭eslint检测?
前端·javascript·vue.js
~甲壳虫20 分钟前
说说webpack中常见的Plugin?解决了什么问题?
前端·webpack·node.js
光影少年39 分钟前
vue2与vue3的全局通信插件,如何实现自定义的插件
前端·javascript·vue.js
As977_40 分钟前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
susu108301891142 分钟前
vue3 css的样式如果background没有,如何覆盖有background的样式
前端·css
Ocean☾44 分钟前
前端基础-html-注册界面
前端·算法·html
Rattenking44 分钟前
React 源码学习01 ---- React.Children.map 的实现与应用
javascript·学习·react.js
Dragon Wu1 小时前
前端 Canvas 绘画 总结
前端