일단 해보는 코딩/Project

[3일차] MBTI 테스트 프로그램만들기

eun_zoey2 2023. 5. 10. 23:21
728x90
메인 페이지 구조 만들기

 

index.html 

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>내 안에 숨어있는 직업캐 찾기!</title>
  <link rel="icon" href="favicon.png">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reset-css@5.0.1/reset.min.css" /> 
  <link rel="stylesheet" as="style" crossorigin href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.6/dist/web/variable/pretendardvariable-dynamic-subset.css" />
  <link rel="stylesheet" href="./css/common.css">
  <link rel="stylesheet" href="./css/home.css">
  <script defer src="./js/share.js"></script>
</head>
<body>
  <h2 class="page-subtitle">
    나 95년생 재은쓰
  </h2>
  <h1 class="page-title">내 안에 숨어있는<br>
      직업캐 찾기!</h1>
      <img src="./images/main_character.png" alt="캐릭터" class="character">
      <a href="/questions.html" class="btn btn-orange">
        본캐 찾으러 GO! 
      </a> 
      <div class="btn btn-green btn-small share-or-copy">
        주변에 알리기
      </div>
</body>
</html>

home.css 

body{
  background-color: #f6fcff;
  background-image: url("../images/main_bg.jpg");
  background-position: top center;
  background-repeat: no-repeat;
}
.character {
  width: 100%;
  max-width: 364px;
  margin-left: auto;
  margin-right: auto;
  margin-bottom: 40px;
}

common.css

- 여러 번 사용하는 코드들을 따로 만들기

- css 를 활용하여 애니메이션 효과주기

body {
  font-family: "Pretendard Variable",sans-serif;
  /* 줄바꿈되는 현상을 막아줌*/
  word-break: keep-all;
  padding-top: 80px;
  padding-bottom: 80px;
}
img {
  /* 인라인요소를 블록요소로 변환 */
  display: block; 
}
.page-title {
  font-size: 50px;
  font-weight: 800;
  line-height: 1.3;
  color: #13b491; 
  text-align: center;
  margin-bottom: 20px;
}
.page-subtitle {
  width: 240px;
  height: 50px;
  border: 5px solid #ffa32d;
  border-radius: 30px;
  display: flex;
  justify-content: center; /*수평정렬 */
  align-items: center;      /*수직정렬 */
  font-size: 24px;
  font-weight: 700;
  color: #ffa32d;
  margin-left: auto;    /* 가운데 정렬 */
  margin-right: auto;     /* 가운데 정렬 */
  margin-bottom: 20px;
}
.btn {
  max-width: 500px;
  height: 100px;
  display: flex;    /* 블록요소로 바꾸어줌 */
  justify-content: center; /*수평정렬 */
  align-items: center;      /*수직정렬 */
  font-size: 50px;
  font-weight: 700;
  text-decoration: none;
  cursor: pointer;
  border-radius: 20px;
  margin-bottom: 35px;
  margin-left: auto;
  margin-right: auto;
  /* 전환효과(에니메이션효과) */
  transition: 1s;
}
.btn-orange {
  background-color: #ffa32d;
  box-shadow: 0 14px 0 #e66000;
  color: #ffffff;
}
 /* 클릭했을 때 그림자가 줄어들면서 눌리게보이는 효과 */
.btn-orange:active {
  box-shadow: 0 4px 0 #e66000;
  transform: translateY(10px);
}
.btn-green {
  background-color: #32bfa1;
  box-shadow: 0 14px 0 #299a82;
  color: #ffffff;
}
.btn-green:active {
  box-shadow: 0 4px 0 #299a82;
  transform: translateY(10px);
}
.btn-gray {
  background-color: #f2f4f6;
  box-shadow: 0 14px 0 #dfe1e2;
  color: #444444;
}
.btn-gray:active {
  box-shadow: 0 4px 0 #dfe1e2;
  transform: translateY(10px);
}
.btn-small {
  max-width: 350px;
  height: 70px;
  font-size: 26px;
  margin-bottom: 30px;
}

share.js

- 공유 기능 추가하기

const btnEl = document.querySelector('.share-or-copy')

// 각 지원 기능 확인!
const isSupportedShare = !!navigator?.share
const isSupportedClipboard = !!navigator?.clipboard
const isSupportedClipboardCommand = document.queryCommandSupported?.('copy')

// 공유 및 복사 기능 상태 체크!
const healthEl = document.createElement('div')
healthEl.style.display = 'none'
healthEl.innerHTML = `s: ${isSupportedShare}, c: ${isSupportedClipboard}, cc: ${isSupportedClipboardCommand}`
document.body.append(healthEl)

// 모바일 브라우저 내장 공유 기능!
async function startNativeShare() {
  await navigator.share({
    title: '내 안에 숨어있는 직업캐 찾기!',
    text: '누구나 찰떡인 직업이 있어요! 내 안에 숨어있는 직업캐를 찾아보세요!',
    url: location.href // 현재 페이지 주소!
  })
}

// 주소 복사 기능!
async function copyToClipboard() {
  // 레거시 우선!
  if (isSupportedClipboardCommand) {
    const textarea = document.createElement('textarea')
    textarea.style.position = 'fixed'
    textarea.style.top = 0
    textarea.style.left = 0
    textarea.value = location.href

    document.body.appendChild(textarea)
    textarea.focus()
    textarea.select()

    document.execCommand('copy')
    document.body.removeChild(textarea)
    alert('링크를 복사했어요 ><')
    return
  }
  if (isSupportedClipboard) {
    await navigator.clipboard.writeText(location.href)
    alert('링크를 복사했어요 ><')
  }
}

// 모든 기능이 없는 경우 공유 버튼 제거!
if (!isSupportedShare && !isSupportedClipboard && !isSupportedClipboardCommand) {
  btnEl.style.display = 'none'
}

// 공유 버튼을 클릭했을 떄!
btnEl?.addEventListener('click', async function () {
  if (isSupportedShare) {
    await startNativeShare()
    return
  }
  if (isSupportedClipboard || isSupportedClipboardCommand) {
    await copyToClipboard()
  }
})