1. 程式人生 > >CSS3+JS 實現的便籤應用

CSS3+JS 實現的便籤應用

一、準備工作

1、開發工具Sublime+一個能開啟網頁的現代瀏覽器

3、使用 localStorage 儲存便籤

二、程式實現

1、首先,我們建立三個目錄,第一個目錄是 css ,用於存放 css 樣式檔案。第二個目錄是 images ,用於存放程式中使用到的圖示。第三個目錄是 js ,用於存放程式中使用到的 js 檔案,當然還有一個 index.html 存放在根目錄下。

2、程式的實現思路很簡單,我們只要在js中完成三個功能即可:

第一,就是獲取DOM元素,用於為頁面中的控制元件設定動作。

第二,建立 Note 控制中心,用於控制便籤的儲存,讀取,修改和刪除。

第三,頁面初始化。

3、在講程式碼之前,我們首先看看整個程式的執行效果。

display.png

HTML程式碼:其結構也很簡單,在剛開始沒有便籤記錄的時候,只需要有一個文字輸入框和一個儲存按鈕即可,然後為便籤記錄設定一個無序列表,並且在 CSS 中為其制定樣式,下面是我的 HTML 結構

		<article id="task-container">
			<header>
				<h1>備忘錄</h1>
			</header>
			<section id="task-input">
				<input type="text" name="content" id="input-content" placeholder="請輸入要儲存的內容">
				<button id="task-submit">儲存</button>
			</section>
			<section id="task-list">
				<ul id="list-content">
				</ul>
			</section>
		</article>

CSS 程式碼主要關注三點:

第一點:樣式重置,在這裡使用了 normalize

第二點:動畫效果,在刪除便籤,新增便籤,編輯便籤,刪除便籤時都有動畫效果,這主要是為了改善使用者體驗

第三點:針對響應式,我這裡設定的也比較簡單,就是針對螢幕解析度低於 700px 的時候,改變便籤列表的寬度,以達到適應螢幕的效果。

@media only screen and (max-width: 700px) {
	#task-container, aside#task-detail .detail-container{
		width: 90%;
	}

	aside#task-detail .detail-container {
		padding: 12px 8px;
	}

	#delete-container {
		width: 80%;
	}
}

還有一點值得注意的是,每個便籤目錄以一行的形式顯示,如果字數超過一行該怎麼辦呢?很普遍的,大家都把超出的那部分用省略號代替,其核心程式碼如下所示

	white-space: nowrap;
	text-overflow: ellipsis;
	overflow: hidden;

JS實現:關於JS 的實現,我們上面提到了需要關注三點,下面就來講講這三點的核心實現:

第一點,關於DOM元素如何獲取就不在詳細說了,直接使用 document.getElementById(name) 即可,關鍵是各個瀏覽器對事件的設定是不同的,所以為了相容 Netscape 和 IE 陣營,我們需要手寫相容程式碼,畢竟我們沒有使用 JQuery。

	var EventHandler = (function() {
		function addHandler(element, type, handler) {
			if (element.addEventListener) {
				element.addEventListener(type, handler, false);
			} else if(element.attachEvent) {
				element.attachEvent("on" + type, handler);
			} else {
				element["on" + type] = handler;
			}
		}

		function removeHandler(element, type, handler) {
			if(element.removeEventListener) {
				element.removeEventListener(type, handler, false);
			} else if (element.detachEvent) {
				element.detachEvent("on" + type, handler);
			} else {
				element["on" + type] = null;
			}
		}

		function getEvent(event) {
			return event? event : window.event;
		}

		function getTarget(event) {
			var event = getEvent(event);
			return event.target || event.srcElement;
		}

		return {
			"addHandler": addHandler,
			"removeHandler": removeHandler,
			"getEvent": getEvent,
			"getTarget": getTarget
		};
	})();

第二點就是建立便籤的控制中心,其實也很簡單,只不過是 localStorage 的幾個 api 使用而已,最主要的還是 setItem 和 getItem。

	var NoteControl = (function() {
		var Note = function(title, desc) {
			this.title = title;
			this.desc = desc;
			this.date = "";
		};

		var addNoteToDOM = function(note, noteKey) {
			var title = note.title;

			var liElement = document.createElement("li");
			liElement.classList.add("task-item");
			liElement.setAttribute("id", noteKey);

			liElement.innerHTML = '<span class="content">' + title + "</span>" +
								  '<span class="edit"></span>' +
								  '<span class="delete"></span>';
			listContent.insertBefore(liElement, listContent.firstElementChild);
			return liElement;
		};

		var deleteFromDOM = function(liElement) {
			listContent.removeChild(liElement);
		};

		var getKeysArray = function() {
			var keysArray = localStorage.getItem("noteKeysArray");

			if (!keysArray) {
				keysArray = [];
				localStorage.setItem("noteKeysArray", keysArray);
			} else {
				keysArray = JSON.parse(keysArray);
			}

			return keysArray;
		};

		function showAllNotes() {
			var noteKeysArray = getKeysArray(),
				length = noteKeysArray.length,
				note, key;

			for(var i = 0; i < length; i++) {
				key = noteKeysArray[i];
				note = JSON.parse(localStorage.getItem(key));
				var liElement = addNoteToDOM(note, key);
			}
		}

		function saveNote(title, desc) {
			var note = new Note(title, desc),
				noteKey = "note_" + new Date().getTime(),
				keysArray = getKeysArray();

			keysArray.push(noteKey);
			localStorage.setItem("noteKeysArray", JSON.stringify(keysArray));
			localStorage.setItem(noteKey, JSON.stringify(note));

			var liElement = addNoteToDOM(note, noteKey);
		}

		function deleteNote(liElement) {
			var keysArray = getKeysArray(),
				key = liElement.id,
				length = keysArray.length;

			localStorage.removeItem(key);
			for(var i = 0; i < length; i++) {
				if (keysArray[i] === key) {
					keysArray.splice(i, 1);
				}
			}
			localStorage.setItem("noteKeysArray", JSON.stringify(keysArray));
			deleteFromDOM(liElement);
		}

		function saveNoteById(id, note) {
			localStorage.setItem(id, JSON.stringify(note));
		}

		function getNoteById(id) {
			return JSON.parse(localStorage.getItem(id));
		}

		return {
			"saveNote": saveNote,
			"showAllNotes": showAllNotes,
			"deleteNote": deleteNote,
			"getNoteById": getNoteById,
			"saveNoteById": saveNoteById
		};
	})();

還有一點值得注意的是,上面的程式碼只是我們書寫了自己使用的 api ,至於各個按鈕的監聽控制程式,還需要另外書寫程式程式碼,比如我們監聽儲存按鈕的事件需要像下面這樣書寫。

	function save() {
		var title = inputContent.value;
		if(title.trim() !== "") {
			NoteControl.saveNote(title, "");
			inputContent.classList.remove("invalid");
			inputContent.setAttribute("placeholder", "請輸入要儲存的內容");
		} else {
			inputContent.classList.add("invalid");
			inputContent.setAttribute("placeholder", "內容為空,請重新輸入");
		}

		inputContent.value = "";
	}

三、執行效果

下載附件後,雙擊index.html即可執行。

首先,看看該程式各個部分的截圖

如果你覺得還不過癮,你可以線上體驗,體驗地址如下:https://hwaphon.github.io/Html5LocalStorage/2.0/index.html

四、其他補充

  1. 關於每個便籤目錄的資訊編輯,注意考慮閉包問題。

  2. 注意動態設定 input placeholder 的顏色

  3. 為了支援手機端,別忘記在 html 檔案中新增如下程式碼

<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no,maximum-scale=1.0">

注:本文著作權歸作者,由demo大師(http://www.demodashi.com)宣傳,拒絕轉載,轉載需要作者授權