svg+css实现一款拟态手机运动类app界面UI效果代码
代码语言:html
所属分类:布局界面
代码描述:svg+css实现一款拟态手机运动类app界面UI效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"><link rel='stylesheet' href='https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;700&display=swap'> <style> * { border: 0; box-sizing: border-box; margin: 0; padding: 0; } :root { --hue: 184; --bg: hsl(var(--hue),10%,90%); --fg: hsl(var(--hue),66%,24%); --primary: hsl(var(--hue),66%,44%); --gradient: linear-gradient(145deg, hsl(var(--hue),10%,85%), hsl(var(--hue),10%,100%)); font-size: 16px; } body, button { color: var(--fg); font: 1em/1.5 "Nunito", sans-serif; } body { background: var(--bg); height: 100vh; display: grid; place-items: center; padding: 1.5em 0 0 0; } body:after { content: ""; display: block; height: 1.5em; width: 100%; } /* All */ .app, .header, .main__date-nav, .main__stat-row, .main__stat-graph, .footer { display: flex; } .header, .main__date-nav, .footer { justify-content: space-between; } .header__profile-btn, .header__notes-btn, .main__date-arrow-btn, .main__date-edit-btn, .footer__nav-btn { background: transparent; display: flex; outline: transparent; transition: all 0.15s linear; -webkit-appearance: none; appearance: none; -webkit-tap-highlight-color: transparent; } .app { background: hsl(var(--hue),10%,85%); border-radius: 3em; flex-direction: column; padding: 2.25em; width: 390px; height: 844px; } .app__gradients { position: absolute; width: 1px; height: 1px; } .icon { display: block; margin: auto; width: 1.5em; height: 1.5em; } .icon circle, .icon path { fill: currentColor; transition: fill 0.15s linear; } .icon ellipse, .icon polygon { stroke: currentColor; transition: stroke 0.15s linear; } .icon .no-fill { fill: none; stroke: currentColor; } .icon--red path { fill: hsl(3,90%,55%); } .icon--pulse { animation: bpm 1s linear, pulse 0.75s 1s linear infinite; } .ring, .sr-only { position: absolute; } .ring { display: block; inset: 0; width: 100%; height: auto; } .ring-fill { stroke: url("#ring"); } .ring-stroke { animation-duration: 1s; animation-timing-function: ease-in-out; stroke: url("#ring"); } .ring-stroke--steps { animation-name: stepCount; } .ring-stroke--cals { animation-name: cals; } .ring-stroke--miles { animation-name: miles; } .ring-stroke--mins { animation-name: mins; } .ring-stroke--stepHrs { animation-name: stepHrs; } .ring-track { stroke: hsl(var(--hue),10%,80%); } .sr-only { clip: rect(1px,1px,1px,1px); overflow: hidden; width: 1px; height: 1px; } /* Header */ .header { display: flex; justify-content: space-between; margin-bottom: 1.5em; } .header__profile-btn, .header__notes-btn { width: 3em; height: 3em; } .header__profile-btn { border-radius: 1em; box-shadow: 0 0 0 0.125em inset; } .header__notes-btn { margin-right: -1em; } .header__profile-btn:active, .header__notes-btn:active { transform: scale(0.9); } .header__profile-btn:focus { box-shadow: 0 0 0 0.125em var(--primary) inset; } .header__profile-icon { border-radius: 0.5em; margin: auto; width: 2em; height: 2em; } .header__notes-btn:focus .icon path { fill: var(--primary); } /* Main */ .main__date-nav { margin-bottom: 1.5em; } .main__date-arrow-btn, .main__date-edit-btn { height: 1.5em; } .main__date-arrow-btn { width: 1.5em; } .main__date-arrow-btn:active .icon path, .main__date-arrow-btn:focus .icon path { fill: var(--primary); } .main__date { text-transform: uppercase; } .main__date-edit-btn { min-width: 1.5em; } .main__date-edit-btn:active, .main__date-edit-btn:focus { color: var(--primary); } .main__stat-blocks { display: grid; grid-template-columns: repeat(3,1fr); grid-gap: 1.5em; margin-bottom: 1.5em; } .main__stat-block { aspect-ratio: 1 / 1; background: var(--gradient); border-radius: 1.5em; box-shadow: -0.75em -0.75em 2.25em hsl(0,0%,100%), 0.75em 0.75em 2.25em hsl(var(--hue),5%,65%); padding: 0.75em; text-align: center; width: 100%; } .main__stat-block--lg { aspect-ratio: 2 / 1; grid-column: 1 / 4; padding: 1.5em; } .main__stat-rows, .main__stat-row { margin-bottom: 1.5em; } .main__stat-row { align-items: center; } .main__stat-graph { margin: 0 auto 0.75em auto; position: relative; width: 3.75em; height: 3.75em; } .main__stat-graph .main__stat-detail { display: flex; flex-direction: column; justify-content: center; position: absolute; inset: 0; } .main__stat-block--lg .main__stat-graph { margin: auto; width: 11.25em; height: 11.25em; } .main__stat-block--lg .icon { margin: 0 auto; width: 2.25em; height: 2.25em; } .main__stat-row .main__stat-graph { background: var(--gradient); border-radius: 1em; box-shadow: -0.75em -0.75em 2.25em hsl(0,0%,100%), 0.75em 0.75em 2.25em hsl(var(--hue),5%,65%); margin: 0 1.5em 0 0; } .main__stat-value, .main__stat-unit { display: block; } .main__stat-value { font-size: 1.25em; line-height: 1.2; } .main__stat-block--lg .main__stat-value { font-size: 2em; line-height: 1.5; } .main__stat-unit, .main__stat-subtext { font-weight: 300; } .main__stat-subtext { color: hsl(var(--hue),10%,30%); } .main__stat-graph--filled, .main__stat-graph--filled .ring-fill { animation-duration: 0.3s; animation-delay: 1s; animation-fill-mode: forwards; } .main__stat-graph--filled { animation-name: statFill; animation-timing-function: linear; } .main__stat-graph--filled .ring-fill { animation-name: ringFill; animation-timing-function: ease-in; } /* Footer */ .footer { margin-top: auto; } .footer__nav-btn { background: var(--gradient); border-radius: 50%; box-shadow: 1em 1em 2em hsl(var(--hue),5%,65%), -1em -1em 2em hsl(0,0%,100%); width: 3em; height: 3em; } .footer__nav-btn:active { box-shadow: 0.75em 0.75em 1.5em hsl(var(--hue),5%,65%), -0.75em -0.75em 1.5em hsl(0,0%,100%); transform: scale(0.9); } .footer__nav-btn:focus .icon circle, .footer__nav-btn:focus .icon path { fill: var(--primary); } /* Dark theme */ @media (prefers-color-scheme: dark) { :root { --bg: hsl(var(--hue),10%,10%); --fg: hsl(var(--hue),66%,94%); --primary: hsl(var(--hue),66%,44%); --gradient: linear-gradient(145deg, hsl(var(--hue),10%,15%), hsl(var(--hue),10%,30%)); } .app { background: hsl(var(--hue),10%,20%); } .icon--red path { fill: hsl(3,90%,65%); } .ring-track { stroke: hsl(var(--hue),10%,30%); } .main__stat-block, .main__stat-row .main__stat-graph { box-shadow: -0.75em -0.75em 2.25em hsl(var(--hue),10%,30%), 0.75em 0.75em 2.25em hsl(var(--hue),5%,5%); } .main__stat-subtext { color: hsl(var(--hue),10%,70%); } .footer__nav-btn { box-shadow: -1em -1em 2em hsl(var(--hue),10%,30%), 1em 1em 2em hsl(var(--hue),5%,5%); } .footer__nav-btn:active { box-shadow: -0.75em -0.75em 1.5em hsl(var(--hue),10%,30%), 0.75em 0.75em 1.5em hsl(var(--hue),5%,5%); } } /* Animations */ @keyframes statFill { from { color: var(--fg); } to { color: hsl(var(--hue),66%,94%); } } @keyframes ringFill { from { r: 82px; stroke-width: 16; } to { r: 45px; stroke-width: 90; } } @keyframes stepCount { from { stroke-dashoffset: 515.22; } to { stroke-dashoffset: 0; } } @keyframes cals { from { stroke-dashoffset: 163.36; } to { stroke-dashoffset: 12.25; } } @keyframes miles { from { stroke-dashoffset: 163.36; } to { stroke-dashoffset: 35.39; } } @keyframes mins { from { stroke-dashoffset: 163.36; } to { stroke-dashoffset: 65.34; } } @keyframes bpm { from { transform: scale(0); } 37.5% { transform: scale(1.2); } 75%, to { transform: scale(1); } } @keyframes stepHrs { from { stroke-dashoffset: 131.95; } to { stroke-dashoffset: 52.78; } } @keyframes pulse { from, 75%, to { transform: scale(1); } 25% { transform: scale(0.9); } 50% { transform: scale(1.2); } } </style> </head> <body> <div class="app"> <svg class="app__gradients" hidden> <defs> <linearGradient id="ring" x1="1" y1="0" x2="0" y2="1"> <stop offset="0%" stop-color="hsl(184,66%,54%)" /> <stop offset="100%" stop-color="hsl(184,66%,34%)" /> </linearGradient> </defs> </svg> <header class="header"> <button class="header__profile-btn" type="button"> <img class="header__profile-icon&.........完整代码请登录后点击上方下载按钮下载查看
网友评论0