본문 바로가기

Study/HTML, CSS

[HTML5/CSS/Javascript] 스티키 노트(포스트잇) 만들기

input창에 데이터 입력하여 '추가'버튼 누르면 하단에 등록되고,

해당 노트에 마우스를 가져가면 확대되고,

클릭하면 삭제된다.

 

적당히 응용해서 다른 곳에 적용하면 될 듯 하다.

 

 

 

notetoself.html

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 
<title>스티키 노트</title> 
<link rel="stylesheet" href="notetoself.css"> 
<!-- <script type="text/javascript" src="js/jquery-1.8.1.min.js"></script> --> 
<!-- <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> --> 
<script type="text/javascript" src="notetoself.js"></script> 
</head> 
<body> 
    <form> 
        <label for="note_color">색상:</label> 
        <select id="note_color"> 
            <option value="LightGoldenRodYellow">노란색</option>    <!-- #fafad2 --> 
            <option value="PaleGreen">녹색</option>    <!-- #98fb98 --> 
            <option value="LightPink">분홍</option>    <!-- #ffb6c1 --> 
            <option value="LightBlue">파란색</option>    <!-- #add8e6 --> 
        </select> 
        <label for="note_text">내용:</label><input type="text" id="note_text"> 
        <input type="button" id="add_button" value="스티키 노트 추가"> 
        <!-- <input type="button" id="clear_button" value="스티키 노트 전부 삭제"> --> 
         
        <ul id="stickies"> 
        </ul> 
    </form> 
</body> 
</html>

 

notetoself.css

/*
 notetoself.css
 
 테스트 브라우저: firefox, safari, opera, chrome
 전환 효과(ease-in)은 firefox에서 적용되지 않습니다.
*/

body {
 background-color: #dbdbdb;
 font-size: 100%;
}

form input#note_text {
 width: 350px;
}

/* 스티키 노트 */

ul#stickies li {
 display: block;
 list-style: none;
 z-index: 1;
 float: left;
 margin: 30px;
 padding: 15px 15px 50px 15px;
 width: 200px;
 height: 200px;
 border: 1px solid #bfbfbf;
 background-color:  LightGoldenRodYellow; /* 색상명 값이 맞지 않을 땐 #fafad2 */
 color: black;
 text-decoration: none;
 -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
 -moz-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
 -o-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
 box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
 -webkit-transition: all 0.5s ease-in;
 -moz-transition: all 0.5s ease-in;
 -o-transition: all 0.5s ease-in;
 -ms-transition: all 0.5s ease-in;
 transition: all 0.5s ease-in;
 overflow: hidden;
}

ul#stickies li span.sticky {
 font-family: Verdana, Helvetica, sans-serif;
 font-size: 200%;
}

/* 회전 */
ul#stickies li:nth-child(even) {
 -webkit-transform: rotate(2deg);
 -moz-transform: rotate(2deg);
 -o-transform: rotate(2deg);
 -ms-transform: rotate(2deg);
 transform: rotate(2deg);
}

ul#stickies li:nth-child(odd) {
 -webkit-transform: rotate(-1deg);
 -moz-transform: rotate(-1deg);
 -o-transform: rotate(-1deg);
 -ms-transform: rotate(-1deg);
 transform: rotate(-1deg);
}

ul#stickies li:nth-child(3n) {
 -webkit-transform: rotate(1deg);
 -moz-transform: rotate(1deg);
 -o-transform: rotate(1deg);
 -ms-transform: rotate(1deg);
 transform: rotate(1deg);
}

/* 변형 데모 - 위에 정의한 전환을 이용해서 서서히 변형시킴 */
ul#stickies li:hover {
 -webkit-box-shadow: 5px 5px 6px rgba(0, 0, 0, 0.4);
 -moz-box-shadow: 5px 5px 6px rgba(0, 0, 0, 0.4);
 -o-box-shadow: 5px 5px 6px rgba(0, 0, 0, 0.4);
 
 -webkit-transform: rotate(0deg) scale(1.25);
 -moz-transform: rotate(0deg) scale(1.25);
 -o-transform: rotate(0deg) scale(1.25);
 -ms-transform: rotate(0deg) scale(1.25);
 transform: rotate(0deg) scale(1.25);
 z-index: 10;
}

 

notetoself.js

/* 
 * notetoself.js 
 *  
 * 이 버전은 배열을 이용하며 JSON으로 색상을 추가했습니다. 
 */ 

window.onload = init; 

function init() { 
    var button = document.getElementById("add_button"); 
    button.onclick = createSticky; 
     
/*    var clearbutton = document.getElementById("clear_button"); 
    clearbutton.onclick = clearStickyNotes;*/ 
     
    var stickiesArray = getStickiesArray(); 
    for (var i=0; i<stickiesArray.length; i++) { 
        var key = stickiesArray[i]; 
        var value = JSON.parse(localStorage[key]); 
        addStickyToDOM(key, value); 
    } 
} 

function getStickiesArray() { 
    var stickiesArray = localStorage.getItem("stickiesArray"); 
    if (!stickiesArray) { 
        stickiesArray = []; 
        localStorage.setItem("stickiesArray", JSON.stringify(stickiesArray)); 
    } else { 
        stickiesArray = JSON.parse(stickiesArray); 
    } 
     
    return stickiesArray; 
} 

function createSticky() { 
    var stickiesArray = getStickiesArray(); 
    var value = document.getElementById("note_text").value; 
    var ColorSelectObj = document.getElementById("note_color"); 
    var index = ColorSelectObj.selectedIndex; 
    var color = ColorSelectObj[index].value; 
     
    // json으로 value와 color가 유지되는 스티키 노트를 생성 
    var currentDate = new Date(); 
    var key = "sticky_"+currentDate.getTime(); 
    var stickyObj = { 
            "value" : value, 
            "color" : color 
    }; 
    localStorage.setItem(key, JSON.stringify(stickyObj)); 
     
    // 새 스티키 노트를 배열에 추가하고 localStorage에 저장된 notes 배열을 업데이트함 
    stickiesArray.push(key); 
    localStorage.setItem("stickiesArray", JSON.stringify(stickiesArray)); 
     
    addStickyToDOM(key, stickyObj); 
} 

function deleteSticky(e) { 
    var key = e.target.id; 
    if (e.target.tagName.toLowerCase() == "span") { 
        key = e.target.parentNode.id; 
    } 
     
    var stickiesArray = getStickiesArray(); 
    if (stickiesArray) { 
        for (var i=0; i<stickiesArray.length; i++) { 
            if (key == stickiesArray[i]) { 
                stickiesArray.splice(i, 1); 
            } 
        } 
         
        localStorage.removeItem(key); 
        localStorage.setItem("stickiesArray", JSON.stringify(stickiesArray)); 
        removeStickyFromDOM(key); 
    } 
} 

function addStickyToDOM(key, stickyObj) { 
    var stickies = document.getElementById("stickies"); 
    var sticky = document.createElement("li"); 
     
    // 스티키 배열에 저장된 아이디로 찾을 수 있게 id속성에 key값을 지정 
    sticky.setAttribute("id", key); 
     
    // stickyObj의 color를 이용해서 CSS 배경색 스타일을 지정 
    sticky.style.backgroundColor = stickyObj.color; 
     
    var span = document.createElement("span"); 
    span.setAttribute("class", "sticky"); 
     
    // stickyObj의 value를 이용해서 스티키 노트의 내용을 할당 
    span.innerHTML = stickyObj.value; 
     
    // 모든 것을 DOM에 추가 
    sticky.appendChild(span); 
    stickies.appendChild(sticky); 
     
    // 스티키 노트를 클릭하면 삭제되도록 이벤트 리스너를 붙임 
    sticky.onclick = deleteSticky; 
} 

function removeStickyFromDOM(key) { 
    var sticky = document.getElementById(key); 
    sticky.parentNode.removeChild(sticky); 
} 

function clearStickyNotes() { 
    localStorage.clear(); 
    var stickyList = document.getElementById("stickies"); 
    var stickies = stickyList.childNodes; 
    for (var i=stickies.length-1; i>=0; i--) { 
        stickyList.removeChild(stickies[i]); 
    } 
     
    // 스티키 배열을 초기화 
    var stickiesArray = getStickiesArray(); 
}

 

'Study > HTML, CSS' 카테고리의 다른 글

[HTML/CSS] 메뉴 탭 처럼 만들기  (0) 2019.05.27
[html/css] 기초  (0) 2019.05.16