Advertisement
  1. Code
  2. JavaScript
  3. jQuery

Tạo một bàn phím với CSS và jQuery

Scroll to top

() translation by (you can also view the original English article)

Thỉnh thoảng chỉ cần vui để chơi đùa cùng các ngôn ngữ lập trình chúng ta biết và thấy cái chúng ta có thể tạo ra. Tôi nghĩ sẽ rất vui khi tạo ra một bàn phím trực tuyến nhỏ với CSS và sau đó làm cho nó hoạt động với jQuery. Bàn phím gồm phím "hành động" (caps lock, shift, và delete) chúng sẽ thay đổi bàn phím khi được nhấn vào. Tôi sẽ chỉ bạn làm sao để xây dựng nó ngay hôm nay.


Bước 1: File và Cơ bản HTML

Final ProductFinal ProductFinal Product

Bàn phím này yêu cầu rất nhiều thiết lập HTML và chỉnh sửa CSS. Mỗi phím sẽ được đại diện bởi một item trong một danh sách không xếp thứ tự. Mỗi item trong danh sách sẽ có một class kèm theo nó, được sử dụng trong cả CSS và jQuery. Đa số các class chỉ là "letter", "lastitem" hoặc một vài thứ tương tự.

Bảo đảm rằng bạn đã thiết lập một thư mục, nơi bạn sẽ dùng bàn phím này. Bên trong thư mục, tạo một file index.html cùng một thư mục css và một thư mục js. Sau cùng, tạo file keyboard.js trong thư mục js và một file style.css trong thư mục.

Organization of the filesOrganization of the filesOrganization of the files

Bên trong file HTML chúng ta sẽ kèm 2 file JavaScript và 1 file css. Trong thẻ body sẽ có một danh sách Khổng Lồ chưa được sắp xếp gồm những letter (ký tự), number (con số) và vài phím "action" hành động. HTML cũng sẽ có một textarea với id là "keyboard". Nó sẽ nơi để tất cả những ký tự được bổ sung vào. Code bên dưới sẽ được đặt bên trong file index.html.

1
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
<head>
5
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
	
7
	<title>Online Keyboard</title>
8
	<link rel="stylesheet" type="text/css" href="css/style.css" />
9
</head>
10
<body>
11
12
<div id="container">
13
	<textarea id="write" rows="6" cols="60"></textarea>
14
	<ul id="keyboard">
15
		<li class="symbol"><span class="off">`</span><span class="on">~</span></li>
16
		<li class="symbol"><span class="off">1</span><span class="on">!</span></li>
17
		<li class="symbol"><span class="off">2</span><span class="on">@</span></li>
18
		<li class="symbol"><span class="off">3</span><span class="on">#</span></li>
19
		<li class="symbol"><span class="off">4</span><span class="on">$</span></li>
20
		<li class="symbol"><span class="off">5</span><span class="on">%</span></li>
21
		<li class="symbol"><span class="off">6</span><span class="on">^</span></li>
22
		<li class="symbol"><span class="off">7</span><span class="on">&amp;</span></li>
23
		<li class="symbol"><span class="off">8</span><span class="on">*</span></li>
24
		<li class="symbol"><span class="off">9</span><span class="on">(</span></li>
25
		<li class="symbol"><span class="off">0</span><span class="on">)</span></li>
26
		<li class="symbol"><span class="off">-</span><span class="on">_</span></li>
27
		<li class="symbol"><span class="off">=</span><span class="on">+</span></li>
28
		<li class="delete lastitem">delete</li>
29
		<li class="tab">tab</li>
30
		<li class="letter">q</li>
31
		<li class="letter">w</li>
32
		<li class="letter">e</li>
33
		<li class="letter">r</li>
34
		<li class="letter">t</li>
35
		<li class="letter">y</li>
36
		<li class="letter">u</li>
37
		<li class="letter">i</li>
38
		<li class="letter">o</li>
39
		<li class="letter">p</li>
40
		<li class="symbol"><span class="off">[</span><span class="on">{</span></li>
41
		<li class="symbol"><span class="off">]</span><span class="on">}</span></li>
42
		<li class="symbol lastitem"><span class="off">\</span><span class="on">|</span></li>
43
		<li class="capslock">caps lock</li>
44
		<li class="letter">a</li>
45
		<li class="letter">s</li>
46
		<li class="letter">d</li>
47
		<li class="letter">f</li>
48
		<li class="letter">g</li>
49
		<li class="letter">h</li>
50
		<li class="letter">j</li>
51
		<li class="letter">k</li>
52
		<li class="letter">l</li>
53
		<li class="symbol"><span class="off">;</span><span class="on">:</span></li>
54
		<li class="symbol"><span class="off">'</span><span class="on">&quot;</span></li>
55
		<li class="return lastitem">return</li>
56
		<li class="left-shift">shift</li>
57
		<li class="letter">z</li>
58
		<li class="letter">x</li>
59
		<li class="letter">c</li>
60
		<li class="letter">v</li>
61
		<li class="letter">b</li>
62
		<li class="letter">n</li>
63
		<li class="letter">m</li>
64
		<li class="symbol"><span class="off">,</span><span class="on">&lt;</span></li>
65
		<li class="symbol"><span class="off">.</span><span class="on">&gt;</span></li>
66
		<li class="symbol"><span class="off">/</span><span class="on">?</span></li>
67
		<li class="right-shift lastitem">shift</li>
68
		<li class="space lastitem">&nbsp;</li>
69
	</ul>
70
</div>
71
72
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
73
<script type="text/javascript" src="js/keyboard.js"></script>
74
</body>
75
</html>

Bạn sẽ không phải quá lo lắng về các class trong những item của danh sách vào lúc này. Tôi sẽ giải thích chúng nhiều hơn khi chúng ta dùng jQuery. Tuy nhiên, một số class (như right-shift và lastitem) chỉ ở đó bởi vì file CSS mà chúng ta sẽ sử dụng.

The HTML before CSS is applied.The HTML before CSS is applied.The HTML before CSS is applied.

Bước 2: Làm cho danh sách đẹp hơn

JavaScript cho bàn phím sẽ làm việc hoàn hảo mà không cần CSS, nhưng nó chả trông giống một bàn phím. Tôi sẽ không tính giải thích từng style bởi vì phần nhiều chúng ta tự giải thích được, nhưng có một số tôi sẽ nhắc qua. Lưu các CSS sau vào style.css ở trong thư mục css.

1
2
* {
3
margin: 0;
4
padding: 0;
5
}
6
body {
7
font: 71%/1.5 Verdana, Sans-Serif;
8
background: #eee;
9
}
10
#container {
11
margin: 100px auto;
12
width: 688px;
13
}
14
#write {
15
margin: 0 0 5px;
16
padding: 5px;
17
width: 671px;
18
height: 200px;
19
font: 1em/1.5 Verdana, Sans-Serif;
20
background: #fff;
21
border: 1px solid #f9f9f9;
22
-moz-border-radius: 5px;
23
-webkit-border-radius: 5px;
24
}
25
#keyboard {
26
margin: 0;
27
padding: 0;
28
list-style: none;
29
}
30
	#keyboard li {
31
	float: left;
32
	margin: 0 5px 5px 0;
33
	width: 40px;
34
	height: 40px;
35
	line-height: 40px;
36
	text-align: center;
37
	background: #fff;
38
	border: 1px solid #f9f9f9;
39
	-moz-border-radius: 5px;
40
	-webkit-border-radius: 5px;
41
	}
42
		.capslock, .tab, .left-shift {
43
		clear: left;
44
		}
45
			#keyboard .tab, #keyboard .delete {
46
			width: 70px;
47
			}
48
			#keyboard .capslock {
49
			width: 80px;
50
			}
51
			#keyboard .return {
52
			width: 77px;
53
			}
54
			#keyboard .left-shift {
55
			width: 95px;
56
			}
57
			#keyboard .right-shift {
58
			width: 109px;
59
			}
60
		.lastitem {
61
		margin-right: 0;
62
		}
63
		.uppercase {
64
		text-transform: uppercase;
65
		}
66
		#keyboard .space {
67
		clear: left;
68
		width: 681px;
69
		}
70
		.on {
71
		display: none;
72
		}
73
		#keyboard li:hover {
74
		position: relative;
75
		top: 1px;
76
		left: 1px;
77
		border-color: #e5e5e5;
78
		cursor: pointer;
79
		}

Chú ý các style sau đây bởi vì chúng rất quan trọng.

  • .on - Trong một số item của danh sách, có hai spans. Đó là những phím có nhiều hơn 2 ký tự cho mỗi phím; giống như những con số. Span có class là on sẽ bị ẩn đi. Điều này thay đổi khi nào user click vào phím shift, nhưng chi tiết hơn sẽ dành cho JavaScript.
  • .lastitem - Phím cuối cùng của bất kỳ hàng phím nào sẽ có lề phải (right margin) là zero để không phá hỏng bố cục.
Before and after the CSS is applied.Before and after the CSS is applied.Before and after the CSS is applied.

Bước 3: Hoạt động của các phím

Nếu bạn click vào một item và không có gì xảy ra. Chúng ta sẽ áp dụng một chút jQuery để sửa nó. Ý tưởng chính chúng ta sẽ dùng là gán một click handler (xử lý khi nhấn) vào mỗi phím trong danh sách, lấy text khi được click, và thực hiện việc xử lý tuỳ vào class của item trong danh sách. Từ đây, tất cả JavaScript code sẽ đi vào file keyboard.js.

Phần thiết lập

Chúng ta cần jQuery và định nghĩa 3 biến số sẽ được dùng xuyên suốt đoạn code. Những biến số là textarea, một shift status, và một caps lock status.

1
2
$(function(){
3
	var $write = $('#write'),
4
		shift = false,
5
		capslock = false;
6
	
7
	// The rest of the code goes here.

8
});

TIếp theo là gán click handler vào tất cả phím. Hai biến số được thiết lập khi phím được click. $this được định nghĩa chỉ để chúng giảm bớt phần gõ chữ, và ký tự được định nghĩa là HTML của item trong danh sách. Nếu item trong list là một ký tự, không có gì xảy ra với biến này và nó sẽ được trả về.

1
2
$('#keyboard li').click(function(){
3
	var $this = $(this),
4
		character = $this.html(); // If it's a lowercase letter, nothing happens to this variable

5
	
6
	// Code for processing the key.

7
});

Phím Shift và Caps Lock

If phím Shift (những item với class "left-shift" hoặc "right-shift") được click, chúng ta muốn bật tắt class "uppercase" của mỗi ký tự. Sau đó cho các item trong danh sách với một class "symbol" chúng ta muốn bật tắt hiển thị giữa những thẻ span lồng vào nhau. Điều ta muốn làm tiếp theo là thiết lập shift cho các giá trị boolean đối lập (nếu true thì xét thành false và ngược lai), và biến số caps lock thành false, và cuối cùng là trả về false để không làm gì khác với các biến ký tự.

1
2
// Shift keys

3
if ($this.hasClass('left-shift') || $this.hasClass('right-shift')) {
4
	$('.letter').toggleClass('uppercase');
5
	$('.symbol span').toggle();
6
	
7
	shift = (shift === true) ? false : true;
8
	capslock = false;
9
	return false;
10
}

Bây giờ nếu phím caps lock được click, chúng ta sẽ bật tắt class "uppercase" của những item trong danh sách; xét biến caps lock thành true, và trả về giá trị false.

1
2
// Caps lock

3
if ($this.hasClass('capslock')) {
4
	$('.letter').toggleClass('uppercase');
5
	capslock = true;
6
	return false;
7
}

Phím Delete

Với phím Delete, chúng ta cần gán một biến khác: html - những nội dung của textarea hiện thời đang có. Một khi đã có biến này, chúng ta thiết lập HTML mới cho textarea thành tất cả mọi ngoại thứ trừ ký tự cuối cùng. Phương thức substr của JavaScript giúp ta thực hiện điều này. Khi chúng ta trả về false một lần nữa để không xử lý thêm bất cứ gì.

1
2
// Delete

3
if ($this.hasClass('delete')) {
4
	var html = $write.html();
5
	
6
	$write.html(html.substr(0, html.length - 1));
7
	return false;
8
}
The markup behind the delete key.The markup behind the delete key.The markup behind the delete key.

Các ký tự đặc biệt

Với tất cả item trong danh sách không phải là chữ và không phải là những phím "action", chúng ta thay đổi biến ký tự sang một thứ đặc biệt. Cho một item trong danh sách với class "symbol", ký tự được xét thành nội dung của bất cứ thứ gì đang được nhìn thấy. Một space - khoảng trắng - (dĩ nhiên) được dùng cho space bar. Ký tự tab được đại diện bởi \t, và sau cùng là \t, và sau cùng một hàng mới (phím return) là \n.

1
2
// Special characters

3
if ($this.hasClass('symbol')) character = $('span:visible', $this).html();
4
if ($this.hasClass('space')) character = ' ';
5
if ($this.hasClass('tab')) character = "\t";
6
if ($this.hasClass('return')) character = "\n";
The markup behind the symbol keys.The markup behind the symbol keys.The markup behind the symbol keys.

Các ký tự viết hoa

Nếu bạn có thể nhớ đến khi chúng ta xử lý phím shift và caps lock, thì class "uppercase" đã được bổ sung hoặc xoá đi qua hàm toggleClass. Nếu class uppercase được tìm thấy, ký tự được chuyển sang dạng viết hoa của nó với sự hỗ trợ của phương thức toUpperCase.

1
2
// Uppercase letter

3
if ($this.hasClass('uppercase')) character = character.toUpperCase();

Kết quả

Trên một bàn phím thông thường, bạn thường chỉ cần phím shift cho một letter. Nếu biến shift tìm ra đước xẹ thành true thì chúng ta muốn bật tắt hiển thị cho span của ký hiệu. Điều nàY cũng xảy ra khi phím caps lock là "on", các ký tự lần nữa được bật giữa uppercase và lowercase (viết hoa và viết thường).

Để hoàn tất nốt, ký tự được bổ sung vào textarea và người dùng có thể bắt đầu "typing" (đánh chữ).

1
2
// Remove shift once a key is clicked.

3
if (shift === true) {
4
	$('.symbol span').toggle();
5
	if (capslock === false) $('.letter').toggleClass('uppercase');
6
	
7
	shift = false;
8
}
9
10
// Add the character

11
$write.html($write.html() + character);

Code JavaScript sau cùng

1
2
$(function(){
3
	var $write = $('#write'),
4
		shift = false,
5
		capslock = false;
6
	
7
	$('#keyboard li').click(function(){
8
		var $this = $(this),
9
			character = $this.html(); // If it's a lowercase letter, nothing happens to this variable

10
		
11
		// Shift keys

12
		if ($this.hasClass('left-shift') || $this.hasClass('right-shift')) {
13
			$('.letter').toggleClass('uppercase');
14
			$('.symbol span').toggle();
15
			
16
			shift = (shift === true) ? false : true;
17
			capslock = false;
18
			return false;
19
		}
20
		
21
		// Caps lock

22
		if ($this.hasClass('capslock')) {
23
			$('.letter').toggleClass('uppercase');
24
			capslock = true;
25
			return false;
26
		}
27
		
28
		// Delete

29
		if ($this.hasClass('delete')) {
30
			var html = $write.html();
31
			
32
			$write.html(html.substr(0, html.length - 1));
33
			return false;
34
		}
35
		
36
		// Special characters

37
		if ($this.hasClass('symbol')) character = $('span:visible', $this).html();
38
		if ($this.hasClass('space')) character = ' ';
39
		if ($this.hasClass('tab')) character = "\t";
40
		if ($this.hasClass('return')) character = "\n";
41
		
42
		// Uppercase letter

43
		if ($this.hasClass('uppercase')) character = character.toUpperCase();
44
		
45
		// Remove shift once a key is clicked.

46
		if (shift === true) {
47
			$('.symbol span').toggle();
48
			if (capslock === false) $('.letter').toggleClass('uppercase');
49
			
50
			shift = false;
51
		}
52
		
53
		// Add the character

54
		$write.html($write.html() + character);
55
	});
56
});
Final ProductFinal ProductFinal Product

Tổng kết

Thỉnh thoảng thật vui khi khám phá, thậm chí nếu kết quả sau cùng không thực sự thuộc về "thế giới thực tế". Bằng việc ứng dụng một vài class vào item của danh sách, chúng ta đã có thể tạo một bàn phím bằng CSS và jQuery. Bàn phím không hoàn toàn vô ích. Tôi từng thấy nhiều website có tuỳ chọn cho sử dụng một bàn phím trên màn hình. Nhưng chủ yếu, bài này cho chúng ta hiểu nhiều hơn về khả năng của CSS và jQuery.

  • Hãy theo dõi chúng tôi trên Twitter, hoặc subscribe trên NETTUTS RSS Feed cho nhiều bài viết và hưỡng dẫn về phát triển web mỗi ngày.


Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.