<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>GSAP Scroll Portfolio UI</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/ScrollTrigger.min.js"></script>
<style>
*{
margin:0;
padding:0;
box-sizing:border-box;
}
body{
font-family:Arial, sans-serif;
color:#222;
}
a{
text-decoration:none;
color:inherit;
}
.wrap{
width:1200px;
margin:0 auto;
}
/* header */
.header{
height:80px;
border-bottom:1px solid #ddd;
background:#fff;
}
.header .wrap{
height:80px;
display:flex;
justify-content:space-between;
align-items:center;
}
.logo{
font-size:28px;
font-weight:900;
}
.menu{
display:flex;
gap:45px;
}
.menu a{
font-size:16px;
font-weight:700;
transition:0.3s;
}
.menu a:hover{
color:#888;
}
/* visual */
.visual{
height:420px;
margin-top:40px;
position:relative;
overflow:hidden;
border-radius:20px;
}
.visual img{
width:100%;
height:100%;
object-fit:cover;
display:block;
}
.visual::after{
content:"";
position:absolute;
inset:0;
background:linear-gradient(
90deg,
rgba(0,0,0,0.65),
rgba(0,0,0,0.25),
rgba(0,0,0,0)
);
}
.visual_text{
position:absolute;
left:60px;
top:100px;
z-index:2;
color:#fff;
}
.visual_text h2{
font-size:46px;
margin-bottom:20px;
}
.visual_text p{
font-size:18px;
line-height:1.7;
margin-bottom:30px;
}
.btn{
display:inline-block;
padding:14px 32px;
background:#fff;
color:#111;
font-weight:700;
border-radius:30px;
transition:0.3s;
}
.btn:hover{
background:#111;
color:#fff;
}
/* section */
.section_title{
margin:90px 0 30px;
font-size:32px;
font-weight:900;
}
/* card */
.card_wrap{
display:grid;
grid-template-columns:repeat(3, 1fr);
gap:30px;
align-items:stretch;
}
.card{
width:100%;
min-height:430px;
border:1px solid #ddd;
background:#fff;
border-radius:18px;
overflow:hidden;
display:flex;
flex-direction:column;
transition:transform 0.4s, box-shadow 0.4s;
will-change:transform;
}
.card:hover{
transform:translateY(-10px);
box-shadow:0 20px 40px rgba(0,0,0,0.15);
}
.img_box{
width:100%;
height:260px;
flex-shrink:0;
overflow:hidden;
}
.img_box img{
width:100%;
height:100%;
object-fit:cover;
display:block;
transition:0.6s;
}
.card:hover .img_box img{
transform:scale(1.08);
}
.card_text{
padding:25px;
flex:1;
display:flex;
flex-direction:column;
}
.card_text h3{
font-size:24px;
margin-bottom:12px;
}
.card_text p{
font-size:15px;
line-height:1.6;
color:#555;
min-height:48px;
}
.tag_wrap{
display:flex;
flex-wrap:wrap;
gap:8px;
margin-top:auto;
padding-top:18px;
}
.tag{
padding:7px 12px;
border:1px solid #333;
border-radius:20px;
font-size:13px;
font-weight:700;
}
/* info */
.info_wrap{
margin-top:90px;
display:grid;
grid-template-columns:repeat(2, 1fr);
gap:40px;
}
.info_box{
min-height:260px;
padding:40px;
border-radius:18px;
}
.info_left{
background:#eee;
}
.info_right{
background:#222;
color:#fff;
}
.info_box h3{
font-size:28px;
margin-bottom:20px;
}
.info_box p{
line-height:1.7;
}
/* footer */
.footer{
margin-top:90px;
height:100px;
background:#111;
color:#fff;
display:flex;
justify-content:center;
align-items:center;
}
</style>
</head>
<body>
<div class="header">
<div class="wrap">
<div class="logo">LOGO</div>
<div class="menu">
<a href="#">CLASS</a>
<a href="#">GALLERY</a>
<a href="#">TOOLS</a>
<a href="#">NEWS</a>
</div>
</div>
</div>
<div class="wrap">
<div class="visual">
<img class="visual_img" src="https://yorien.com/data/file/promotion/thumb-9df7d8f6a8ed83e94730c787371ce6aa_vgJZK9MP_2051ed40ba45776dd2645aed7d8cd6b37273936e_1000x500.jpg" alt="메인 이미지">
<div class="visual_text">
<h2>GUI DETAIL DESIGN</h2>
<p>
웹 화면의 구조를 이해하고<br>
디자인 요소를 정확하게 배치합니다.
</p>
<a href="#" class="btn">VIEW MORE</a>
</div>
</div>
</div>
<div class="wrap">
<h2 class="section_title">Skill Categories</h2>
<div class="card_wrap">
<div class="card">
<div class="img_box">
<img src="https://goyos.kr/img/category_design.png" alt="디자인">
</div>
<div class="card_text">
<h3>DESIGN</h3>
<p>Figma, Photoshop, Illustrator를 활용한 화면 디자인 영역입니다.</p>
<div class="tag_wrap">
<span class="tag">Figma</span>
<span class="tag">Photoshop</span>
<span class="tag">UI/UX</span>
</div>
</div>
</div>
<div class="card">
<div class="img_box">
<img src="https://goyos.kr/img/category_pub.png" alt="퍼블리싱">
</div>
<div class="card_text">
<h3>PUBLISHING</h3>
<p>HTML과 CSS를 사용하여 웹 페이지 구조와 스타일을 구현합니다.</p>
<div class="tag_wrap">
<span class="tag">HTML</span>
<span class="tag">CSS</span>
<span class="tag">Hover</span>
</div>
</div>
</div>
<div class="card">
<div class="img_box">
<img src="https://goyos.kr/img/category_dev.png" alt="개발">
</div>
<div class="card_text">
<h3>DEVELOPMENT</h3>
<p>웹 서비스 구현을 위한 기본 개발 구조를 이해합니다.</p>
<div class="tag_wrap">
<span class="tag">React</span>
<span class="tag">Git</span>
<span class="tag">Code</span>
</div>
</div>
</div>
</div>
</div>
<div class="wrap">
<div class="info_wrap">
<div class="info_box info_left">
<h3>About Class</h3>
<p>
GUI 상세디자인은 화면 구성, 여백, 정렬, 이미지 처리,
버튼 디자인 등을 종합적으로 다루는 과정입니다.
</p>
</div>
<div class="info_box info_right">
<h3>Design Point</h3>
<p>
전체 구조를 먼저 잡고, 그 다음 세부 스타일을 적용해야
안정적인 웹 페이지를 만들 수 있습니다.
</p>
</div>
</div>
</div>
<div class="footer">
COPYRIGHT 2026. CURSAMAN. ALL RIGHTS RESERVED.
</div>
<script>
gsap.registerPlugin(ScrollTrigger);
gsap.from(".header", {
y:-80,
autoAlpha:0,
duration:0.8,
ease:"power3.out"
});
gsap.from(".visual", {
y:50,
autoAlpha:0,
duration:1,
delay:0.2,
ease:"power3.out"
});
gsap.from(".visual_img", {
scale:1.15,
duration:1.5,
delay:0.3,
ease:"power3.out"
});
gsap.from(".visual_text h2", {
y:40,
autoAlpha:0,
duration:0.9,
delay:0.6,
ease:"power3.out"
});
gsap.from(".visual_text p", {
y:30,
autoAlpha:0,
duration:0.9,
delay:0.8,
ease:"power3.out"
});
gsap.from(".visual_text .btn", {
y:25,
autoAlpha:0,
duration:0.8,
delay:1,
ease:"power3.out"
});
gsap.from(".section_title", {
y:50,
autoAlpha:0,
duration:0.9,
ease:"power3.out",
scrollTrigger:{
trigger:".section_title",
start:"top bottom",
once:true
}
});
gsap.from(".card", {
y:80,
autoAlpha:0,
duration:0.9,
stagger:0.2,
ease:"power3.out",
clearProps:"transform",
scrollTrigger:{
trigger:".card_wrap",
start:"top bottom",
once:true
}
});
gsap.from(".info_box", {
y:80,
autoAlpha:0,
duration:0.9,
stagger:0.2,
ease:"power3.out",
clearProps:"transform",
scrollTrigger:{
trigger:".info_wrap",
start:"top bottom",
once:true
}
});
gsap.from(".footer", {
y:60,
autoAlpha:0,
duration:0.8,
ease:"power3.out",
scrollTrigger:{
trigger:".footer",
start:"top bottom",
once:true
}
});
window.addEventListener("load", function(){
ScrollTrigger.refresh();
});
</script>
</body>
</html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>GSAP Scroll Portfolio UI</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/ScrollTrigger.min.js"></script>
<style>
*{
margin:0;
padding:0;
box-sizing:border-box;
}
body{
font-family:Arial, sans-serif;
color:#222;
}
a{
text-decoration:none;
color:inherit;
}
.wrap{
width:1200px;
margin:0 auto;
}
/* header */
.header{
height:80px;
border-bottom:1px solid #ddd;
background:#fff;
}
.header .wrap{
height:80px;
display:flex;
justify-content:space-between;
align-items:center;
}
.logo{
font-size:28px;
font-weight:900;
}
.menu{
display:flex;
gap:45px;
}
.menu a{
font-size:16px;
font-weight:700;
transition:0.3s;
}
.menu a:hover{
color:#888;
}
/* visual */
.visual{
height:420px;
margin-top:40px;
position:relative;
overflow:hidden;
border-radius:20px;
}
.visual img{
width:100%;
height:100%;
object-fit:cover;
display:block;
}
.visual::after{
content:"";
position:absolute;
inset:0;
background:linear-gradient(
90deg,
rgba(0,0,0,0.65),
rgba(0,0,0,0.25),
rgba(0,0,0,0)
);
}
.visual_text{
position:absolute;
left:60px;
top:100px;
z-index:2;
color:#fff;
}
.visual_text h2{
font-size:46px;
margin-bottom:20px;
}
.visual_text p{
font-size:18px;
line-height:1.7;
margin-bottom:30px;
}
.btn{
display:inline-block;
padding:14px 32px;
background:#fff;
color:#111;
font-weight:700;
border-radius:30px;
transition:0.3s;
}
.btn:hover{
background:#111;
color:#fff;
}
/* section */
.section_title{
margin:90px 0 30px;
font-size:32px;
font-weight:900;
}
/* card */
.card_wrap{
display:grid;
grid-template-columns:repeat(3, 1fr);
gap:30px;
align-items:stretch;
}
.card{
width:100%;
min-height:430px;
border:1px solid #ddd;
background:#fff;
border-radius:18px;
overflow:hidden;
display:flex;
flex-direction:column;
transition:transform 0.4s, box-shadow 0.4s;
will-change:transform;
}
.card:hover{
transform:translateY(-10px);
box-shadow:0 20px 40px rgba(0,0,0,0.15);
}
.img_box{
width:100%;
height:260px;
flex-shrink:0;
overflow:hidden;
}
.img_box img{
width:100%;
height:100%;
object-fit:cover;
display:block;
transition:0.6s;
}
.card:hover .img_box img{
transform:scale(1.08);
}
.card_text{
padding:25px;
flex:1;
display:flex;
flex-direction:column;
}
.card_text h3{
font-size:24px;
margin-bottom:12px;
}
.card_text p{
font-size:15px;
line-height:1.6;
color:#555;
min-height:48px;
}
.tag_wrap{
display:flex;
flex-wrap:wrap;
gap:8px;
margin-top:auto;
padding-top:18px;
}
.tag{
padding:7px 12px;
border:1px solid #333;
border-radius:20px;
font-size:13px;
font-weight:700;
}
/* info */
.info_wrap{
margin-top:90px;
display:grid;
grid-template-columns:repeat(2, 1fr);
gap:40px;
}
.info_box{
min-height:260px;
padding:40px;
border-radius:18px;
}
.info_left{
background:#eee;
}
.info_right{
background:#222;
color:#fff;
}
.info_box h3{
font-size:28px;
margin-bottom:20px;
}
.info_box p{
line-height:1.7;
}
/* footer */
.footer{
margin-top:90px;
height:100px;
background:#111;
color:#fff;
display:flex;
justify-content:center;
align-items:center;
}
</style>
</head>
<body>
<div class="header">
<div class="wrap">
<div class="logo">LOGO</div>
<div class="menu">
<a href="#">CLASS</a>
<a href="#">GALLERY</a>
<a href="#">TOOLS</a>
<a href="#">NEWS</a>
</div>
</div>
</div>
<div class="wrap">
<div class="visual">
<img class="visual_img" src="https://yorien.com/data/file/promotion/thumb-9df7d8f6a8ed83e94730c787371ce6aa_vgJZK9MP_2051ed40ba45776dd2645aed7d8cd6b37273936e_1000x500.jpg" alt="메인 이미지">
<div class="visual_text">
<h2>GUI DETAIL DESIGN</h2>
<p>
웹 화면의 구조를 이해하고<br>
디자인 요소를 정확하게 배치합니다.
</p>
<a href="#" class="btn">VIEW MORE</a>
</div>
</div>
</div>
<div class="wrap">
<h2 class="section_title">Skill Categories</h2>
<div class="card_wrap">
<div class="card">
<div class="img_box">
<img src="https://goyos.kr/img/category_design.png" alt="디자인">
</div>
<div class="card_text">
<h3>DESIGN</h3>
<p>Figma, Photoshop, Illustrator를 활용한 화면 디자인 영역입니다.</p>
<div class="tag_wrap">
<span class="tag">Figma</span>
<span class="tag">Photoshop</span>
<span class="tag">UI/UX</span>
</div>
</div>
</div>
<div class="card">
<div class="img_box">
<img src="https://goyos.kr/img/category_pub.png" alt="퍼블리싱">
</div>
<div class="card_text">
<h3>PUBLISHING</h3>
<p>HTML과 CSS를 사용하여 웹 페이지 구조와 스타일을 구현합니다.</p>
<div class="tag_wrap">
<span class="tag">HTML</span>
<span class="tag">CSS</span>
<span class="tag">Hover</span>
</div>
</div>
</div>
<div class="card">
<div class="img_box">
<img src="https://goyos.kr/img/category_dev.png" alt="개발">
</div>
<div class="card_text">
<h3>DEVELOPMENT</h3>
<p>웹 서비스 구현을 위한 기본 개발 구조를 이해합니다.</p>
<div class="tag_wrap">
<span class="tag">React</span>
<span class="tag">Git</span>
<span class="tag">Code</span>
</div>
</div>
</div>
</div>
</div>
<div class="wrap">
<div class="info_wrap">
<div class="info_box info_left">
<h3>About Class</h3>
<p>
GUI 상세디자인은 화면 구성, 여백, 정렬, 이미지 처리,
버튼 디자인 등을 종합적으로 다루는 과정입니다.
</p>
</div>
<div class="info_box info_right">
<h3>Design Point</h3>
<p>
전체 구조를 먼저 잡고, 그 다음 세부 스타일을 적용해야
안정적인 웹 페이지를 만들 수 있습니다.
</p>
</div>
</div>
</div>
<div class="footer">
COPYRIGHT 2026. CURSAMAN. ALL RIGHTS RESERVED.
</div>
<script>
gsap.registerPlugin(ScrollTrigger);
gsap.from(".header", {
y:-80,
autoAlpha:0,
duration:0.8,
ease:"power3.out"
});
gsap.from(".visual", {
y:50,
autoAlpha:0,
duration:1,
delay:0.2,
ease:"power3.out"
});
gsap.from(".visual_img", {
scale:1.15,
duration:1.5,
delay:0.3,
ease:"power3.out"
});
gsap.from(".visual_text h2", {
y:40,
autoAlpha:0,
duration:0.9,
delay:0.6,
ease:"power3.out"
});
gsap.from(".visual_text p", {
y:30,
autoAlpha:0,
duration:0.9,
delay:0.8,
ease:"power3.out"
});
gsap.from(".visual_text .btn", {
y:25,
autoAlpha:0,
duration:0.8,
delay:1,
ease:"power3.out"
});
gsap.from(".section_title", {
y:50,
autoAlpha:0,
duration:0.9,
ease:"power3.out",
scrollTrigger:{
trigger:".section_title",
start:"top bottom",
once:true
}
});
gsap.from(".card", {
y:80,
autoAlpha:0,
duration:0.9,
stagger:0.2,
ease:"power3.out",
clearProps:"transform",
scrollTrigger:{
trigger:".card_wrap",
start:"top bottom",
once:true
}
});
gsap.from(".info_box", {
y:80,
autoAlpha:0,
duration:0.9,
stagger:0.2,
ease:"power3.out",
clearProps:"transform",
scrollTrigger:{
trigger:".info_wrap",
start:"top bottom",
once:true
}
});
gsap.from(".footer", {
y:60,
autoAlpha:0,
duration:0.8,
ease:"power3.out",
scrollTrigger:{
trigger:".footer",
start:"top bottom",
once:true
}
});
window.addEventListener("load", function(){
ScrollTrigger.refresh();
});
</script>
</body>
</html>
#스타일시트 에니메이션 효과 최종