Skip to content

Commit 4f3becc

Browse files
authored
Merge pull request #950 from darshan-totagi/triangle
Added pure HTML & CSS 3D triangle design
2 parents b9de632 + 6f69485 commit 4f3becc

File tree

1 file changed

+138
-0
lines changed

1 file changed

+138
-0
lines changed

3D Triangle/triangle-3d.html

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width,initial-scale=1" />
6+
<title>3D Triangle (CSS only)</title>
7+
<style>
8+
:root{
9+
--size: 260px; /* width of triangle */
10+
--depth: 48px; /* extrusion depth */
11+
--bg: #071029;
12+
--face: #06b6d4;
13+
--face-2: #038aa6;
14+
--shadow: rgba(2,6,23,0.6);
15+
}
16+
17+
html,body{
18+
height:100%;
19+
margin:0;
20+
font-family: system-ui, Arial;
21+
background: linear-gradient(180deg, #03243a 0%, var(--bg) 100%);
22+
display:grid;
23+
place-items:center;
24+
color:#fff;
25+
}
26+
27+
.stage{
28+
perspective: 900px;
29+
}
30+
31+
/* container that preserves 3D children */
32+
.prism {
33+
width: var(--size);
34+
height: calc(var(--size) * 0.86); /* approx triangle height */
35+
position: relative;
36+
transform-style: preserve-3d;
37+
transform: rotateX(16deg) rotateY(-16deg);
38+
transition: transform .45s cubic-bezier(.2,.9,.2,1);
39+
filter: drop-shadow(0 18px 30px var(--shadow));
40+
}
41+
42+
.stage:hover .prism{
43+
transform: rotateX(6deg) rotateY(18deg) translateZ(8px);
44+
}
45+
46+
/* front & back triangular faces */
47+
.face {
48+
position: absolute;
49+
inset: 0;
50+
width: 100%;
51+
height: 100%;
52+
-webkit-clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
53+
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
54+
backface-visibility: hidden;
55+
}
56+
57+
.face.front {
58+
background: linear-gradient(180deg, var(--face) 0%, var(--face-2) 100%);
59+
transform: translateZ(calc(var(--depth) / 2));
60+
box-shadow: 0 6px 18px rgba(3,12,30,.45) inset;
61+
}
62+
63+
.face.back {
64+
background: linear-gradient(180deg, var(--face-2) 0%, var(--face) 100%);
65+
transform: rotateY(180deg) translateZ(calc(var(--depth) / 2));
66+
opacity: 0.96;
67+
}
68+
69+
/* side panels: three trapezoids connecting front & back */
70+
.side {
71+
position: absolute;
72+
width: 100%;
73+
height: 100%;
74+
transform-origin: center;
75+
backface-visibility: hidden;
76+
}
77+
78+
/* left side panel */
79+
.side.left {
80+
/* create a quadrilateral covering left edge */
81+
-webkit-clip-path: polygon(50% 0%, 0% 100%, 0% 100%, 50% 0%);
82+
clip-path: polygon(50% 0%, 0% 100%, 0% 100%, 50% 0%);
83+
background: linear-gradient(90deg, rgba(0,0,0,.12), rgba(0,0,0,0));
84+
transform: rotateY(90deg) translateX(calc(var(--size) / -2)) translateZ(calc(var(--depth) / -2));
85+
opacity: 0.95;
86+
}
87+
88+
/* right side panel */
89+
.side.right {
90+
-webkit-clip-path: polygon(50% 0%, 100% 100%, 100% 100%, 50% 0%);
91+
clip-path: polygon(50% 0%, 100% 100%, 100% 100%, 50% 0%);
92+
background: linear-gradient(90deg, rgba(0,0,0,0), rgba(0,0,0,.12));
93+
transform: rotateY(-90deg) translateX(calc(var(--size) / 2)) translateZ(calc(var(--depth) / -2));
94+
opacity: 0.95;
95+
}
96+
97+
/* bottom side panel (base thickness) */
98+
.side.bottom {
99+
/* a thin band along base */
100+
-webkit-clip-path: polygon(0% 100%, 50% 100%, 100% 100%, 100% 100%);
101+
clip-path: polygon(0% 100%, 50% 100%, 100% 100%, 100% 100%);
102+
background: linear-gradient(180deg, rgba(0,0,0,.12), rgba(255,255,255,0.02));
103+
transform: rotateX(90deg) translateY(calc(var(--size) * 0.43)) translateZ(calc(var(--depth) / -2));
104+
height: calc(var(--depth));
105+
top: auto;
106+
bottom: -1px;
107+
}
108+
109+
/* simple label */
110+
.label {
111+
margin-top: 18px;
112+
text-align: center;
113+
font-size: 14px;
114+
opacity: .85;
115+
}
116+
117+
/* small responsive tweak */
118+
@media (max-width:520px){
119+
:root{ --size: 200px; --depth: 36px; }
120+
}
121+
</style>
122+
</head>
123+
<body>
124+
<div class="stage">
125+
<div class="prism" aria-hidden="true">
126+
<div class="face front"></div>
127+
<div class="face back"></div>
128+
129+
<!-- side panels: visual depth only -->
130+
<div class="side left"></div>
131+
<div class="side right"></div>
132+
<div class="side bottom"></div>
133+
</div>
134+
135+
<div class="label">Pure HTML & CSS — 3D triangle (extruded)</div>
136+
</div>
137+
</body>
138+
</html>

0 commit comments

Comments
 (0)