<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>이미지 뷰어</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500&display=swap" rel="stylesheet">
<style>
* { font-family: 'DM Sans', sans-serif; }
body { background-color: #ffffff; color: #1a1a1a; }
.main-subject { font-size: 0.75rem; font-weight: 500; letter-spacing: 0.15em; text-transform: uppercase; color: #999; margin-bottom: 2rem; }
.sub-tag { font-size: 0.7rem; font-weight: 500; letter-spacing: 0.12em; text-transform: uppercase; color: #bbb; margin-bottom: 0.5rem; }
.pick-dropdown {
appearance: none; -webkit-appearance: none; border: 1px solid #e0e0e0; border-radius: 6px;
padding: 0.55rem 2.2rem 0.55rem 0.9rem; font-size: 0.875rem; color: #333; background-color: #fff;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
background-repeat: no-repeat; background-position: right 0.75rem center; cursor: pointer; transition: border-color 0.2s; min-width: 200px;
}
.thumb-container { width: 220px; height: 500px; overflow-y: auto; border: 1px solid #e0e0e0; border-radius: 8px; padding: 10px; background: #fafafa; }
.thumb-container img { width: 100%; border-radius: 5px; margin-bottom: 10px; cursor: pointer; display: block; transition: 0.2s; border: 2px solid transparent; }
.thumb-container img:hover { opacity: 0.85; transform: scale(1.02); }
.thumb-container img.active-item { border-color: #1a1a1a; }
.vertical-line { width: 1px; background: #ececec; margin: 0 3rem; }
.viewer-frame {
width: 500px;
height: 500px;
border: 1px dashed #ddd;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
background: #fafafa;
overflow: hidden;
}
.viewer-frame .info-text { font-size: 0.8rem; color: #ccc; }
#mainView {
width: 100%;
height: 100%;
object-fit: contain;
border-radius: 11px;
display: none;
}
</style>
</head>
<body>
<div class="container py-5">
<p class="main-subject">이미지 뷰어</p>
<div class="d-flex align-items-start justify-content-center">
<div>
<p class="sub-tag">옵션 선택</p>
<select class="pick-dropdown" xxonchange="displayImage(this)">
<option value="">이미지 선택</option>
<%
for(int j=11; j<=20; j++) {
out.println("<option value='"+request.getContextPath()+"/images/"+j+".jpg'>"+j+".jpg</option>");
}
%>
</select>
<div class="mt-4"></div>
<p class="sub-tag">리스트 (스크롤)</p>
<div class="thumb-container">
<%
for(int j=11; j<=20; j++) {
out.println("<img src='"+request.getContextPath()+"/images/"+j+".jpg' xxonclick="+"displayImage(this)"+">");
}
%>
</div>
</div>
<div class="vertical-line align-self-stretch"></div>
<div>
<p class="sub-tag">크게 보기</p>
<div class="viewer-frame">
<span class="info-text" id="guideText">사진을 선택하면 크게 나타납니다.</span>
<img src="" id="mainView">
</div>
</div>
</div>
</div>
<script>
'use strict'
function displayImage(target) {
let source = target.src ? target.src : target.value;
if (source && source !== "") {
const viewElement = document.querySelector("#mainView");
const guideElement = document.querySelector("#guideText");
viewElement.src = source;
viewElement.style.display = "block";
guideElement.style.display = "none";
document.querySelectorAll('.thumb-container img').forEach(unit => unit.classList.remove('active-item'));
if (target.tagName === 'IMG') target.classList.add('active-item');
}
}
</script>
</body>
</html>
첫댓글 콤보상자는 좋습니다.
아래쪽의 리스트를 레이어박스로 처리한부분도 수행되면 좋겠네요. 수고하셨습니다.