Frosted glass
A translucent pane over slowly moving color.
A frosted calculator with a recessed display and glass keys, over two slow orbs you can watch through the keypad. Keys brighten on hover and squash on press. Real buttons laid out with CSS grid.
Also known as: glassmorphism calculator html css, frosted calculator ui, ios calculator css.
<div class="gls-glass-calculator">
<span class="gls-glass-calculator-orb gls-glass-calculator-orb-a" aria-hidden="true"></span>
<span class="gls-glass-calculator-orb gls-glass-calculator-orb-b" aria-hidden="true"></span>
<div class="gls-glass-calculator-body">
<div class="gls-glass-calculator-screen">
<span class="gls-glass-calculator-history">12 × 8 = 96</span>
<span class="gls-glass-calculator-expr">128 × 40</span>
<output class="gls-glass-calculator-result">5,120</output>
</div>
<div class="gls-glass-calculator-keys">
<button class="gls-glass-calculator-fn" type="button">AC</button>
<button class="gls-glass-calculator-fn" type="button" aria-label="Plus or minus">±</button>
<button class="gls-glass-calculator-fn" type="button" aria-label="Percent">%</button>
<button class="gls-glass-calculator-op" type="button" aria-label="Divide">÷</button>
<button type="button">7</button>
<button type="button">8</button>
<button type="button">9</button>
<button class="gls-glass-calculator-op" type="button" aria-label="Multiply">×</button>
<button type="button">4</button>
<button type="button">5</button>
<button type="button">6</button>
<button class="gls-glass-calculator-op" type="button" aria-label="Minus">−</button>
<button type="button">1</button>
<button type="button">2</button>
<button type="button">3</button>
<button class="gls-glass-calculator-op" type="button" aria-label="Plus">+</button>
<button class="gls-glass-calculator-zero" type="button">0</button>
<button type="button" aria-label="Decimal point">.</button>
<button class="gls-glass-calculator-eq" type="button" aria-label="Equals">=</button>
</div>
</div>
</div>.gls-glass-calculator {
--c: var(--gls-color, #3b82f6);
font-size: var(--gls-size, 16px);
position: relative;
display: grid;
place-items: center;
width: 22em;
height: 12em;
border-radius: 1.25em;
overflow: hidden;
isolation: isolate;
background: linear-gradient(145deg, color-mix(in srgb, var(--c) 55%, #0f172a), color-mix(in srgb, var(--c) 30%, #1e1b4b));
color: #fff;
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
line-height: 1.3;
}
.gls-glass-calculator-orb {
position: absolute;
z-index: -1;
border-radius: 50%;
}
.gls-glass-calculator-orb-a {
right: 3em;
top: 0.8em;
width: 6.5em;
height: 6.5em;
background: linear-gradient(135deg, color-mix(in srgb, var(--c) 40%, #fff), var(--c));
animation: gls-glass-calculator-float-a 8s ease-in-out infinite alternate;
}
.gls-glass-calculator-orb-b {
left: 2.6em;
bottom: 0.6em;
width: 5em;
height: 5em;
background: linear-gradient(135deg, #fde68a, #f472b6);
animation: gls-glass-calculator-float-b 9s ease-in-out infinite alternate;
}
.gls-glass-calculator-body {
display: grid;
grid-template-columns: 6.8em auto;
gap: 0.55em;
padding: 0.55em;
border-radius: 1.15em;
background: color-mix(in srgb, #fff 14%, transparent);
-webkit-backdrop-filter: blur(0.9em) saturate(1.5);
backdrop-filter: blur(0.9em) saturate(1.5);
border: 1px solid color-mix(in srgb, #fff 45%, transparent);
box-shadow: 0 0.5em 1.5em -0.5em rgb(0 0 0 / 0.35), inset 0 1px 0 color-mix(in srgb, #fff 55%, transparent);
}
.gls-glass-calculator-screen {
display: flex;
flex-direction: column;
align-items: flex-end;
padding: 0.6em 0.65em 0.5em;
border-radius: 0.75em;
background: rgb(15 23 42 / 0.24);
box-shadow: inset 0 0.1em 0.35em rgb(0 0 0 / 0.25), inset 0 -1px 0 rgb(255 255 255 / 0.2);
text-align: right;
font-variant-numeric: tabular-nums;
}
.gls-glass-calculator-history { margin-bottom: auto; font-size: 0.55em; opacity: 0.55; }
.gls-glass-calculator-expr { font-size: 0.66em; opacity: 0.8; }
.gls-glass-calculator-result {
font-size: 1.55em;
font-weight: 300;
line-height: 1.1;
letter-spacing: -0.02em;
}
.gls-glass-calculator-result::after {
content: "";
display: inline-block;
width: 0.07em;
height: 0.85em;
margin-left: 0.06em;
vertical-align: -0.06em;
background: color-mix(in srgb, var(--c) 45%, #fff);
animation: gls-glass-calculator-caret 1.1s steps(1) infinite;
}
.gls-glass-calculator-keys {
display: grid;
grid-template-columns: repeat(4, 1.95em);
grid-auto-rows: 1.3em;
gap: 0.28em;
}
.gls-glass-calculator-keys button {
display: grid;
place-items: center;
margin: 0;
padding: 0;
border: 0;
border-radius: 0.75em;
background: rgb(255 255 255 / 0.13);
box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.35), inset 0 0 0 1px rgb(255 255 255 / 0.1);
color: #fff;
font: inherit;
font-size: 0.72em;
font-weight: 600;
cursor: pointer;
transition: scale 0.35s cubic-bezier(0.34, 1.56, 0.64, 1), filter 0.2s ease;
}
.gls-glass-calculator-keys .gls-glass-calculator-fn { background: rgb(255 255 255 / 0.3); }
.gls-glass-calculator-keys .gls-glass-calculator-op {
background: color-mix(in srgb, var(--c) 72%, transparent);
font-size: 0.9em;
}
.gls-glass-calculator-keys .gls-glass-calculator-eq {
background: linear-gradient(180deg, color-mix(in srgb, var(--c) 45%, #fff), var(--c));
font-size: 0.9em;
}
.gls-glass-calculator-keys .gls-glass-calculator-zero {
grid-column: span 2;
place-items: center start;
padding-left: 1.05em;
}
.gls-glass-calculator-keys button:hover { filter: brightness(1.3); }
.gls-glass-calculator-keys button:active {
scale: 0.9;
transition-duration: 0.08s;
}
.gls-glass-calculator-keys button:focus-visible { outline: 2px solid #fff; outline-offset: 0.12em; }
@keyframes gls-glass-calculator-float-a {
to { transform: translate(-3.5em, 1.4em) scale(1.12); }
}
@keyframes gls-glass-calculator-float-b {
to { transform: translate(3em, -2.2em) scale(0.9); }
}
@keyframes gls-glass-calculator-caret {
50% { opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
.gls-glass-calculator, .gls-glass-calculator *, .gls-glass-calculator::before, .gls-glass-calculator::after, .gls-glass-calculator *::before, .gls-glass-calculator *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}--gls-color on the element or a parent.
Currently previewing #3b82f6.--gls-size. Every other dimension is in
em, so the whole thing scales together. Currently previewing 16px.transition or animation
shorthand. Staggered delays are relative, so they keep their rhythm.