반응형

TypeScript는 JavaScript의 상위 집합 언어이기 때문에, 기본적인 문법은 JavaScript와 비슷합니다. 하지만 TypeScript는 정적 타입을 지원하기 때문에, 변수의 자료형을 미리 선언해야 합니다. 또한, 클래스, 인터페이스, 모듈 등의 기능을 지원합니다. 아래는 TypeScript의 기본 문법에 대해 설명합니다.

변수 선언
변수를 선언할 때는 let 또는 const 키워드를 사용합니다. let은 재할당이 가능한 변수를 선언할 때 사용하고, const는 상수를 선언할 때 사용합니다. 변수의 자료형은 : 뒤에 명시합니다.

 

let message: string = "Hello, world!";
const PI: number = 3.14;

함수 선언
함수를 선언할 때도 변수와 마찬가지로 : 뒤에 반환값의 자료형을 명시합니다.

 

function add(x: number, y: number): number {
  return x + y;
}

클래스 선언
클래스는 class 키워드를 사용합니다. 클래스 내부에는 속성과 메서드를 정의할 수 있습니다. 클래스의 속성과 메서드는 접근 제한자(public, private, protected)를 사용하여 외부에서 접근할 수 있는 범위를 지정할 수 있습니다.

 

class Person {
  private name: string;
  public age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  public sayHello(): void {
    console.log(`Hello, my name is ${this.name}. I'm ${this.age} years old.`);
  }
}

인터페이스 선언
인터페이스는 interface 키워드를 사용합니다. 인터페이스는 클래스나 객체가 가져야 하는 속성과 메서드를 정의합니다.

 

interface Animal {
  name: string;
  age: number;
  speak(): void;
}

class Dog implements Animal {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  public speak(): void {
    console.log("Bark!");
  }
}

모듈 선언
모듈은 코드를 분리하여 필요한 모듈만 가져와 사용할 수 있도록 합니다. 모듈을 선언할 때는 export 키워드를 사용합니다.

export function add(x: number, y: number): number {
  return x + y;
}

이렇게 선언된 모듈은 다른 파일에서 import 키워드를 사용하여 가져와 사용할 수 있습니다.

 

import { add } from "./math";

console.log(add(1, 2)); // 3
반응형
반응형

 

 

이전 버전에서 무료 버전인 IntelliJ Community 버전을 설치 해보았다.

Community 버전과 Ultimate 버전은 다음과 같이 기능 차이가 있다.

 

 


기능이 풍부한 Ultimate 버전을 사용하려면 유료 라이센스를 구입해야 한다.

다만 아직까진 학생들에게는 무료로 사용할 수 있는 라이센스를 제공하고 있다.

학생 인증을 통하여 무료로 사용할 수 있다고 하여 학생 인증방법을 포스팅 해보려 한다.

 

 

 

 

1. 인증 페이지 접속

▶ 1. JetBrains 사이트 접속

※ Jet Brains의 학생 인증 관련 계속 바뀌고 있고, 앞으로도 UI는 바뀔 수 있으니 다음 url로 직접 접속 하여 인증 하기 클릭 하도록 하자.

www.jetbrains.com/community/education/#students

 

 - 하단으로 내려가 "Apply now" 클릭

 

 

 

▶ 2. 정보 입력 및 신청

 - 인증을 위한 정보를 입력한다.

 - Email address에 학교 이메일 계정 입력 (ex id@ssu.ac.kr)

 

 

 - 다음과 같은 화면과 함께 학교 이메일주소로 인증 메일을 받아 볼 수 있다.

 

 

 

2. 학생 인증 처리

▶ 1. 학교 이메일 확인

 - 입력한 학교 이메일 주소로 로그인하여 인증메일을 확인 한다.

 - "Confirm Request" 클릭 

 

 

▶ 2. JetBrains 최종 인증

 - "JetBrains Account" 사이트 창이 열리고, 맨 아래로 스크롤 후 활성화된 "I Accept"를 클릭한다.

 

 

 

 - 회원 가입이 되어있지 않은 경우 우측 하단에 이메일을 입력 후 "Sign Up"을 클릭하여 회원 가입을 진행 한다.

 

 

 

- 회원 가입 완료 문구를 확인 후 가입한 이메일을 확인해 보자.

 

 

- 이메일 내용중 "Confirm your account" 클릭

 

 

 - 나머지 정보를 입력하여 회원 가입을 마무리 한다.

 

 

 - 이후 로그인 하여 확인 해 보면 학생 인증이 완료, 라이센스가 발급 된 것을 확인할 수 있다.

 

 

3. 다운로드 및 실행

▶ 1. IntelliJ IDEA 다운로드

 - 다운로드 사이트 접속

  https://www.jetbrains.com/idea/download/#section=windows

 - Ultimate 버전 다운로드 하여 설치 한다. (또는 Zip 파일로 다운로드하여 압축 해제 한다.)

 

 

 - 설치 방법은 다음 포스팅 참고

  https://goddaehee.tistory.com/195

 

▶ 2. 최종 실행 및 인증

 - 설치 또는 압축 해제 하여 IntelliJ를 실행 하자.

 - 최초 인증 계정 정보만 입력하면 인증이 완료 된다.

 

 

 

이로써 인텔리제이 학생 인증이 완료 되었다.

 

혹시라도 학교 E-mail에서 Jetbrains의 자동 메일이 필터 되어 걸러진다면, 

GitHub 학생인증이 되어있다면, 연동하여 인텔리 제이 학생인증을 완료할 수도 있다.

 

반응형
반응형

오늘은 회원가입이나 쇼핑몰 사이트를 만들 때 주로 필수 적인 

다음 카카오에서 제공하는 API를 이용하여 주소를 등록해보려고 한다. 

 


1. 우편번호 사이트로 이동

 

https://postcode.map.daum.net/guide

 

Daum 우편번호 서비스

우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다.

postcode.map.daum.net

🤬물론 도로명개발자 센터에서 제공하는 API가 있지만 실제로 사용해보면 🤬

다음 주소가 훨씬 많이 쓰이고 쓰기가 편하다.

 

카카오 주소 제공

 


2. 사용법

 

JS API의 최신화는 업데이트시마다 자동으로 되고 있습니다.
JS API호출시 도메인 뒤에 특정 파라미터의 경우엔 가이드페이지(아래 기본사용법)에서 정의하고 있는 특정 파라미터 외엔 허용하지 않습니다.
이외 더미 파라미터와 같은 데이터를 붙혀서 로딩하실 경우, 스크립트 호출이 거부 될수 있으니 삭제 부탁드립니다.
ex) ?_=XXXXXX, ?t=5469821879 등등

 

- 허용하는 파라미터
1. 통합로딩방식 : 없음
2. (구)로딩방식 : autoload=false
ㄴ ex) https://ssl.daumcdn.net/dmaps/map_js_init/postcode.v2.js?autoload=false
ㄴ ex) http://dmaps.daum.net/map_js_init/postcode.v2.js?autoload=false

 

한번 읽어 주자 

 

2-1 통합 로딩방식

 

<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>

위와 같은 로딩 url을 서비스할 view 파일 (PHP, JSP)파일에 body 하단 부분에 넣어주자

 

 

2-2 이제 어떤 방식으로 할지 고르자

 

팝업을 이용하여 도로명 주소와 지번 주소 모두 보여주기

기본적인 팝업을 이용하여 사용자가 선택한 주소의 도로명 주소와 지번 주소를 모두 보여주는 방식입니다. 아래 '우편번호 찾기' 버튼을 클릭해서 바로 확인해보세요. (몇몇 Webview기반 브라우저의 window.open 미대응으로 인하여, Webview기반 서비스에 적용시 embed()를 이용한 레이어모드를 추천합니다.)

 

   

사용자가 선택한 값 이용하기

우편번호와 주소필드에 사용자가 선택한 주소 값을 채워 넣는 방식입니다.
단, 사용자가 선택한 값을 이용할 경우 영문주소와 정확히 매칭되지 않을 수 있습니다. 영문주소는 기본주소(address)에 해당하는 영문 주소가 내려갑니다. 예제 코드보기

 

 

iframe을 이용하여 레이어 띄우기

모바일웹에서는 팝업을 띄우는게 부담스러울 수도 있으니, 아래 코드와 같이 특정 element에 크기를 지정하여 iframe으로 끼워넣는 방식을 이용할 수도 있습니다. 아래 '우편번호 찾기' 버튼을 클릭해서 바로 확인해보세요.
(현재 iOS 8.x 이상, Safari, webview 브라우저에서 position:fixed, inner-scroll 이용시 가상키보드 터치 불량 및 스크롤이 멈추는 현상이 간혈적으로 발생하고 있습니다. 이점 참고해 주시기 바라며, 모바일 환경에서는 가급적 아래의 "페이지에 끼워넣기" 예제를 참고하시는 것을 추천드립니다.)
예제 코드보기

 

 

iframe을 이용하여 페이지에 끼워 넣기

화면내에 끼워넣는 방식일 경우, 내부 스크롤이 거슬릴수도 있습니다. 이때 onresize 속성을 추가해서 iframe 높이를 조절하면 스크롤이 생기지 않습니다. 아래 '우편번호 찾기' 버튼을 클릭해서 바로 확인해보세요. 예제 코드보기

 

 

주소를 선택하면 지도도 함께 보여주기

다음 지도 API를 함께 활용하여 선택한 주소에 대한 좌표를 가져와서 지도에 표시하는 예제입니다. 아래 '주소 검색' 버튼을 클릭해서 바로 확인해보세요.
다음 지도 API를 이용하시려면 https://developers.kakao.com에서 API Key를 발급받으셔야 합니다. 예제 코드보기

 

 

2-3 골랏다면 적용 해보자!

 

나는 제일 깔끔한

사용자가 선택한 값 이용하기

을 사용하기로 했다 

 

<input type="text" id="sample6_postcode" placeholder="우편번호">
<input type="button" onclick="sample6_execDaumPostcode()" value="우편번호 찾기"><br>
<input type="text" id="sample6_address" placeholder="주소"><br>
<input type="text" id="sample6_detailAddress" placeholder="상세주소">
<input type="text" id="sample6_extraAddress" placeholder="참고항목">

<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
    function sample6_execDaumPostcode() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

                // 각 주소의 노출 규칙에 따라 주소를 조합한다.
                // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
                var addr = ''; // 주소 변수
                var extraAddr = ''; // 참고항목 변수

                //사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
                if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
                    addr = data.roadAddress;
                } else { // 사용자가 지번 주소를 선택했을 경우(J)
                    addr = data.jibunAddress;
                }

                // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
                if(data.userSelectedType === 'R'){
                    // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                    // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
                    if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                        extraAddr += data.bname;
                    }
                    // 건물명이 있고, 공동주택일 경우 추가한다.
                    if(data.buildingName !== '' && data.apartment === 'Y'){
                        extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                    }
                    // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
                    if(extraAddr !== ''){
                        extraAddr = ' (' + extraAddr + ')';
                    }
                    // 조합된 참고항목을 해당 필드에 넣는다.
                    document.getElementById("sample6_extraAddress").value = extraAddr;
                
                } else {
                    document.getElementById("sample6_extraAddress").value = '';
                }

                // 우편번호와 주소 정보를 해당 필드에 넣는다.
                document.getElementById('sample6_postcode').value = data.zonecode;
                document.getElementById("sample6_address").value = addr;
                // 커서를 상세주소 필드로 이동한다.
                document.getElementById("sample6_detailAddress").focus();
            }
        }).open();
    }
</script>

카카오는 참 친절하다. 

 

혹시 모를까 변수명까지 다 정해주고 html도 다 붙혀서 준다. 

이거 그대로 복사해서 html은 html대로 

js는 js대로 붙혀 넣어 주면 끝난다. 

 

정말 간단하지 않을가.. 

 

😻I Love kakao 😻

 

 


https://github.com/MoonSeokHyun/spring/blob/master/MyWeb/src/main/webapp/WEB-INF/views/user/userJoin.jsp

 

GitHub - MoonSeokHyun/spring

Contribute to MoonSeokHyun/spring development by creating an account on GitHub.

github.com

 

적용한 코드이다. 한번 참조 해보길~

반응형

'Web 개발' 카테고리의 다른 글

TypeScript 기본 문법(타입스크립트)  (0) 2023.04.15
인텔리제이 얼티메이트 학생 인증 무료사용 방법  (0) 2022.06.01
(JQuery) 선택자 및 속성  (0) 2022.02.04
(JQuery) 선택자  (0) 2022.02.04
(JQuery ) 적용 방법  (0) 2022.02.04
반응형

html 코드

 

결과 값

반응형
반응형

html  코드
html 화면
제이쿼리 코드

 

제이쿼리는 간결하면서도 뭔가 헤깔린다.

반응형
반응형

https://jquery.com/ 

 

jQuery

What is jQuery? jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers.

jquery.com

제이 쿼리를 다운로드 받는다. 

 

src를 이용하게 import 시키면 완료 

 

 

반응형
반응형

맥북 에어 m1칩셋을 하나 구매했다. 

그래서 개발환경 세팅을 해보려고 했다. 

 

이클립스

 

우선 이클립스는 m1버전이 2022-03버전으로 새로 나왔기 때문에 

인텔 예뮬을 쓰는것보다는 훨씬 괜찮았다. 

스프링 sts3를 깔고 레거시프로젝트까지해서 프로젝트를 올리니 생각보다 잘 구동이 되었다. 

하지만 호환성문제등을 내가 하는것정도에서는 나오지않았다. 

 

도커 

 

도커도 애플실리콘 기반의 프로그램이 릴리즈 되면서 빠른 호환성을 느낄 수있엇다. 

오라클 11g버전을 받고 시스템 계정 등을 생성하는것 까지 문제가 되지 않았다. 

 

sqldeveloper 

 

sqldeveloper는 인텔 예뮬로 실행을 해야 했다 .

jdk 11 m1버전을 설치하고 환경변수 까지 설정 한뒤 

sqldeveloper를 세팅을 잡으려고 했지만 실패했다.. 

아직까지는 호환성문제가 있는 듯 했다. 

그래서 대체제인 mysql로 대안을 찾았다. 

 

mysql 은 호환성에 대해서 전혀 문제가 되지않았다.

워크벤치를 설치하여 기본적인 테이블 및 카페24에서 호스팅서버로 올리니 정상적으로 작동이 되었다. 

 

톰캣 9.0 버전 

 

인텔맥과 상관없이 전혀 사용하는데 문제가 없었다. 

 

전반적인 평 

 

나는 아직 학원 수준의 개발을 한다. 

스프링으로 간단한 게시판만들기 정도 윈도우를 쓰면서 맥을 활용하여 개발을 하고 싶어 기존에 있던 인텔맥을 형에게 처분한 뒤 

m1칩셋의 맥북에어를 구매하였는데. 

 

장점 1

 

빠른 구동속도 

현재 11세대 i7 노트북을 가지고 개발을 하여도 전혀 뒤쳐지지 않는 속도가 나왔다 오히려 서버구동시 속도는 m1이 훨씬 빨랏다. 

 

장점2 

 

발열

 

과연 발열이 존재하긴 할까...? 

 

장점3 

 

베터리 타임

 

약 15시간 정도 쓰는거 같다 이건 미쳤다. 

 

장점4

 

가성비 갑 이건 사라 두번사라 디자인도 이쁘다.

 

굳이 단점으로 뽑은것 

 

호환성

 

아직까지 jdk등 애플실리콘에서 m1칩셋이 나온뒤로 프로그램사들이 발빠른 패치로 인해 사용시 전혀 문제가 되지 않았으나

오라클은 맥에서 사용하기가 학원생의 실무 경험으로는 조금 어려웠다. 

 

 

 

반응형
반응형

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>Document</title>

    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.14.0/css/all.css" integrity="sha384-HzLeBuhoNPvSl5KYnjx0BT+WB0QEEqLprO+NBkkk5gbc67FTaL7XIGa2w1L0Xbgc" crossorigin="anonymous">




    <!-- custom js -->

    <script src="./app.js" defer></script>

    <!-- custom css -->

    <link rel="stylesheet" href="./main.css">

</head>
<body>

   
    <div class="wrapper">
        <section class="todo-template">
            <h1 class="app-title">일정 관리</h1>
            <div class="content">
                <form class="todo-insert">
                    <input type="text" id="todo-text" placeholder="할 일을 입력하세요." autocomplete="off">
                    <i id="add" class="far fa-plus-square"></i>
                </form>
                <ul class="todo-list">

                   
                </ul>
            </div>
        </section>
    </div>
   
</body>
</html>

 

CSS 코드

 

body {
    background: skyblue;
    position: relative;
    width: 100%;
}

.wrapper{
    width: 400px;
    height: 400px;
    background: white;
    border-radius: 10px;
    margin : 100px auto;
    box-shadow: 5px 5px 5px 5px gray;
    overflow: hidden;
}

h1{
    text-align: center;
    background: #123451;
    margin: 0;
    padding: 10px;
    color: white;
}

.todo-insert{
    display: flex;
    position: relative;
}

.todo-insert input{
    width: 85%;
    height: 35px;
    background: wheat;
    border: 0px;
    margin-top: 5px;
    margin-left: 5px;
    box-sizing: border-box;
    border-radius: 5px;
}

.todo-insert i{
    font-size: 36px;
    text-align: center;
    width: 9%;
    position: absolute;
    left: 353px;
    margin-top: 5px;
}

.todo-insert i:hover{
    background: rgb(204, 203, 203);
}
ul{
    list-style: none;  
    padding-left: 0px;
   
}

li{
    padding: 5px;
}

li:nth-child(2n-1){
    background: lightgray;
}

.btn-outline-secondary {
    float: right;
}

.text_line {
    text-decoration:line-through;
}


JS코드



const $add_todo = document.querySelector('#todo-text');
const addbtn = document.querySelector('#add');
const $list = document.querySelector('.todo-list')

let cnt =1;



addbtn.addEventListener('click', function(){
    if($add_todo.value === ""){
        alert('할 일을 입력해주세요.');
    }else{
        const $li = document.createElement('li');
        $li.setAttribute("class","list-group-item");
        $li.setAttribute("id", "li"+cnt);
        $li.innerHTML = "<input type = 'checkbox' class ='checkbox'>";
        $li.innerHTML += $add_todo.value;
        $li.innerHTML += "&nbsp <button  class='btn btn-outline-secondary' type='button' onclick='remove("+cnt+")'>삭제</button>";
        $li.innerHTML += "&nbsp <button  class='btn btn-outline-secondary' type='button' onclick='correction("+cnt+")'>수정</button> <br>";
        $list.appendChild($li);
        $add_todo.value = "";
    }

});

function remove(cnt){
    let result = confirm('정말삭제하시겠습니까?');
    if(result){
        const li = document.getElementById('li'+cnt);
        $list.removeChild(li);
    }else{
        return;
    }
   
   
}

function correction(cnt){
    const li = document.getElementById('li'+ cnt);
    li.innerHTML = '<form><input type="text" id="corr-text"> <button type="button"id="corr-btn"  onclick="corr()">확인 </button><br> <form>';
    const $btn = document.querySelector('button');

    console.log(document.querySelector('#corr-text').value);
};

function corr(){
    const $li = document.createElement('li');
    const $corr2 = document.querySelector('#corr-text');
    $li.setAttribute("class","list-group-item");
    $li.setAttribute("id", "li"+cnt);
    $li.innerHTML = "<input type = 'checkbox' class ='checkbox' onclick ='abc()'>";
    $li.innerHTML += $corr2.value;
    $li.innerHTML += "&nbsp <button  class='btn btn-outline-secondary' type='button' onclick='remove("+cnt+")'>삭제</button>";
    $li.innerHTML += "&nbsp <button  class='btn btn-outline-secondary' type='button' onclick='correction("+cnt+")'>수정</button> <br>";
    $list.appendChild($li);
    const li = document.getElementById('li'+cnt);
    $list.removeChild(li);
}



const $check = document.querySelector('.checkbox');
 
완성본
 
반응형
반응형

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>UP & DOWN 게임</title>

    <!-- reset.css -->

    <!-- custom css -->
    <link rel="stylesheet" href="./main.css">

    <!-- custom js -->
    <script src="./app.js" defer></script>

</head>
<body>

    <div class="wrapper">
        <section class="main">
            <h1 class="main-title">신나는 UP & DOWN 게임~!</h1>
            <article class="number-wrapper">
                <h2>
                    <em id="begin">1</em>부터 <em id="end">100</em>사이의 숫자를 입력하세요.
                </h2>
                <div id="numbers"></div>
            </article>
        </section>

        <aside class="result">
            <div id="up">UP!</div>
            <div id="down">DOWN!</div>
        </aside>

        <div id="finish">Congratulation!</div>
    </div>
   
</body>
</html>

 

 

 

js 코드

//게임에 필요한 데이터 객체
const gameData = {
    secret : Math.floor(Math.random()*100) + 1,
    answer : null, //사용자가 클릭한 숫자
    min : 1,
    max : 100
};

//숫자 아이콘 생성 함수
function makeNumberIcons() {

    //id=numbers 태그 안에다가 숫자 아이콘을 배치해 주세요.
    //숫자 아이콘의 개수는 객체의 min, max에 따라 달라집니다.
    //숫자 아이콘은 div태그이고 클래스 이름이 icon입니다.
    //리턴값은 id=numbers 태그 요소입니다.

    const $numbers = document.getElementById('numbers');
    const $frag = document.createDocumentFragment();

    for(let i=gameData.min; i<=gameData.max; i++) {
        const $icon = document.createElement('div');
        $icon.classList.add('icon');
        $icon.textContent = i;
        $frag.appendChild($icon);
    }
    $numbers.appendChild($frag);
    return $numbers;
}

//아이콘 전체 삭제 함수 정의
function clearNumberIcons($numbers) {
    for(let $icon of [...$numbers.children]) {
        $numbers.removeChild($icon);
    }
}

//up & down 애니메이션을 작동시킬 클래스 추가/제거 함수 정의
function executeUpDownAnimation(isUp) {
    const ANI_CLASS_NAME = 'selected';
    document.getElementById('up').classList.toggle(ANI_CLASS_NAME, isUp);
    document.getElementById('down').classList.toggle(ANI_CLASS_NAME, !isUp);
}

//정답을 맞췄을 때 처리를 수행할 함수 정의
function processCorrect($target) {
    //축하메세지 박스를 나타내게 하는 코드
    const $finish = document.getElementById('finish');
    $finish.classList.add('show');

    //정답 아이콘을 움직이게 하는 코드
    $target.setAttribute('id', 'move');
}

//정답을 판별해 주는 함수 정의
function checkAnswer($numbers, $target) {
    //객체에서 정답과 사용자의 선택값 가져오기
    const {secret, answer} = gameData;
    console.log(secret);
    const $begin = document.getElementById('begin');
    const $end = document.getElementById('end');

    //정답을 맞췄을 시 정답처리하는 함수를 호출 (processCorrect)
    //up 또는 down일 경우에는 min과 max값을 변경하고
    //executeUpDownAnimation 함수를 호출.
    if(secret === answer) {
        processCorrect($target);
        return;
    } else if(secret < answer) {
        //down일 경우
        gameData.max = answer - 1;
        $end.textContent = answer;
        executeUpDownAnimation(false);
    } else {
        //up인 경우
        gameData.min = answer + 1;
        $begin.textContent = answer;
        executeUpDownAnimation(true);
    }

    //판별 후에는 아이콘을 재 배치.
    clearNumberIcons($numbers); //현재 렌더링 되어 있는 아이콘들을 전체 삭제
    makeNumberIcons(); //min, max는 변경되어 있고 다시 아이콘을 배치
}


//핵심 실행 로직 즉시 실행 함수 (main 비슷한 역할)
(function() {

    const $numbers = makeNumberIcons();

    //숫자 아이콘 클릭 이벤트 (부모 요소에 이벤트를 설정)
    $numbers.addEventListener('click', e => {

        if(!e.target.matches('#numbers > .icon')) {
            return;
        }

        console.log(`${e.target.textContent} 클릭됨!`);

        gameData.answer = +e.target.textContent;

        //정답 체크 함수 호출
        checkAnswer($numbers, e.target);

    });

}());
 
 

css 코드 

 


/* reset */
a {
    color: inherit;
    text-decoration: none;
}

/* layout */
.wrapper {
    font-size: 18px;
    background: #8c8c8c;
    height: 100vh;
    position: relative;
}

section.main {
    width: 40%;
    background: #f6f6f6;
    border-radius: 10px;
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.7);

    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    overflow: hidden;
}

section.main .main-title {
    padding: 30px 20px;
    font-size: 30px;
    font-weight: 700;
    text-align: center;
    background: #a3f8ff;
    border-bottom: 1px solid #d3d3d3;
}

section.main .number-wrapper {
    padding: 50px 20px;
}

section.main .number-wrapper h2 {
    font-size: 22px;
    text-align: center;
    text-decoration: underline;
}

section.main .number-wrapper h2 em {
    font-size: 1.2em;
    font-weight: 700;
    color: red;
}

#numbers {
    width: 70%;
    height: 400px;
    border: 1px solid #000;
    border-radius: 10px;
    margin: 30px auto 0;
    padding: 30px 50px;
    overflow: auto;
}

#numbers .icon {
    width: 100px;
    height: 100px;
    font-size: 32px;
    font-weight: 700;
    border-radius: 50%;
    color: #fff;
    text-align: center;
    line-height: 100px;
    margin-right: 15px;
    margin-bottom: 10px;

    display: inline-block;
    cursor: pointer;
}

#numbers .icon:hover {
    opacity: 0.7;
    transform: scale(1.1);
}

#numbers .icon:nth-child(4n) {
    background: orangered;
}
#numbers .icon:nth-child(4n-1) {
    background: skyblue;
}
#numbers .icon:nth-child(4n-2) {
    background: yellowgreen;
}
#numbers .icon:nth-child(4n-3) {
    background: orange;
}

/* UP & DOWN 아이콘 */

.result {
    position: absolute;
    top: 50%;
    right: 20%;
    transform: translateY(-50%);
}

.result div[id] {
    width: 150px;
    height: 150px;
    border-radius: 50%;
    font-size: 30px;
    font-weight: 700;
    color: #fff;
    text-align: center;
    line-height: 150px;
    margin-bottom: 30px;
}

#up {
    background: red;
}

#down {
    background: blue;
}

.result div.selected {
    animation: jumping 0.1s infinite linear alternate;
}

@keyframes jumping {
    0% {
        transform: translateY(0);
    }
    50% {
        transform: translateY(-10px);
    }
    100% {
        transform: translateY(-20px);
    }
}

/* finish 영역 */
#finish {
    width: 60%;
    height: 200px;
    background: tomato;
    font-size: 80px;
    font-weight: 700;
    border: 2px solid #000;
    border-radius: 20px;
    text-align: center;
    line-height: 200px;

    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);

    opacity: 0;
    z-index: -10;

}

#finish.show {
    animation: showUp 1s linear forwards;
}

@keyframes showUp {
    0% {
        opacity: 0;
        z-index: -10;
        top: -50%;
    }
    50% {
        opacity: 0.5;
        top: 0;
    }
    100% {
        opacity: 1;
        z-index: 10;
        top: 50%;
    }
}

/* 정답 아이콘에 id=move가 붙으면 해당 아이콘이 커지면서 움직이도록 */
#move {
    position: absolute;
    left: 50%;
    top: 10%;
    z-index: 10;
    border: 4px dashed #000;
    animation: move 2s linear forwards;
}

@keyframes move {
    0% {
        top: 0;
        transform: translateX(0) scale(1);
    }
    100% {
        top: 10%;
        transform: translateX(-50%) scale(2);
    }
}

 

완성된 사이트

 

 

 

※  모든 코드는 중x정보x리학원 이x민 강사님의 코드를 활용하여 제작하였음을 알려드립니다.

반응형
반응형

드디어 HTML , CSS , 약간의 JS로 짠 나의 첫 포트폴리오 개재용 사이트가 완성 되었다. 

 

기능 설명을 하자면 

 

1. 슬라이드 다운

 

HOME 버튼 및 Testimonals까지 누르면 해당 페이지로 이동이 된다. 

 

사실 그외 기능은 없다. 아직 js를 잘 쓸줄 모르기 떄문이다. 

 

 

2. 포지션 fixed를 설정하여 상단 바 고정

 

 

상단바에 z-index를 1순위로 주어 어떤 포지션이 와도 상단에 고정되게 한다. 

 

 

3. 스킬 

 

 

사실 저기에 나온 skills에 대한 것은 꼼수를 부렸다. 

 

코드를 보자면 

 

  <div class="skill">
                <div class="skills__description">
                    <span>J-Query</span>
                    <span>10%</span>
                </div>
                <div class="skills__bar">
                    <div class="skills__value" style="width: 10%;"></div>
                </div>

 

위 의 식으로 스킬바 자체에 width를 적용하였다. ㅋㅋㅋ 

 

 

 

 

4. mywork 부분 

 

저기 위애다 이제 내가 한 포트폴리오 들을 올릴 예정이다. 

올해가 가기전에 4칸을 채우는 것이 목표이다. 

아직은 내 포트폴리오 사이트가 하나이기 떄문에 아무것도 없다

 

5. 사용 후기(?) 부분 

 

 

나의 동반자 일론머스크 형이 나에대해서 얘기를 한다. 

 

이것도 다른 사람이 직접 이야기를 해주면 좋지만 나중에 학원 강사님이나 주변 지인에게 직접 써달라고 부탁하고 싶다. 

 

 

 

이상 약 4일간의 작업을 마친 나의 첫 웹페이지가 세상에 탄생하였다. 

 

아직 베타 버전이지만 계속 업데이트를 할 예정이다.

 

마지막으로 주소이다.

 

mls0000.dothome.co.kr

 

 

반응형

+ Recent posts