100% found this document useful (4 votes)
77 views

(Ebook) HTML, CSS, and JavaScript All in One: Covering HTML5, CSS3, and ES6, Sams Teach Yourself by Meloni, Julie, Kyrnin, Jennifer ISBN 9780672338083, 0672338084 - Read the ebook now with the complete version and no limits

The document promotes instant access to various ebooks available for download at ebooknice.com, including titles on HTML, CSS, JavaScript, and other subjects. It provides links to specific ebooks along with their ISBNs. Users can download ebooks in multiple formats and start reading on any device immediately.

Uploaded by

kapahsynek
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (4 votes)
77 views

(Ebook) HTML, CSS, and JavaScript All in One: Covering HTML5, CSS3, and ES6, Sams Teach Yourself by Meloni, Julie, Kyrnin, Jennifer ISBN 9780672338083, 0672338084 - Read the ebook now with the complete version and no limits

The document promotes instant access to various ebooks available for download at ebooknice.com, including titles on HTML, CSS, JavaScript, and other subjects. It provides links to specific ebooks along with their ISBNs. Users can download ebooks in multiple formats and start reading on any device immediately.

Uploaded by

kapahsynek
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 75

Instant Ebook Access, One Click Away – Begin at ebooknice.

com

(Ebook) HTML, CSS, and JavaScript All in One:


Covering HTML5, CSS3, and ES6, Sams Teach Yourself
by Meloni, Julie, Kyrnin, Jennifer ISBN
9780672338083, 0672338084

https://ebooknice.com/product/html-css-and-javascript-all-
in-one-covering-html5-css3-and-es6-sams-teach-
yourself-34759582

OR CLICK BUTTON

DOWLOAD EBOOK

Get Instant Ebook Downloads – Browse at https://ebooknice.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Start reading on any device today!

(Ebook) Biota Grow 2C gather 2C cook by Loucas, Jason; Viles, James ISBN
9781459699816, 9781743365571, 9781925268492, 1459699815, 1743365578, 1925268497

https://ebooknice.com/product/biota-grow-2c-gather-2c-cook-6661374

ebooknice.com

(Ebook) Matematik 5000+ Kurs 2c Lärobok by Lena Alfredsson, Hans Heikne, Sanna
Bodemyr ISBN 9789127456600, 9127456609

https://ebooknice.com/product/matematik-5000-kurs-2c-larobok-23848312

ebooknice.com

(Ebook) SAT II Success MATH 1C and 2C 2002 (Peterson's SAT II Success) by Peterson's
ISBN 9780768906677, 0768906679

https://ebooknice.com/product/sat-ii-success-math-1c-and-2c-2002-peterson-s-sat-
ii-success-1722018

ebooknice.com

(Ebook) Master SAT II Math 1c and 2c 4th ed (Arco Master the SAT Subject Test: Math
Levels 1 & 2) by Arco ISBN 9780768923049, 0768923042

https://ebooknice.com/product/master-sat-ii-math-1c-and-2c-4th-ed-arco-master-
the-sat-subject-test-math-levels-1-2-2326094

ebooknice.com
(Ebook) Cambridge IGCSE and O Level History Workbook 2C - Depth Study: the United
States, 1919-41 2nd Edition by Benjamin Harrison ISBN 9781398375147, 9781398375048,
1398375144, 1398375047

https://ebooknice.com/product/cambridge-igcse-and-o-level-history-
workbook-2c-depth-study-the-united-states-1919-41-2nd-edition-53538044

ebooknice.com

(Ebook) Sams Teach Yourself HTML, CSS, and JavaScript All in One by Julie C. Meloni
ISBN 9780672333323, 0672333325

https://ebooknice.com/product/sams-teach-yourself-html-css-and-javascript-all-
in-one-7259744

ebooknice.com

(Ebook) Sams Teach Yourself HTML, CSS and JavaScript All in One by Meloni, Julie C.
ISBN 9780672333323, 0672333325

https://ebooknice.com/product/sams-teach-yourself-html-css-and-javascript-all-
in-one-55887586

ebooknice.com

(Ebook) Sams Teach Yourself PHP, MySQL and Apache All-in-One by Julie C. Meloni ISBN
9780672326202, 0672326205

https://ebooknice.com/product/sams-teach-yourself-php-mysql-and-apache-all-in-
one-979720

ebooknice.com

(Ebook) Sams Teach Yourself Web Publishing with HTML and CSS in One Hour a Day -
Includes New HTML5 Coverage by Laura Lemay, Rafe Colburn ISBN 9780672330964,
0672330962

https://ebooknice.com/product/sams-teach-yourself-web-publishing-with-html-and-
css-in-one-hour-a-day-includes-new-html5-coverage-4640636

ebooknice.com
Jennifer Kyrnin
Julie Meloni

SamsTeach Yourself

HTML, CSS,
and JavaScript
Third Edition

All
One
in
Sams Teach Yourself HTML, CSS, and JavaScript All in One, Third Edition Editor-in-Chief
Copyright © 2019 by Pearson Education, Inc. Mark Taub
All rights reserved. This publication is protected by copyright, and permission must be obtained
Editor
from the publisher prior to any prohibited reproduction, storage in a retrieval system, or transmis-
sion in any form or by any means, electronic, mechanical, photocopying, recording, or likewise. Mark Taber
For information regarding permissions, request forms, and the appropriate contacts within the Managing Editor
Pearson Education Global Rights & Permissions Department, please visit www.pearsoned.com/
permissions/. No patent liability is assumed with respect to the use of the information contained Sandra Schroeder
herein. Although every precaution has been taken in the preparation of this book, the publisher Senior Project
and authors assume no responsibility for errors or omissions. Nor is any liability assumed for Editor
damages resulting from the use of the information contained herein.
Lori Lyons
ISBN-13: 978-0-672-33808-3
ISBN-10: 0-672-33808-4 Copy Editor
Library of Congress Control Number: 2018953965 Kitty Wilson
01 18 Project Manager
Trademarks Suganya Karuppasamy
All terms mentioned in this book that are known to be trademarks or service marks have Indexer
been appropriately capitalized. Pearson cannot attest to the accuracy of this information.
Use of a term in this book should not be regarded as affecting the validity of any trademark Ken Johnson
or service mark. Proofreader
Warning and Disclaimer Abigail Manheim
Every effort has been made to make this book as complete and as accurate as possible, but no
Technical Editor
warranty or fitness is implied. The information provided is on an “as is” basis. The author and the
publisher shall have neither liability nor responsibility to any person or entity with respect to any Julie Meloni
loss or damages arising from the information contained in this book or from the use of the CD or Editorial Assistant
programs accompanying it.
Cindy Teeters
Special Sales
For information about buying this title in bulk quantities, or for special sales opportunities (which Cover Designer
may include electronic versions; custom cover designs; and content particular to your business, Chuti Prasertsith
training goals, marketing focus, or branding interests), please contact our corporate sales
Compositor
department at corpsales@pearsoned.com or (800) 382-3419.
codemantra
For government sales inquiries, please contact governmentsales@pearsoned.com.
For questions about sales outside the U.S., please contact intlcs@pearson.com.
Contents at a Glance

Part I: Getting Started on the Web


LESSON 1 Understanding How the Web Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2 Structuring an HTML Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3 Understanding Cascading Style Sheets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4 Understanding JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5 Validating and Debugging Your Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

Part II: Building Blocks of Practical Web Design


LESSON 6 Working with Fonts, Text Blocks, Lists, and Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
7 Using External and Internal Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
8 Working with Colors, Images, and Multimedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

Part III: Advanced Web Page Design with CSS


LESSON 9 Working with Margins, Padding, Alignment, and Floating . . . . . . . . . . . . . . . 249
10 Understanding the CSS Box Model and Positioning . . . . . . . . . . . . . . . . . . . . . . . . . 271
11 Using CSS to Do More with Lists, Text, and Navigation . . . . . . . . . . . . . . . . . . . . 289
12 Creating Layouts Using Modern CSS Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
13 Taking Control of Backgrounds and Borders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
14 Using CSS Transformations and Transitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
15 Animating with CSS and the Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401

Part IV: Responsive Web Design


LESSON 16 Understanding the Importance of Responsive Web Design . . . . . . . . . . . . . . . 427
17 Designing for Mobile Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
18 Using Media Queries and Breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
iv Sams Teach Yourself HTML, CSS, and JavaScript All in One

Part V: Getting Started with Dynamic Sites


LESSON 19 Understanding Dynamic Websites and HTML5 Applications. . . . . . . . . . . . . 487
20 Getting Started with JavaScript Programming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
21 Working with the Document Object Model (DOM) . . . . . . . . . . . . . . . . . . . . . . . . . . 523
22 Using JavaScript Variables, Strings, and Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
23 Controlling Flow with Conditions and Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
24 Responding to Events and Using Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
25 JavaScript Best Practices .............................................................. 655
26 Using Third-Party JavaScript Libraries and Frameworks . . . . . . . . . . . . . . . . . . . 681

Part VI: Advanced Website Functionality and Management


LESSON 27 Working with Web-Based Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
28 Organizing and Managing a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Table of Contents

Part I: Getting Started on the Web

LESSON 1: Understanding How the Web Works 1


A Brief History of HTML and the World Wide Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Creating Web Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Understanding Web Content Delivery ......................................................... 3
Selecting a Web Hosting Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Testing with Multiple Web Browsers and Devices .......................................... 8
Creating a Sample File. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Using FTP to Transfer Files ....................................................................... 10
Understanding Where to Place Files on the Web Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Distributing Content Without a Web Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Tips for Testing Web Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Q&A ..................................................................................................... 20
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

LESSON 2: Structuring an HTML Document 23


Getting Prepared . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Getting Started with a Simple Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
HTML Tags Every Web Page Must Have. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Organizing a Page with Paragraphs and Line Breaks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Organizing Your Content with Headings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Understanding Semantic Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Using <header> in Multiple Ways . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Understanding the <section> Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Using <article> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
vi Sams Teach Yourself HTML, CSS, and JavaScript All in One

Implementing the <nav> Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45


When to Use <aside> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Using <footer> Effectively . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Q&A ..................................................................................................... 50
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

LESSON 3: Understanding Cascading Style Sheets 55


How CSS Works. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
A Basic Style Sheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
A CSS Style Primer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Using Style Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Using Style IDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Internal Style Sheets and Inline Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Q&A ..................................................................................................... 75
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

LESSON 4: Understanding JavaScript 79


Learning Web Scripting Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
How JavaScript Fits into a Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Exploring JavaScript’s Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Displaying Time with JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Testing the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Q&A ..................................................................................................... 93
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

LESSON 5: Validating and Debugging Your Code 97


Validating Your Web Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Debugging HTML and CSS Using Developer Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Debugging JavaScript Using Developer Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Table of Contents vii

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Q&A ................................................................................................... 118
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Part II: Building Blocks of Practical Web Design

LESSON 6: Working with Fonts, Text Blocks, Lists, and Tables 121
Working with Special Characters ............................................................ 122
Boldface, Italic, and Special Text Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Tweaking the Font. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Using Web Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Aligning Text on a Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
The Three Types of HTML Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Placing Lists Within Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Creating a Simple Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Controlling Table Sizes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Alignment and Spanning Within Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Page Layout with Tables ........................................................................ 157
Using CSS Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Q&A ................................................................................................... 164
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

LESSON 7: Using External and Internal Links 167


Using Web Addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Linking Within a Page Using Anchors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Linking Between Your Own Web Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Linking to Non-HTML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Linking to External Web Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Linking to an Email Address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Opening a Link in a New Browser Window. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Giving Titles to Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
viii Sams Teach Yourself HTML, CSS, and JavaScript All in One

Using CSS to Style Hyperlinks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182


Using Links Effectively . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Q&A ................................................................................................... 188
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

LESSON 8: Working with Colors, Images, and Multimedia 191


Best Practices for Choosing Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Understanding Web Colors .................................................................... 194
Using Hexadecimal Values for Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Using RGB and RGBa Values for Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Using CSS to Set Background, Text, and Border Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Choosing Graphics Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
The Least You Need to Know About Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Preparing Photographic Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Creating Banners and Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Optimizing Images by Reducing or Removing Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Creating Tiled Background Images. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Placing Images on a Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Describing Images with Text. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Specifying Image Height and Width . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Aligning Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Turning Images into Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Using Background Images. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Using Image Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Linking to Multimedia Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Embedding Multimedia Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Additional Tips for Using Multimedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Q&A ................................................................................................... 245
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Table of Contents ix

Part III: Advanced Web Page Design with CSS

LESSON 9: Working with Margins, Padding, Alignment, and Floating 249


Using Margins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Padding Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Keeping Everything Aligned . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Centering Blocks of Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Understanding the float Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Q&A ................................................................................................... 267
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270

LESSON 10: Understanding the CSS Box Model and Positioning 271
The CSS Box Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Changing the Box Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
The Whole Scoop on Positioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Controlling the Way Things Stack Up ...................................................... 281
Managing the Flow of Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Q&A ................................................................................................... 285
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

LESSON 11: Using CSS to Do More with Lists, Text, and Navigation 289
HTML List Refresher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
How the CSS Box Model Affects Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Placing List Item Indicators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Creating Image Maps with List Items and CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
How Navigation Lists Differ from Regular Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Creating Vertical Navigation with CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Creating Horizontal Navigation with CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Q&A ................................................................................................... 314
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
x Sams Teach Yourself HTML, CSS, and JavaScript All in One

LESSON 12: Creating Layouts Using Modern CSS Techniques 317


Getting Ready to Do Page Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
The Importance of Putting Mobile Devices First . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Understanding Fixed Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Understanding Liquid Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Creating a Fixed/Liquid Hybrid Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Using Modern CSS Layout Techniques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Q&A ................................................................................................... 350
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352

LESSON 13: Taking Control of Backgrounds and Borders 353


Reviewing Background and Border Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Using Multiple Borders and Backgrounds. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Using Forgotten Background Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Using Gradients as Backgrounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Rounding the Corners of HTML Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
Using Images as Borders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Understanding CSS Outlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Q&A ................................................................................................... 379
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381

LESSON 14: Using CSS Transformations and Transitions 383


Understanding CSS 2D Transformations .................................................. 383
Transforming Elements in Three Dimensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Working with CSS Transitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Using JavaScript to Trigger Transitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Q&A ................................................................................................... 399
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Table of Contents xi

LESSON 15: Animating with CSS and the Canvas 401


Understanding CSS Animation ............................................................... 401
Using the CSS Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Choosing Between CSS Animation and Canvas Animation . . . . . . . . . . . . . . . . . . . . . . . . . 423
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
Q&A ................................................................................................... 424
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426

Part IV: Responsive Web Design

LESSON 16: Understanding the Importance of Responsive Web Design 427


What Is Responsive Web Design? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
What Is Progressive Enhancement? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Writing HTML for Responsive Web Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Validating HTML, CSS, and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Q&A ................................................................................................... 440
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442

LESSON 17: Designing for Mobile Devices 443


Designing for Mobile Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
Understanding Mobile First Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Using Responsive Tables and Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Creating Responsive Layouts Without Media Queries ................................ 464
Alternatives for Mobile Design Besides RWD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
Q&A ................................................................................................... 469
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470

LESSON 18: Using Media Queries and Breakpoints 471


What Is a Media Query? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Using Media Query Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
What Is a Breakpoint? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
xii Sams Teach Yourself HTML, CSS, and JavaScript All in One

How to Define Breakpoints in Your CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477


Optimal Breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Q&A ................................................................................................... 484
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486

Part V: Getting Started with Dynamic Sites

LESSON 19: Understanding Dynamic Websites and HTML5 Applications 487


Understanding the Different Types of Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
Including JavaScript in HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Displaying Random Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Understanding the Document Object Model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Changing Images Based on User Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Thinking Ahead to Developing HTML5 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Q&A ................................................................................................... 502
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506

LESSON 20: Getting Started with JavaScript Programming 507


Basic Concepts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
JavaScript Syntax Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Using Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Best Practices for JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Understanding JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Q&A ................................................................................................... 518
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522

LESSON 21: Working with the Document Object Model (DOM) 523
Understanding the Document Object Model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Using window Objects ........................................................................... 524
Working with the document Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Table of Contents xiii

Accessing Browser History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528


Working with the location Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
More About the DOM Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Working with DOM Nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Creating Positionable Elements (Layers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Hiding and Showing Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Modifying Text in a Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Adding Text to a Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Q&A ................................................................................................... 547
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550

LESSON 22: Using JavaScript Variables, Strings, and Arrays 551


Using Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
Understanding Expressions and Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
Data Types in JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Converting Between Data Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Using String Objects ........................................................................... 558
Working with Substrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Using Numeric Arrays ........................................................................... 564
Using String Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
Sorting a Numeric Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Using Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Introducing Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Using Objects to Simplify Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
Extending Built-in Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Using the Math Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Working with Math Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Working with Dates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Q&A ................................................................................................... 590
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
xiv Sams Teach Yourself HTML, CSS, and JavaScript All in One

LESSON 23: Controlling Flow with Conditions and Loops 595


The if Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
Using Shorthand Conditional Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Testing Multiple Conditions with if and else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
Using Multiple Conditions with switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
Using for Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Using while Loops ............................................................................... 606
Using do...while Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Working with Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Looping Through Object Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Q&A ................................................................................................... 612
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615

LESSON 24: Responding to Events and Using Windows 617


Understanding Event Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Using Mouse Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
Using Keyboard Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Using the load and unload Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
Using click to Change the Appearance of a <div> ................................. 631
Controlling Windows with Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Moving and Resizing Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643
Using Timeouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Displaying Dialog Boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650
Q&A ................................................................................................... 650
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654

LESSON 25: JavaScript Best Practices 655


Scripting Best Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
Reading Browser Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
Cross-Browser Scripting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
Table of Contents xv

Supporting Non-JavaScript-Enabled Browsers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671


Creating an Unobtrusive Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
Q&A ................................................................................................... 677
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680

LESSON 26: Using Third-Party JavaScript Libraries and Frameworks 681


Using Third-Party JavaScript Libraries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Adding JavaScript Effects by Using a Third-Party Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Using JavaScript Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Q&A ................................................................................................... 691
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694

Part VI: Advanced Website Functionality and Management

LESSON 27: Working with Web-Based Forms 695


How HTML Forms Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Creating a Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
Accepting Text Input ............................................................................. 702
Naming Each Piece of Form Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
Labeling Each Piece of Form Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
Grouping Form Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Exploring Form Input Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
Using HTML5 Form Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
Submitting Form Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Accessing Form Elements with JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
Q&A ................................................................................................... 725
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
xvi Sams Teach Yourself HTML, CSS, and JavaScript All in One

LESSON 28: Organizing and Managing a Website 729


When One Page Is Enough . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730
Organizing a Simple Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
Organizing a Larger Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
Optimizing Your Site for Search Engines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738
Writing Maintainable Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Thinking About Version Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
Using HTML and CSS Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Q&A ................................................................................................... 746
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750

Index 751
About the Authors

Jennifer Kyrnin consults professionally on web design and web development. She has built
and maintained websites of all sizes, from small single-page sites to large million-page
database-driven sites for international audiences. She has taught HTML, XML, and web
design online since 1997 and is the author of Sams Teach Yourself HTML5 Mobile Application
Development, Sams Teach Yourself Responsive Web Design, and Sams Teach Yourself Bootstrap.

Julie Meloni is a software development manager and technical consultant living in


Washington, DC. She has written several books and articles on web-based programming
languages and database topics, including the bestselling Sams Teach Yourself PHP, MySQL, and
Apache All in One.
Dedication

To Mark and Jaryth. As usual, you inspired me and kept me writing.

Acknowledgments

I would like to thank Mark Taber for thinking of me when this new edition came out. I couldn’t
have had a good-looking book without Kitty Wilson, my extraordinary copy editor. Any errors
are not her fault. And thanks also go to Julie Meloni for believing that I could take over her
book effectively. I hope I live up to her reputation.
Accessing the Free Web Edition

Your purchase of this book in any format, print or electronic, includes access to the
corresponding Web Edition, which provides several special features to help you learn:

N The complete text of the book online

N Interactive quizzes and exercises to test your understanding of the material

N Updates and corrections as they become available

The Web Edition can be viewed on all types of computers and mobile devices with any
modern web browser that supports HTML5.

To get access to the Web Edition of Sams Teach Yourself HTML, CSS, and JavaScript All in One,
Third Edition, all you need to do is register this book:

1. Go to www.informit.com/register.

2. Sign in or create a new account.

3. Enter the ISBN: 9780672338083.

4. Answer the questions as proof of purchase.

The Web Edition will appear under the Digital Purchases tab on your Account page.

Click the Launch link to access the product.


Reader Services

Register your copy of Sams Teach Yourself HTML, CSS, and JavaScript All in One at informit.com
for convenient access to downloads, updates, and corrections as they become available. To
start the registration process, go to informit.com/register and log in or create an account.*
Enter the product ISBN, 9780672338083, and click Submit. Once the process is complete, you
will find any available bonus content under Registered Products.

*Be sure to check the box that you would like to hear from us in order to receive exclusive
discounts on future editions of this product.
LESSON 1
Understanding
How the Web Works

What You’ll Learn in This Lesson:


N A very brief history of the World Wide Web
N What is meant by the term web page and why this term doesn’t always reflect all the content
involved
N How content gets from your personal computer to someone else’s web browser
N How to select a web hosting provider
N How different web browsers and device types can affect your content
N How to transfer files to your web server by using FTP
N Where files should be placed on a web server
N How to distribute web content without a web server
N How to use other publishing methods, such as blogs
N Tips for testing the appearance and functionality of web content

Before you learn the intricacies of HTML (Hypertext Markup Language), CSS (Cascading Style
Sheets), and JavaScript, it is important to gain a solid understanding of the technologies that
help transform these plain-text files to the rich multimedia displays you see on your computer or
handheld device when browsing the World Wide Web.

For example, a file containing HTML and CSS is useless without a web browser to view it, and no
one besides yourself will see your content unless a web server is involved. Web servers make your
content available to others, who, in turn, use their web browsers and other devices to navigate to
an address and wait for the server to send information to them. You will be intimately involved in
this publishing process because you must create files and then put them on a server to make them
available in the first place, and you must ensure that your content will appear to the end user as
you intended, whether the user has a screen the size of a watch face or a billboard.
2 LESSON 1: Understanding How the Web Works

A Brief History of HTML and


the World Wide Web
Once upon a time, back when there weren’t any footprints on the Moon, some farsighted folks
decided to see whether they could connect several major computer networks. We’ll spare you
the names and stories (there are plenty of both), but the eventual result was the “mother of all
networks,” which we now call the Internet.

Until 1990, accessing information through the Internet was a rather technical affair. It was so
hard, in fact, that even Ph.D.-holding physicists were often frustrated when trying to swap data.
One such physicist, the now-famous (and knighted) Sir Tim Berners-Lee, cooked up a way to easily
cross-reference text on the Internet through hypertext links.

This wasn’t a new idea, but his simple Hypertext Markup Language (HTML) managed to thrive
while more ambitious hypertext projects floundered. Hypertext originally meant text stored in
electronic form with cross-reference links between pages. It is now a broader term that refers to
just about any object (text, images, files, and so on) that can be linked to other objects. Hypertext
Markup Language is a language for describing how text, graphics, and files containing other
information are organized and linked.

By 1993, only 100 or so computers throughout the world were equipped to serve up HTML
pages. Those interlinked pages were dubbed the World Wide Web (WWW ), and several web
browser programs had been written to enable people to view web pages. Because of the growing
popularity of the Web, a few programmers soon wrote web browsers that could view graphical
images along with text. From that point forward, the continued development of web browser
software and the standardization of HTML has led us to the world we live in today, one in which
more than a billion websites serve billions of text and multimedia files.

NOTE
For more information on the history of the World Wide Web, see the Wikipedia article on this topic:
http://en.wikipedia.org/wiki/History_of_the_Web.

These few paragraphs provide a very brief history of what has been a remarkable period. Today’s
college students have never known a time in which the World Wide Web didn’t exist, and the
idea of always-on information and ubiquitous computing will shape all aspects of our lives moving
forward. Instead of seeing web content creation and management as a set of skills possessed by only
a few technically oriented folks (okay, call them geeks, if you will), by the end of these lessons, you
will see that these are skills that anyone can master, regardless of inherent geekiness.

Creating Web Content


You might have noticed the use of the term web content rather than web pages; that was
intentional. Although we talk of “visiting a web page,” what we really mean is something like
Understanding Web Content Delivery 3

“looking at all the text and the images at one address on our computer.” The text that we
read and the images that we see are rendered by our web browsers, which are given certain
instructions found in individual files.

Those files contain text that is marked up with, or surrounded by, HTML codes that tell the browser
the structure of the text—as a heading, as a paragraph, as a quotation, and so on. Some HTML
markup tells the browser to display an image or video file rather than plain text, which brings us
back to this point: Different types of content are sent to your web browser, so simply saying web
page doesn’t begin to cover it. Here we use the term web content instead, to cover the full range of
text, image, audio, video, and other media found online.

Other files contain CSS that tells the browser how a page should look—bold text, with a blue
border, red color, and so on. CSS defines how the browser should display the content structure
that is defined in the HTML.

In addition, JavaScript tells the browser how a page should interact with the user—changing
colors when clicked, making a sound when the page loads, and so on. Whereas HTML describes
the structure and CSS the design, JavaScript defines the behavior of the content, or how it
responds to different conditions.

In later lessons, you’ll learn the basics of linking to or creating the various types of multimedia
web content found in websites. You will also learn how to style that content with CSS and how
to make it interactive with JavaScript. All you need to remember at this point is that you are in
control of the content a user sees when visiting your website. Beginning with the file that contains
text to display or codes that tell the server to send a graphic along to the user’s web browser,
you have to plan, design, and implement all the pieces that will eventually make up your web
presence. As you will learn throughout these lessons, it is not a difficult process as long as you
understand all the little steps along the way.

In its most fundamental form, web content begins with a simple text file containing HTML
markup. In these lessons, you’ll learn about and compose standards-compliant HTML5 markup.
You will then learn how to decorate it with CSS and modern style properties and how to affect
the page behavior with unobtrusive JavaScript and modern JavaScript frameworks. One of the
many benefits of writing modern, standards-compliant code is that, in the future, you will not
have to worry about having to go back to your code to fundamentally alter it. Instead, your code
will (likely) always work for as long as web browsers adhere to standards (hopefully a long time),
and your code will work on any device that runs a standards-compliant browser (hopefully most
of them).

Understanding Web Content Delivery


Several processes occur, in many different locations, to eventually produce web content that you
can see. These processes occur very quickly—on the order of milliseconds—and occur behind the
4 LESSON 1: Understanding How the Web Works

scenes. In other words, although we might think all we are doing is opening a web browser, typ-
ing in a web address, and instantaneously seeing the content we requested, technology in the
background is working hard on our behalf. Figure 1.1 shows the basic interaction between a
browser and a server.

FIGURE 1.1
A browser request and a server response.

However, the process involves several steps—and potentially several trips between the browser and
the server—before you see the entire content of the site you requested.

Suppose you want to do a Google search, so you dutifully type www.google.com in the address
bar or select the Google bookmark from your bookmarks list. Almost immediately, your browser
shows you something like what’s shown in Figure 1.2.

FIGURE 1.2
Visiting www.google.com.
Understanding Web Content Delivery 5

Figure 1.2 shows a website that contains text plus one image (the Google logo). A simple version
of the processes that occurred to retrieve that text and image from a web server and display it on
your screen follows:

1. Your web browser sends a request for the index.html file located at the
http://www.google.com address. The index.html file does not have to be part of the
address that you type in the address bar; you’ll learn more about the index.html file
further along in this lesson.

2. After receiving the request for a specific file, the web server process looks in its directory
contents for the specific file, opens it, and sends the content of that file back to your web
browser.

3. The web browser receives the content of the index.html file, which is text marked up with
HTML codes, and renders the content based on these HTML codes. While rendering the
content, the browser happens upon the HTML code for the Google logo, which you can see
in Figure 1.2. The HTML code looks something like this:
<img alt="Google" src="/images/srpr/logo4w.png"
width="275" height="95">

The <img> tag provides attributes that tell the browser the file source location (src),
alternate text (alt), width (width), and height (height) necessary to display the logo.
(You’ll learn more about attributes throughout later lessons.)

4. The browser looks at the src attribute in the <img> tag to find the source location. In
this case, the image logo4w.png can be found in the images directory at the same
web address (www.google.com) from which the browser retrieved the HTML file.

5. The browser requests the file at the web address http://www.google.com/images/srpr/


logo4w.png.

6. The web server interprets that request, finds the file, and sends the contents of that file to
the web browser that requested it.

7. The web browser displays the image on your monitor.

As you can see in the description of the web content delivery process, web browsers do more than
simply act as picture frames through which you can view content. Browsers assemble the web
content components and arrange those parts according to the HTML commands in the file.

It is possible to view web content locally—that is, on your own hard drive—without the need for
a web server. The process of content retrieval and display is the same as the process listed in
the previous steps, in that a browser looks for and interprets the codes and content of an HTML
file. However, the trip is shorter: The browser looks for files on your own computer’s hard drive
rather than on a remote machine. A web server would be needed to interpret any server-based
6 LESSON 1: Understanding How the Web Works

programming language embedded in the files, but that is beyond the scope of these lessons. In
fact, you could work through all the lessons without having a web server to call your own, but
then nobody but you could view your masterpieces.

Selecting a Web Hosting Provider


Despite my just telling you that you can work through all these lessons without having a web
server, having a web server is the recommended method for continuing. Don’t worry; obtaining
a hosting provider is usually a quick, painless, and relatively inexpensive process. In fact, you can
get your own domain name and a year of web hosting for just slightly more than the cost of the
lessons you are reading now.

If you type web hosting provider in your search engine of choice, you will get millions of hits and
an endless list of sponsored search results (also known as ads). Even if you are looking at a man-
aged list of hosting providers, it can be overwhelming—especially if all you are looking for is a
place to host a simple website for yourself or your company or organization.

You’ll want to narrow your search when looking for a provider and choose one that best meets
your needs. Some selection criteria for a web hosting provider follow:

N Reliability/server “uptime”—If you have an online presence, you want to make sure people
can actually get there consistently.

N Customer service—Look for multiple methods for contacting customer service (phone,
email, chat), as well as online documentation for common issues.

N Server space—Does the hosting package include enough server space to hold all the
multimedia files (images, audio, video) you plan to include in your website (if any)?

N Bandwidth—Does the hosting package include enough bandwidth that all the people
visiting your site and downloading files can do so without your having to pay extra?

N Domain name purchase and management—Does the package include a custom domain
name, or must you purchase and maintain your domain name separately from your hosting
account?

N Price—Do not overpay for hosting. You will see a wide range of prices offered and should
immediately wonder, “What’s the difference?” Often the difference has little to do with the
quality of the service and everything to do with company overhead and what the company
thinks it can get away with charging people. A good rule of thumb is that if you are paying
more than $75 per year for a basic hosting package and domain name, you are probably
paying too much.

Here are three reliable web hosting providers whose basic packages contain plenty of server space
and bandwidth (as well as domain names and extra benefits) at a relatively low cost:
Selecting a Web Hosting Provider 7

NOTE
The authors have used all these providers (and then some) over the years and have no problem
recommending any of them. Julie predominantly uses DailyRazor as a web hosting provider,
especially for advanced development environments, while Jennifer tends to use Bluehost.

N A Small Orange (www.asmallorange.com)—The Tiny and Small shared hosting packages


are perfect starting places for a new web content publisher.

N DailyRazor (www.dailyrazor.com)—Its website hosting package is full featured and reliable.

N Bluehost (www.bluehost.com)—The Basic shared hosting package is suitable for many per-
sonal and small business websites.

If you don’t go with any of these web hosting providers, you can at least use their basic package
descriptions as a guideline as you shop around.

One feature of a good hosting provider is that it provides a “control panel” for you to manage
aspects of your account. Figure 1.3 shows the control panel for a hosting account at DailyRazor.
Many web hosting providers offer this particular control panel software (called cPanel) or another
control panel that is similar in design—with clearly labeled icons leading to tasks you can perform
to configure and manage your account.

FIGURE 1.3
A sample control panel.
8 LESSON 1: Understanding How the Web Works

You might never need to use your control panel, but having it available to you simplifies the
installation of databases and other software, the viewing of web statistics, and the addition of
email addresses (among many other features). If you can follow instructions, you can manage
your own web server—no special training required.

Testing with Multiple Web Browsers and


Devices
Now that we’ve just discussed the process of web content delivery and the acquisition of a web
server, it might seem a little strange to step back and talk about testing your websites with mul-
tiple web browsers and devices. However, before you go off and learn all about creating websites
with HTML and CSS, do so with this very important statement in mind: Every visitor to your web-
site will potentially use hardware and software configurations that are different from your own,
including their device types (desktop, laptop, tablet, phone), operating systems (Windows, Mac,
Android, iOS), screen resolutions, browser types, browser window sizes, and connection speeds.
Remember that you cannot control any aspect of what your visitors use when they view your site.
So just as you’re setting up your web hosting environment and getting ready to work, think about
downloading several web browsers so that you have a local test suite of tools available to you.
Let us explain why this is important.

Although all web browsers process and handle information in the same general way, some specific
differences among them result in things not always looking the same in different browsers. Even
users of the same version of the same web browser can alter how a page appears by choosing
different display options and/or changing the size of their viewing windows. All the major web
browsers allow users to override the background colors and fonts the web page author specifies
with those of their own choosing. Screen resolution, window size, and optional toolbars can also
change how much of a page someone sees when it first appears on their screens. You can ensure
only that you write standards-compliant HTML and CSS.

NOTE
In Part IV, “Responsive Web Design,” you’ll learn about the concept of responsive web design, in
which the design of a site shifts and changes automatically depending on the user’s behavior and
viewing environment (screen size, device, and so on).

Do not, under any circumstances, spend hours on end designing something that looks perfect
only on your own computer—unless you are willing to be disappointed when you look at it on your
friend’s computer, on the computer in the coffee shop down the street, or on your iPhone.

You should always test your websites with as many of these web browsers as possible:

N Apple Safari (https://www.apple.com/safari/) for Mac

N Google Chrome (https://www.google.com/chrome/) for Mac, Windows, and Linux/UNIX


Creating a Sample File 9

N Mozilla Firefox (https://www.mozilla.com/firefox/) for Mac, Windows, and Linux/UNIX

N Microsoft Edge (https://www.microsoft.com/edge/) for Windows

N Opera (https://www.opera.com) for Mac, Windows, and Linux/UNIX

Now that you have a development environment set up, or at least some idea of the type you’d like
to set up in the future, let’s move on to creating a test file.

Creating a Sample File


Before you actually create a file, take a look at Listing 1.1. This listing represents a simple piece
of web content—a few lines of HTML that print "Hello World! Welcome to My Web
Server." in large bold letters on two lines centered within the browser window. You’ll learn
more about the HTML and CSS used within this file as you read future lessons.

LISTING 1.1 Our Sample HTML File


<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Hello World!</title>
</head>
<body>
<h1 style="text-align: center;">Hello World!<br>
Welcome to My Web Server.</h1>
</body>
</html>

To make use of this content, open a text editor of your choice, such as Notepad (on Windows) or
TextEdit (on a Mac). Do not use WordPad, Microsoft Word, or other full-featured word processing
software because those programs create different sorts of files from the plain-text files we use for
web content.

Most web designers don’t use Notepad or TextEdit for writing web pages. Instead, they use editors
designed specifically for the purpose. These editors give you more features to make it easy to write
and design web pages. The following are some of the most popular editors:

N Coda (https://panic.com/coda/)—A text editor for Mac made specifically for editing
web pages.

N HTML-Kit (https://www.htmlkit.com)—A popular text editor for Windows. The older


versions are free.
10 LESSON 1: Understanding How the Web Works

N Komodo Edit (https://www.activestate.com/komodo-edit)—A free, open-source version of


the popular Komodo IDE. It runs on Windows, Mac, and Linux.

N Notepad++ (https://notepad-plus-plus.org)—A free, open-source editor for Windows.

N Sublime Text (https://sublimetext.com)—A popular editor for all platforms that also has a
healthy ecosystem of free plug-ins.

Once you’ve decided on the editor you want to use, type the content that you see in Listing 1.1
and then save the file, using sample.html as the filename. The .html extension tells the web
server that your file is written in HTML. When the file contents are sent to the web browser that
requests it, the browser will also know that it is HTML and will render it appropriately.

Now that you have a sample HTML file to use—and hopefully somewhere to put it, such as a web
hosting account—let’s get to publishing your web content.

Using F TP to Transfer Files


As you’ve learned so far, you have to put your web content on a web server to make it accessible
to others. This process typically occurs by using File Transfer Protocol (F TP). To use FTP, you need an
FTP client—a program used to transfer files from your computer to a web server.

FTP clients require three pieces of information to connect to your web server; this information will
have been sent to you by your hosting provider after you set up your account:

N The hostname, or address, to which you will connect

N Your account username

N Your account password

When you have this information, you are ready to use an FTP client to transfer content to your
web server.

Selecting an F TP Client
All FTP clients generally use the same type of interface. Figure 1.4 shows an example of FireFTP,
which is an FTP client used with the Firefox web browser. The directory listing of the local machine
(your computer) appears on the left of the screen, and the directory listing of the remote machine
(the web server) appears on the right. Typically, you see right arrow and left arrow buttons, as
shown in Figure 1.4. The right arrow sends selected files from your computer to your web server;
the left arrow sends files from the web server to your computer. Many FTP clients also enable you
to simply select files and then drag and drop them to the target machines.
Using FTP to Transfer Files 11

FIGURE 1.4
The FireF TP interface.

NOTE
Many web editing programs include a built-in FTP client. If you are planning on using a web editing
program, find out if it does before you download (or purchase) another FTP client.

Many FTP clients are freely available to you, but you can also transfer files via the web-based File
Manager tool that is likely part of your web server’s control panel. However, that method of file
transfer typically introduces more steps into the process and isn’t nearly as streamlined (or simple)
as the process of installing an FTP client on your own machine.

Here are some popular free FTP clients:

N Classic FTP (https://www.nchsoftware.com/classic/) for Mac and Windows

N Cyberduck (https://cyberduck.io) for Mac

N FileZilla (https://filezilla-project.org) for all platforms

N Transmit (https://panic.com/transmit) for Mac

When you have selected an FTP client and installed it on your computer, you are ready to upload
and download files from your web server. In the next section, you’ll see how this process works,
using the sample file from Listing 1.1.
12 LESSON 1: Understanding How the Web Works

Using an F TP Client
The following steps show how to use Transmit to connect to your web server and transfer a file.
However, all FTP clients use similar interfaces, so if you understand the following steps, you should
be able to use any FTP client.

Remember that you first need the hostname, the account username, and the account password.
When you have them, follow these steps:

1. Start the Transmit program and click the FTP tab. You are prompted to fill out information
for the site to which you want to connect, as shown in Figure 1.5.

FIGURE 1.5
Connecting to a new site in Transmit.

2. Fill in each of the items shown in Figure 1.5, as described here:

N The Server is the FTP address of the web server to which you need to send your
web pages. Your hosting provider will have given you this address. It probably is
yourdomain.com, but check the information you received when you signed up for
service.

N Complete the User Name field and the Password field using the information your
hosting provider gave you.
Using FTP to Transfer Files 13

N Leave the Initial Path field blank for now. You learn more about this later in the
lesson.

N Leave the Port field set to 21 and choose FTP unless your hosting provider specified to
use SSL or TLS/SSL.

N When you’re finished with the settings, click Connect to go to the FTP server. You can
click the plus icon if you want to add this server to your favorites.

You now see a countdown timer in the lower right, indicating that Transmit is attempting to
connect to the web server. Upon successful connection, you see an interface like the one in
Figure 1.6, showing the contents of the local directory on the left and the contents of your
web server on the right.

FIGURE 1.6
A successful connection to a remote web server via Transmit.

You are now almost ready to transfer files to your web server. All that remains is to change
directories to what is called the document root of your web server. The document root of
your web server is the directory that is designated as the top-level directory for your web
content—the starting point of the directory structure, which you’ll learn more about later
in this lesson. Often, this directory is named public_html, www (because www has been
created as an alias for public_html), or htdocs. You do not have to create this directory;
your hosting provider will have created it for you.
14 LESSON 1: Understanding How the Web Works

3. Double-click the document root directory name to open it. The display shown on the right
of the FTP client interface changes to show the contents of this directory. (It will probably
be empty at this point, unless your web hosting provider has put placeholder files in that
directory on your behalf.)

4. The goal is to transfer the sample.html file you created earlier from your computer to
the web server, so find the file in the directory listing on the left of the FTP client interface
(navigate if you have to).

5. Click the file and drag it to the right side of the window to send the file to the web server.
(Alternatively, you can double-click the file to transfer it.) When the file transfer completes,
the right side of the client interface refreshes to show you that the file has made it to its
destination.

6. Go to the File menu and choose Disconnect to close the connection and then exit the
Transmit program.

These steps are conceptually similar to the steps you take anytime you want to send files to your
web server via FTP. You can also use your FTP client to create subdirectories on the remote web
server. To create a subdirectory using Transmit, right-click in the directory you want the folder to
be in and choose New Folder. Different FTP clients have different interface options for achieving
the same goal.

Understanding Where to Place Files on the


Web Server
An important aspect of maintaining web content is determining how you will organize that
content—not only for the user to find but also for you to maintain on your server. Putting files in
directories helps you manage those files.

How you name and organize directories on your web server and whether you develop rules for
file maintenance are completely up to you. Maintaining a well-organized server makes your
management of its content more efficient in the long run.

Basic File Management


As you browse the Web, you might have noticed that URLs change as you navigate through web-
sites. For instance, if you’re looking at a company’s website and you click on graphical navigation
leading to the company’s products or services, the URL probably changes from

http://www.companyname.com/
to

http://www.companyname.com/products/
Understanding Where to Place Files on the Web Server 15

or

http://www.companyname.com/services/

In the preceding section, we used the term document root without really explaining what that is
all about. The document root of a web server is essentially the trailing slash in the full URL. For
instance, if your domain is yourdomain.com and your URL is http://www.yourdomain.com/, the
document root is the directory represented by the trailing slash (/). The document root is the start-
ing point of the directory structure you create on your web server; it is the place where the web
server begins looking for files requested by the web browser.

If you put the sample.html file in your document root as previously directed, you will be able to
access it via a web browser at the following URL:

http://www.yourdomain.com/sample.html

If you entered this URL into your web browser, you would see the rendered sample.html file, as
shown in Figure 1.7.

FIGURE 1.7
The sample.html file, accessed via a web browser.

However, if you created a new directory within the document root and put the sample.html file
in that directory, the file would be accessed at this URL:

http://www.yourdomain.com/newdirectory/sample.html

If you put the sample.html file in the directory you originally saw upon connecting to your
server—that is, if you did not change directories and place the file in the document root—the
sample.html file would not be accessible from your web server at any URL. The file would still
16 LESSON 1: Understanding How the Web Works

be on the machine that you know as your web server, but because the file is not in the document
root—where the server software knows to start looking for files—it will never be accessible to
anyone via a web browser.

The bottom line? Always navigate to the document root of your web server before you start
transferring files. And if your FTP client allows, change the default starting directory to your
document root, just to be extra careful.

This is especially true with graphics and other multimedia files. A common directory on web servers
is called images, where, as you can imagine, all the image assets are placed for retrieval. Other
popular directories include css for style sheet files (if you are using more than one) and js for
external JavaScript files. Alternatively, if you know that you will have an area on your website where
visitors can download many types of files, you might simply call that directory downloads.

Whether it’s a ZIP file containing your art portfolio or an Excel spreadsheet with sales numbers,
it’s often useful to publish files on the Internet that aren’t simply web pages. To make available
on the Web a file that isn’t an HTML file, just upload the file to your website as if it were an HTML
file, following the instructions earlier in this lesson for uploading. After the file is uploaded to the
web server, you can create a link to it (as you’ll learn in Lesson 7, “Using External and Internal
Links”). In other words, your web server can serve much more than HTML.

Here’s a sample of the HTML code that you will learn more about later in these lessons. The
following code would be used for a file named artfolio.zip, located in the downloads
directory of your website, and with link text that reads Download my art portfolio!:
<a href="/downloads/artfolio.zip">Download my art portfolio!</a>

Using an Index Page


When you think of an index, you probably think of the section in the back of a book that tells
where to look for various keywords and topics. The index file in a web server directory can serve a
similar purpose—if you design it that way. In fact, that’s where the name originates.

The index.html file (or just index file, as it’s usually referred to) is the name you give to the
page you want people to see as the default file when they navigate to a specific directory in your
website.

Another function of the index page is that users who visit a directory on your site that has an
index page but who do not specify that page will still land on the main page for that section of
your site—or for the site itself.

For instance, you can type either of the following URLs and land on Apple’s iPhone informational
page:

http://www.apple.com/iphone/
http://www.apple.com/iphone/index.html
Distributing Content Without a Web Server 17

If there were no index.html page in the iphone directory, the results would depend on the
configuration of the web server. If the server is configured to disallow directory browsing, the
user would see a “Directory Listing Denied” message when attempting to access the URL without
a specified page name. However, if the server is configured to allow directory browsing, the user
would see a list of the files in that directory.

Your hosting provider will already have determined these server configuration options. If your
hosting provider enables you to modify server settings via a control panel, you can change these
settings so that your server responds to requests based on your own requirements.

Not only is the index file used in subdirectories, but it’s used in the top-level directory (or docu-
ment root) of your website as well. The first page of your website—or home page or main page,
or however you like to refer to the web content you want users to see when they first visit your
domain—should be named index.html and placed in the document root of your web server.
This ensures that when users type http://www.yourdomain.com/ into their web browsers, the
server responds with the content you intended them to see (instead of “Directory Listing Denied”
or some other unintended consequence).

Distributing Content Without a Web Server


Publishing HTML and multimedia files online is obviously the primary reason to learn HTML and
create web content. However, there are also situations in which other forms of publishing may
be useful? For example, you might want to distribute CD-ROMs, DVD-ROMs, or USB drives at a
trade show with marketing materials designed as web content—that is, hyperlinked text viewable
through a web browser but without a web server involved. You might also want to include HTML-
based instructional manuals on removable media for students at a training seminar. These are
just two examples of how HTML pages can be used in publishing scenarios that don’t involve the
Internet.

This process is called creating local sites; even though no web server is involved, these bundles
of hypertext content are still called sites. The local term comes into play because your files are
accessed locally and not remotely (via a web server).

Publishing Content Locally


Let’s assume that you need to create a local site that you want to distribute on a USB drive. Even
the cheapest USB drives hold so much data these days—and basic hypertext files are quite small—
that you can distribute an entire site and a fully functioning web browser all on one little drive.
18 LESSON 1: Understanding How the Web Works

NOTE
Distributing a web browser isn’t required when you are creating and distributing a local site, although
it’s a nice touch. You can reasonably assume that users have their own web browsers and will open
the index.html file in a directory to start browsing the hyperlinked content. However, if you want
to distribute a web browser on the USB drive, go to https://portableapps.com/ and look for Portable
Firefox or Portable Chrome.

You can think of the directory structure of your USB drive just as you would the directory structure
of your web server. The top level of the USB drive directory structure can be your document root.
Or if you are distributing a web browser along with the content, you might have two directories—
for example, one named browser and one named content. In that case, the content directo-
ry would be your document root. Within the document root, you could have additional subfolders
in which you place content and other multimedia assets.

It’s as important to maintain good organization with a local site as it is with a remote website so
that you avoid broken links in your HTML files. You’ll learn more about the specifics of linking
files in Lesson 7.

Publishing Content on a Blog


You might have a blog hosted by a third party, such as WordPress, Tumblr, or Blogger, and thus
have already published content without having a dedicated web server or even knowing any
HTML. These services offer visual editors in addition to source editors, meaning that you can type
your words and add presentational formatting such as bold, italics, or font colors without know-
ing the HTML for these actions. The content becomes actual HTML when you click the Publish but-
ton in these editors.

However, with the knowledge you will acquire from these lessons, your blogging will be enhanced
because you will be able to use the source editor for your blog post content and blog templates,
and this will afford you more control over the look and feel of that content. These actions occur
differently from the process you learned for creating an HTML file and uploading it via FTP to
your own dedicated web server, but we would be remiss if we did not note that blogging is, in fact,
a form of web publishing.

Tips for Testing Web Content


Whenever you transfer files to your web server or place them on removable media for local brows-
ing, you should test every page thoroughly. The following list helps you ensure that your web con-
tent behaves the way you expect. Note that some of the terms might be unfamiliar to you at this
point, but come back to this list as you progress through these lessons and create larger projects:

N Before you transfer your files, test them locally on your machine to ensure that the links
work and the content reflects the visual design you intended. After you transfer the pages to
a web server or removable device, test them all again.
Summary 19

N Perform these tests with as many browsers and devices as you can—Chrome, Firefox,
Microsoft Edge, Opera, and Safari is a good list—and on both Mac and Windows platforms,
as well as mobile devices like phones and tablets. If possible, check at low resolution
(800 × 600) and high resolution (1920 × 1080).

N Turn off auto image loading in your web browser before you start testing so that you can see
what each page looks like without the graphics. Check your alt text and then turn image
loading back on to load the graphics and carefully review the page again.

N Use your browser’s font size settings to look at each page in various font sizes to ensure that
your layout doesn’t fall to pieces if users override your font specifications with their own.

N Wait for each page to completely finish loading and then scroll all the way down to make
sure all images appear where they should.

N Time how long it takes each page to load. Use a tool like Google Page Speed
(https://developers.google.com/speed/) to make sure it isn’t too slow. Slow pages annoy
users and can get your site penalized by search engines.

If your pages pass all those tests, you can rest easy: Your site is ready for public viewing.

Summary
This lesson introduced you to the concept of using HTML to mark up text files to produce web con-
tent. You learned that HTML generates the structure, while CSS creates the look, and JavaScript
controls the behavior of the pages. You also learned that there is more to web content than just
the “page”; web content also includes image, audio, and video files. All this content lives on a
web server—a remote machine often far from your own computer. On your computer or other
device, you use a web browser to request, retrieve, and eventually display web content onscreen.

You learned the criteria to consider when determining whether a web hosting provider fits your
needs. After you have selected a web hosting provider, you can begin to transfer files to your web
server by using an FTP client, which you also learned how to do. You also learned a bit about web
server directory structures and file management, as well as the very important purpose of the
index.html file in a given web server directory. In addition, you learned that you can distrib-
ute web content on removable media, and you learned how to go about structuring the files and
directories to achieve the goal of viewing content without using a remote web server.

Finally, you learned the importance of testing your work in multiple browsers after you’ve placed
it on a web server. Writing valid, standards-compliant HTML and CSS helps ensure that your site
looks reasonably similar for all visitors, but you still shouldn’t design without receiving input from
potential users outside your development team; it is especially important to get input from others
when you are a design team of one!
20 LESSON 1: Understanding How the Web Works

Q&A
Q. I’ve looked at the HTML source of some web pages on the Internet, and it looks frighteningly
difficult to learn. Do I have to think like a computer programmer to learn this stuff?
A. Although complex HTML pages can indeed look daunting, learning HTML is much easier
than learning actual software programming languages (such as C++ or Java). HTML is
a markup language rather than a programming language; you mark up text so that the
browser can render the text a certain way. It requires a completely different set of thought
processes than developing a computer program. You really don’t need any experience or
skill as a computer programmer to be a web content author.

Q. Running all the tests you recommend would take longer than creating my pages! Can’t I get
away with less testing?
A. If your pages aren’t intended to make money or provide an important service, it’s probably
not a big deal if they look funny to some users or produce errors once in a while. In that
case, just test each page with a couple different browsers and call it a day. However, if you
need to project a professional image, there is no substitute for rigorous testing.

Q. Seriously, who cares how I organize my web content?


A. Believe it or not, the organization of your web content does matter to search engines and
potential visitors to your site. But overall, having an organized web server directory structure
helps you keep track of content that you are likely to update frequently. For instance, if you
have a dedicated directory for images or multimedia, you know exactly where to look for a
file you want to update—no need to hunt through directories containing other content.

Workshop
The Workshop contains quiz questions and exercises to help you solidify your understanding of
the material covered.

Quiz
1. How many files would you need to store on a web server to produce a single web page with
some text and two images on it?
2. How many requests to the server would a browser make to display a web page with some
text and two images on it?
3. What are some of the features to look for in a web hosting provider?
4. How many browsers should you use to test your web pages?
5. What type of editor should you use to create web pages?
6. What three pieces of information do you need in order to connect to your web server
via F TP?
Workshop 21

7. What is the document root?


8. Is it possible to publish web pages to a USB drive?
9. What is the purpose of the index.html file?
10. Does your website have to include a directory structure?

NOTE
Just a reminder for those of you reading these words in the print or e-book edition of this book:
If you go to www.informit.com/register and register this book (using ISBN 9780672338083), you
can receive free access to an online Web Edition that not only contains the complete text of this
book, but also features an interactive version of this quiz.

Answers
1. You would need three: one for the web page itself, which includes the text and the HTML
markup, and one for each of the two images.
2. There would be three requests to the server: one for the HTML itself and one for each of
the two images.
3. Look for reliability, customer service, web space and bandwidth, domain name service,
site-management extras, and price.
4. You should test your website in as many browsers and on as many devices as possible.
5. You should use a text editor such as Notepad or TextEdit. You can also use an editor
specifically for writing HTML, such as Komodo Edit or Coda.
6. You need the hostname, your account username, and your account password.
7. The document root is the top-level directory on a web server—the trailing slash after the
domain name.
8. Yes. This is called publishing content locally.
9. The index.html file is typically the default file for a directory in a web server. It enables
users to access http://www.yourdomain.com/somedirectory/ without using a trailing
filename and still end up in the appropriate place.
10. No. Using a directory structure for file organization is completely up to you, although using
one is highly recommended because it simplifies content maintenance.
22 LESSON 1: Understanding How the Web Works

Exercises
N Get your web hosting in order: Are you going to move through the lessons by viewing
files locally on your own computer, or are you going to use a web hosting provider? Note
that most web hosting providers will have you up and running the same day you pur-
chase your hosting plan. Name three possible hosting providers.
N If you are using an external hosting provider, then use your FTP client to create a sub-
directory within the document root of your website. Paste the contents of the sample.
html file into another file named index.html, change the text between the <title>
and </title> tags to something new, and change the text between the <h1> and
</h1> tags to something new. Save the file and upload it to the new subdirectory. Use
your web browser to navigate to the new directory on your web server and ensure that
the content in the index.html file appears. Then, using your FTP client, delete the
index.html file from the remote subdirectory. Return to that URL with your web
browser, reload the page, and see how the server responds without the index.html
file in place. Name two FTP clients.
N Using the same set of files created in the preceding exercise, place these files on a
removable media device—a CD-ROM or a USB drive, for example. Use your browser to
navigate this local version of your sample website and think about the instructions you
would have to distribute with this removable media so that others could use it.
LESSON 2
Structuring an HTML Document

What You’ll Learn in This Lesson:


N How to create a simple web page in HTML
N How to include all the HTML tags that every web page must have
N How to organize a page with paragraphs and line breaks
N How to organize your content with headings
N How to use the semantic elements of HTML5
N How to use semantic tags to indicate header and footer content
N How to use semantic tags to indicate navigational and secondary content
N How to use semantic tags to better structure body content

In the first lesson, you got a basic idea of the process behind creating web content and viewing
it online (or locally, if you do not yet have a web hosting provider). In this lesson, we get down
to the business of explaining the various elements that must appear in an HTML file so that it is
displayed appropriately in your web browser.

In general, this lesson provides a summary of HTML basics and gives some practical tips to help
you make the most of your time as a web page developer. You’ll begin to dive a bit deeper into
the theory behind it all as you learn about the HTML5 elements that enable you to enhance the
semantics—the meaning—of the information that you provide in your marked-up text. You’ll
take a closer look at six elements that are fundamental to solid semantic structuring of your
documents: <header>, <section>, <article>, <nav>, <aside>, and <footer>.

Throughout the remainder of these lessons, you will see these tags used appropriately in the
code samples, so this lesson makes sure that you have a good grasp of their meaning before you
continue.
24 LESSON 2: Structuring an HTML Document

Getting Prepared
Here’s a review of what you need to do before you’re ready to move on in this lesson:

1. Get a computer. We used a Mac computer to test the sample web content and capture the
figures shown in these lessons, but you can use any Windows, Mac, or Linux/UNIX machine
to create and view your web content. You can even use a tablet or smartphone, but that is
more difficult. For the purposes of these lessons, it’s best to get a computer or laptop.

2. Get a connection to the Internet. Whether you have a dial-up, wireless, or broadband con-
nection doesn’t matter for the creation and viewing of your web content, but the faster the
connection, the better for the overall experience. The Internet service provider (ISP), school,
or business that provides your Internet connection can help you with the details of setting it
up properly. In addition, many public spaces such as coffee shops, bookstores, and libraries
offer free wireless Internet service that you can use if you have a laptop computer with Wi-Fi
network support.

3. Get web browser software. This is the software your computer needs in order to retrieve
and display web content. As you learned in the first lesson, the most popular browsers (in
alphabetical order) are Apple Safari, Google Chrome, Microsoft Edge, Mozilla Firefox, and
Opera. It’s a good idea to install several of these browsers so that you can experiment and
make sure your content looks consistent across them all; you can’t make assumptions about
the browsers other people are using.

4. Explore! Use a web browser to look around the Internet for websites that are similar in
content or appearance to those you’d like to create. Note what frustrates you about
some pages, what attracts you and keeps you reading others, and what makes you come
back to some pages over and over again. If a particular topic interests you, consider
searching for it using a popular search engine such as Google (www.google.com) or Bing
(www.bing.com).

CAUTION
Although all web browsers process and handle information in the same general way, some
specific differences among them mean that things do not always look the same in differ-
ent browsers. Be sure to check your web pages in multiple browsers to make sure they look
reasonably consistent.
This is doubly true for mobile devices. More and more people use mobile devices such as phones
and tablets to access web pages, and the browsers on those devices can display your pages in
surprising ways. Always test your pages in as many different devices and screen sizes as possible,
along with the different web browsers.
Another Random Scribd Document
with Unrelated Content
The Project Gutenberg eBook of Demonien
ruhtinatar: Kertomus
This ebook is for the use of anyone anywhere in the United States
and most other parts of the world at no cost and with almost no
restrictions whatsoever. You may copy it, give it away or re-use it
under the terms of the Project Gutenberg License included with this
ebook or online at www.gutenberg.org. If you are not located in the
United States, you will have to check the laws of the country where
you are located before using this eBook.

Title: Demonien ruhtinatar: Kertomus

Author: Nikolai Vasilevich Gogol

Release date: April 11, 2016 [eBook #51729]

Language: Finnish

Credits: E-text prepared by Tapio Riikonen

*** START OF THE PROJECT GUTENBERG EBOOK DEMONIEN


RUHTINATAR: KERTOMUS ***
E-text prepared by Tapio Riikonen

DEMONIEN RUHTINATAR
Kertomus

Kirj.

NIKOLAI GOGOL

Suom. K. Repo

Kustannusosakeyhtiö Kirja, Helsinki, 1914.


Oy Weilin & Göös Ab.
ESIPUHE

Nikolai Vasiljevuitsh Gogol on saanut osakseen mainetta ja ihailua


Venäjän kirjallisuuden realistisen suunnan varsinaisena
uranuurtajana, venäläisen draaman luojana, ja maansa kirjallisuuden
kenties suurimpana ja terveimpänä humoristina.

Gogol syntyi 12 p. maalisk. 1809 Sorovintsassa, Poltavan ja


Mirgorodin kihlakuntien rajalla, isänsä, vähävenäläisen kirjailijan
maatilalla. Hän vietti lapsuutensa vähävenäläisen luonnon ja tapojen
välittömässä keskuudessa, oppi jo nuorena rakastamaan
isänmaataan, mikä tunne hänessä oli voimakas koko hänen
elämänsä ajan. Hurmaava Ukrainan luonto, kansan laulut, sadut ja
kertomukset rikastuttivat pojan mielikuvitusta ja kehittivät hänen
luovaa voimaansa. Isän viehättävät kertomukset taas tutustuttivat
hänet Vähävenäjän historialliseen entisyyteen. Isä käytti poikaansa
teatterissa, herättäen hänessä rakkauden näytelmätaiteeseen. Äidin,
haaveilevan ja uskonnollisen naisen vaikutus poikaan oli aivan
toinen. Hän kertoi pojalleen räikein värein kuvauksia viimeisestä
tuomiosta, paratiisin autuudesta ja ikuisesta piinasta, vaikuttaen
osaltaan sen äärimmäisen mystillisyyden kehitykseen, johon hän
sittemmin joutui.
Päätettyään opintonsa Neshinin lyseossa, läksi Gogol joulukuussa
v. 1828 Pietariin hehkuvana romantikkona, täynnä ylpeitä haaveita,
mutta lyseosta saamansa tiedot hyvin puutteellisina ja
maailmankatsomuksensa sangen keskiaikaisessa asussa, "Hans
Kühelgarten"-niminen runoidylli ja joukko suosituskirjeitä
matkalaukussa. Suosituskirjeistä ei ollut mitään apua. Hänen
yrityksensä päästä näyttämötaiteen palvelukseen ei onnistunut.
Hänen idyllinsäkin sai niin kylmän arvostelun, että hän poltti koko
painoksen. Monien vaiheiden perästä sai hän vihdoin paikan
apanasiosaston kansliassa. Mutta huono palkka ja raskas,
koneellinen kirjurin työ ei tietysti voinut tyydyttää kunnianhimoista
nuorukaista. Ja niinpä hän joka päivä alkoi tuntea yhä enemmän ja
enemmän kutsumusta kirjailijan uralle. Mutta kahden vuoden ankara
kokemus pakotti hänet laskeutumaan sentimentaalisen romantikan
pilventakaisista korkeuksista elävän todellisuuden pohjalle.

Kotiseutuikävä, jota Pietarin synkkä ja kylmä taivas, nälkä ja


kuolettava kansliatyö yhä kiihdyttivät, johti Gogolin siihen, että ihana
Ukraina alkoi hänelle esiintyä erikoisena runollisena lumomaana, ja
niin päätti hän kuvata sen hurmaavassa, tenhoavassa runoudessa.
Tuloksena olivat "Iltoja maalaistalossa Dikankon luona", joka perusti
Gogolin maineen. Ensimäinen tämän sarjan kertomus
"Juhannusaattoyö" julkaistiin v. 1830 "Otetshestvenni Sapiskissa"
suuresti muutettuna. Samana vuonna Gogol tutustui Ihukovskiin ja
Pletneviin, joista viimeksi mainittu hankki hänelle opettajan paikan
Isänmaallisessa opistossa, jossa hän oli inspehtorina. Kaikki tämä sai
aikaan täydellisen käännöksen Gogolin elämässä. Mutta kaikkein
tärkein ja terveellisin oli hänelle tutustuminen Pushkiniin ja
liittyminen hänen piiriinsä. Pushkinin vaikutus Gogoliin oli suuri. Eipä
syyttä hän pitänytkään Pushkinia opettajanaan, jota hän sai kiittää
maineestaan ja menestyksestään kirjallisessa toiminnassaan. Pushkin
ensimäisenä käsitti ja arvosteli hänen lahjansa niin suuriksi, että
antoi hänelle aiheet "Revisoriin" ja "Kuolleisiin sieluihin", joita hän
itse oli aikonut käyttää.

Näiden henkilöitten vaikutuksesta laajeni pian Gogolin näköpiiri;


hänessä heräsi halu täydentää lyseossa saamiansa tietoja. Samalla
myöskin hänen taiteellinen luomiskykynsä alkoi vuosi vuodelta yhä
enemmän kukoistaa, kehittyä ja saavuttaa sitä laajuutta ja syvyyttä,
jotka ovat osoittaneet hänelle paikan Venäjän klassikkojen vierellä.

"Iltojen" menestys antoi Gogolille tilaisuuden matkustaa


kotiseudulleen. Täällä häntä odotti suuri pettymys. Meluavan,
loistavan pääkaupunkielämän jälkeen ei hänelle enää syntymäseutu
kuvastunut läheskään siinä runollisessa valossa, josta hän
pääkaupungissa oli uneksinut. Varsinkin säälittävältä, tuskallisen
yksitoikkoiselta, sivistymättömältä, törkeän taikauskoiselta tuntui
hänestä puolisivistyneitten vähävenäläisten tilanomistajain
kaikellaista äitelyyttä täynnä oleva elämä. Ja niin alkoi ensikerran
jokapäiväisen elämän likaisuus ja typeryys herättää hänen
huomiotansa; ensi kerran heräsi hänessä hänen ihmeellinen
"maailmalle näkyvä naurunsa", joka kätki itseensä "kyyneleitä, joita
maailma ei nähnyt." Kaikista hänen seuraavista teoksistaan aina
vuoteen 1835 saakka voi päättää, että juuri tähän aikaan tapahtui
Gogolissa kääntymys vähävenäläisestä romantikasta täydelliseen
realismiin. Tällaisia nimittäin ovat hänen teoksensa, jotka kahdessa
osassa "Arabeskeja" ja "Mirgorod" v. 1835 ilmestyivät: toisissa on
vielä "Iltojen" romantinen luonne, kuten "Wiissä" (nyt julkaistavan
kirjasen oikea nimi, tarkoittaa "maahiaisten ruhtinasta"), joka tässä
suomalaiselle lukijalle esitetään, "Taras Bulbassa" ja "Muotokuvassa."
Samoissa kokoelmissa me jo tapaamme realistisia kertomuksia,
täynnä naurua kyynelten takaa. Tällaisia ovat esim. "Kuinka Ivan
Ivanovitsh riitaantui Ivan Nikiforovitshin kanssa", jossa hänen
huumorinsa pulppuaa erinomaisen raikkaana ja mehevänä.

Gogolin pääteokset ovat "Revisori" ja "Kuolleet sielut." "Revisori"


on, kuten tunnettua, murhaavaa ivaa venäläisestä
virkamiesmaailmasta, jonka ruoskimisessa samalla ilmenee Gogolin
huumorin hyväntahtoinen ja sydämellinen sävy. Sekä aitovenäläisten
olojen kuvauksena että eheänä, taiteellisena draamateoksena on
"Revisori" huomattavimpia tuotteita Venäjän kirjallisuudessa, samoin
kuin se on venäläisen näytelmän, s.o. varsinaisen taidenäytelmän
esikoinen.

Näytelmä esitettiin ensi kerran Aleksanterin teatterissa Pietarissa


19 p. huhtik. 1836 keisari Nikolai I luvalla, eikä se sen jälkeen ole
joutunut pois teatterin ohjelmistosta.

Lupa "Kuolleitten sielujen" painattamiseen saatiin vasta suurten


ponnistusten jälkeen. Se oli voimakas, mitä laajakantoisin isku
maaorjuusjärjestelmää vastaan, joka vielä silloin oli voimassa
Venäjällä. "Kuolleitten sielujen" ensimäinen osa ilmestyi v. 1842.

Ja tähän päättyikin Gogolin elämän ja tuotannon loistokausi.


Tämän jälkeen alkaa Gogolin asteettainen sekä henkinen että
ruumiillinen kuoleminen. Loppuvuosinaan Gogol ankaran
hermotaudin vaivaamana antausi uskonnollisiin mietiskelyihin, teki
pyhiinvaellusmatkan Jerusalemiin ja alkoi katsoa koko kirjallista
toimintaansa synniksi Jumalan edessä. Eräänä synkkänä hetkenä
hän poltti "Kuolleiden sielujen" toisen osan. Viimeiset vuodet, jotka
olivat hyvin tuskallisia, hän eli Moskovassa ja kuoli 4 p. maalisk.
1852.
Gogolin huumorin suuri voima on sen taitavasti osatussa
harmittomuudessa. Hänen realisminsa ei ole pelkästään repivää
laatua, hän ei ainoastaan ilku ihmisten ja olevien olojen heikkouksia,
vaan takana näkyy tarkoitus ja pyrkimys jalompaan. Gogolin käsitys
taiteesta oli, että sen tuli olla tulisoihtu, joka osoittaa tietä
korkeampiin ihanteihin.
DEMONIEN RUHTINATAR

Kun seminaarin jokseenkin heleä-äänistä kelloa Veljesluostarin


portilla Kijevissä oli aamulla soittaa läpäytetty, niin heti ilmestyi
kaduille koululaisia ja seminaarilaisia joukottain kaupungin kaikista
osista. Grammatikot, retorit, filosofit ja teologit laahustivat vihkot
kainalossa kouluun. Grammatikot olivat vielä hyvin pieniä:
kävellessään he tyrkkivät toisiaan ja väittelivät ohuella sopraano-
äänellä keskenään; he olivat meikein kaikki rikkinäisissä, lian
tahraamissa puvuissa ja taskut olivat aina kaikellaista rojua täynnä,
kuten noppia, papukkoja, sulkapillejä, piirakan palasia ja joskus
myöskin pieniä varpusia, joista joku alkoi visertää kuoleman
hiljaisuuden vallitessa luokalla, tuottaen omistajalleen jokseenkin
kovia iskuja molempiin kämmeniin, joskus myöskin ruoskaa selkään.
Retorit kulkivat vakavampina; heidän pukunsa oli useinkin aivan
ehyt, mutta heidän kasvoillaan oli sensijaan melkein aina jokin
koristus: joskus oli toinen silmä painunut otsan alle, joskus
pullottivat huulet kuin täyteen puhallettu rakko, joskus taas näkyi
kasvoilla jokin muu retorin arvoa muistuttava merkki. He puhelivat ja
väittelivät tenoriäänellä. Filosofit ottivat kokonaisen oktaavin
alempaa. Heidän taskuissaan ei ollut muuta kuin väkevää tupakkaa.
He eivät tehneet minkäänlaisia varastoja, vaan söivät heti kaiken
sen, minkä käsiinsä saivat; heistä löyhkäsi tupakka ja paloviina,
joskus niin vahvasti, että ohikulkeva käsityöläinen pysähtyi pitkäksi
ajaksi metsäkoiran tavoin nuuskimaan ilmaa.

Tähän aikaan oli torikauppa tavallisesti juuri alkanut, ja


kaupustelijamuorit nisu-, arbuusi-, auringonsiemen- ja piirakkakorit
käsivarrella tarttuivat kilvan koululaisten vaatteitten liepeisiin.

"Nuoret herrat, nuoret herrat! tänne, tänne!" huusivat he kaikilta


tahoilta: "hyviä rinkelejä, unikkokakkuja, vehnäpiiraita, ostakaa,
ostakaa!"

Toinen muori taas, osoittaen pitkänsuikeita vehnäleipiä, kirkui,


"ostakaa minulta, erittäin maukkaita omia leipomia."

"Älkää ostako tuolta: katsokaa minkälainen hän on, ruma nenä ja


kädetkin ovat likaiset…"

Mutta filosofeihin ja teologeihin he eivät uskaltaneet koskea, sillä


näillä oli aina tapana ottaa ainoastaan maistiaisiksi, eikä suinkaan
vähän, vaan aivan kourantäydeltä.

Seminaariin saavuttuaan hajaantui joukko mataliin, mutta


kumminkin jokseenkin avariin, pienillä akkunoilla, leveillä ovilla ja
likaisilla penkeillä varustettuihin luokkahuoneisiin. Luokka täyttyi
äkkiä aika hälinästä: grammatikon sointuva sopraano sattui
täsmälleen pienten akkunalasien helinään ja akkunalasi vastasi
melkein samalla sävelellä. Nurkassa pauhasi retori, jonka suun ja
paksujen huulien pitäisi kuulua vähintäänkin filosofille. Hän puhui
basso-äänellä; kaukaa kuului ainoastaan: "bu, bu, bu.".. Kun
opettaja tunnin aikana loi toisen silmänsä penkin alle, näki hän
vehnäleivän tahi piirakan, tahi kurpitsan siemeniä pistävän
oppilaansa taskusta esiin.
Kun tämä oppinut joukko kerkesi luokalle jonkun verran
aikaisemmin tahi kun professorin tiedettiin myöhästyvän, niin silloin
ryhdyttiin yhteisestä sopimuksesta tappelemaan. Ja siihen oli
kaikkien otettava osaa, sensorinkin, jonka velvollisuutena oli
järjestyksen ylläpitäminen ja koko oppilassäädyn siveellisyydestä
huolehtiminen. Kaksi teologia tavallisesti ratkaisi, tapeltiinko luokka
luokkaa vastaan, tahi jakaannuttiinko kahteen yhtäsuureen
joukkoon. Joka tapauksessa aloittivat grammatikot taistelun, mutta
kun retorit siihen yhtyivät, pakenivat he heti ja seurasivat sitte
penkeillä seisten tappelun kulkua. Sitte yhtyivät pitkäviiksiset filosofit
rytäkkään ja lopuksi paksuniskaiset teologit. Tappelu päättyi
tavallisesti siten että teologit antoivat kaikille selkään, ja filosofien
täytyi kylkiään pidellen mennä penkeille huoahtamaan. Luokalle
saapunut professori, joka aikoinaan itse oli ottanut osaa
samallaiseen voimainkoetukseen, huomasi heti oppilaittensa
palavista poskista, että taistelu oli ollut kuuma, ja samalla kun hän
antoi retoria vitsalla sormille, kuumensi toinen professori toisella
luokalla kepillä filosofin kämmeniä. Teologien suhteen meneteltiin
aivan toisin: he saivat maistaa lyhyistä nahkapampuista.

Juhlapäivinä pääsivät seminaarilaiset kotiinsa. Joskus esitettiin


näytelmiä. Silloin kunnostautui aina jokin Kijevin kellotapulin
mittainen teologi esittäen Herodiasta tahi Pentefriaa. Palkkioksi he
saivat palasen aivinaa, pussillisen ryynejä, keitetyn hanhen puoliskon
ja muuta sellaista. Koko tällä oppineella joukolla, sekä ala- että
yläluokkalaisilla, joilla oli jotakin perinnäistä vihaa välillään, oli hyvin
vähän varoja elantoon, niin että oli aivan mahdotonta laskea, kuinka
monta lihakokkaretta kukin heistä illallisen aikana pisti poskeensa.
Tämän vuoksi eivät varakkaiden vapaaehtoiset lahjoitukset riittäneet
mihinkään. Silloin lähetti filosofeista ja teologeista kokoonpantu
senaatti grammatikot ja retorit pussit kainalossa erään filosofin
johdolla vieraita kasvitarhoja tyhjentämään. Joskus oli senaattikin
mukana tällaisella retkellä. Ja seminaari söi silloin kurpitsapuuroa.
Senaattorit itse nauttivat arbuseja ja meloneja niin runsaasti, että
opettajat seuraavana päivänä tunnilla kuulivat samallaista murinaa
sekä heidän suustaan että vatsastaan. Seminaarilaisilla oli pukuna
pitkäntakin tapainen pitkä viitta.

Suurin juhlatapaus seminaarissa oli kesälomalle lähtö. Loma alkoi


kesäkuussa.

Koko suuren valtatien täyttivät silloin grammatikot, filosofit ja


teologit. Kellä ei ollut omaa kotoa, se meni toverinsa luo. Filosofit ja
teologit menivät kotiopettajiksi varakkaisiin perheisiin, saaden
palkaksi jalkineet vuodeksi, joskus myöskin puvun. Koko joukkue
kulki yhdessä, keitti puuronsa tien vieressä ja vietti yönsä kedolla.
Jokaisella oli pussi selässä, jossa oli yksi paita ja pari jalkariepuja.
Teologit olivat tavallisesti säästäviä ja säännöllisiä: he kantoivat
kenkiänsä kepissä olallaan ja likaisella tiellä käärivät housunsa
lahkeet polviin asti. Kun huomattiin talo syrjässä, käännyttiin heti
valtatieltä, poikettiin talon akkunan alle, asetuttiin riviin ja alettiin
täydestä kurkusta laulaa kirkkolauluja. Talon isäntä, joku vanha
kasakka, kuunteli tarkasti kyynäspäittensä varassa laulua, puhkesi
katkeraan itkuun ja emäntäänsä kääntyen lausui: "Muija,
koululaisten laulu on jotakin hyvin järkevää, vie heille silavaa ja
muuta hyvää, jota sinulla on." Ja kokonainen maljakko keitettyjä
kaali- ja marjapiirakkoja joutui laulajain pussiin; suuri kimpale
silavaa, joskus myöskin sidottu kana sullottiin samaan säiliöön.
Vahvistettuaan itseänsä tällaisella varastolla, jatkoivat grammatikot,
retorit, filosofit ja teologit matkaansa. Mitä kauemmaksi päästiin, sitä
pienemmäksi hupeni kumminkin seurue. Melkein kaikki hajaantuivat
koteihinsa, jälelle jäivät ainoastaan ne, joiden syntymäpesä oli
kauempana muita.

Erään kerran tällaisen retken aikana erosi kolme seminaarilaista


toisista hankkiakseen ruoka-aineita jostakin lähimmästä talosta, sillä
eväspussi oli jo kauan ollut tyhjä. He olivat teologi Haljava, filosofi
Homa Brut ja retori Tiberi Gorobets.

Teologi oli kookas ja hartiakas mies. Hänellä oli omituinen tapa:


hän varasti jokaisen esineen, mikä sattui olemaan hänen
lähettyvillänsä. Joskus hän oli hyvin synkkä ja kun hän joi itsensä
juovuksiin, piiloutui hän aroheinikkoon, ja seminaarilla oli vaikea työ
löytää hänet sieltä.

Filosofi Homa Brut oli luonteeltaan iloinen, loikoi mielellään ja


poltti piippua; juomaretkellä ollessaan hän tilasi aina soittajia ja
tanssi. Hän sai useasti nahkaletkusta, mutta kärsi sen filosofin
välinpitämättömyydellä arvellen, että minkä täytyy tapahtua, sitä ei
voi välttää.

Retori Tiberi Gorobetsilla ei vielä ollut oikeutta pitää viiksiä, juoda


paloviinaa eikä polttaa piippua; hänen luonteensa oli vielä vähän
kehittynyt, mutta hänen otsassaan olevista suurista kuhmuista
päättäen, jotka useinkin herättivät huomiota hänen luokalle
tullessaan, voi otaksua, että hänestä aikaa myöten tulisi hyvä soturi.
Teologi Haljava ja filosofi Homa käyttivät häntä edusmiehenään.

Oli jo ilta, kun he poikkesivat valtatieltä; aurinko oli juuri laskenut,


ja päivän lämmin oli vielä ilmassa. Teologi ja filosofi kulkivat ääneti
piippujaan imeskellen; retori Tiberi Gorobets katkoi kepillään
tienvieressä kasvavaa rikkaruohoa. Tie kulki hajanaisten tammi- ja
pähkinäpuuryhmien lävitse. Kumpuja ja pieniä mäkiä, viheriöitä ja
ympyriäisiä kuin kirkon kupoli, näkyi siellä täällä tasangolla. Pari
tuuleentunutta vainiota ilmoitti jonkun kylän olevan lähellä. Mutta oli
kulunut jo tunnin verran siitä kun he olivat vainiot sivuuttaneet,
mutta ei vieläkään mitään ihmisasuntoa näkynyt. Hämärä pimensi
kokonaan taivaan, ainoastaan lännessä kuumotti ruusunpunainen
hohto.

"Hitto vie!", virkkoi filosofi Homa Brut: "näytti aivan siltä kuin talo
tulisi tuossapaikassa."

Teologi oli ääneti, katsahti ympäristöön, pisti piipun suuhunsa, ja


niin jatkettiin matkaa.

"Jumaliste!", puuskahti filosofi uudelleen, pysähtyen: "ei siellä näy


jälkeäkään talosta."

"Mutta ehkäpä etempänä tulee joku talo", sanoi teologi


päästämättä piippua hampaistaan.

Mutta tällä välin oli jo tullut yö. Oli aika pimeä. Pienet ukkospilvet
lisäsivät pimeyttä, eikä tähdistä ja kuusta näyttänyt olevan toiveita.
Seminaarilaiset huomasivat eksyneensä alkuperäiseltä tieltä ja
kulkeneensa pitkän aikaa toista tietä.

Filosofi tunnusteli maaperää kaikilta puolin ja sanoi sitte


katkonaisesti: "Mutta missä tie?"

Teologi oli vaiti, mietti hetkisen ja virkkoi: "Niin, yö on pimeä."

Retori käveli sivulle ja koetti ryömien etsiä tietä, mutta hän löysi
vain ketun pesiä. Ympärillä oli aro, ja näytti kuin siellä ei olisi
koskaan ajettu.
Matkailijat ponnistelivat vielä jonkun matkaa eteenpäin, mutta
kaikkialla oli sama erämaa. Filosofi koetti huutaa, mutta ei saanut
mitään vastausta. Hetken perästä kuului heikkoa ähkymistä, mikä
suuresti muistutti suden ulvontaa.

"Ka! mitä meidän on tekeminen?" sanoi filosofi.

"Ei muuta kuin jäädä kedolle yöksi", arveli teologi, sytyttäen


piippunsa. Filosofi ei voinut suostua siihen: hänen tapanansa oli aina
piilottaa yöksi puolipuutainen leivänkannikka ja nelisen naulaa
silavaa, ja tällä kertaa tuntui vatsassa niin tavattoman yksinäiseltä.
Iloisesta luonteestaan huolimatta hän sitäpaitsi jonkun verran pelkäsi
susia.

"Ei, Haljava, se ei käy päinsä", hän lausui: "Koiran tavoin laskeutua


levolle vahvistamatta itseään millään? Koettakaammepa vielä:
ehkäpä pääsemme johonkin asuntoon ja onnistumme saamaan edes
pikarillisen paloviinaa yöksi."

Kuullessaan sanan "paloviina" sylkäsi teologi sivulleen ja virkkoi:


"Voihan sitä jäädä tännekin."

He läksivät liikkeelle ja suureksi ilokseen kuulivat hetkisen perästä


koiran haukkuvan. Otettuaan selvän, mistä haukkuminen kuului,
alkoivat he paljon reippaammin painaltaa ääntä kohti. Jonkun
matkaa kuljettua, nähtiin tuli.

"Talo! totisesti talo!" huudahti filosofi.

Ja hetken perästä he todellakin näkivät pienen talon, johon kuului


ainoastaan kaksi tupaa, nekin samassa pihassa. Akkunoista näkyi
tuli; kymmenkunta luumupuuta pisti näkyviin pisteaidan luona.
Laudoista tehdyn portin raoista tirkistellessään he huomasivat pihalla
joukon likaisia kuormia. Tähtiä alkoi näkyä siellä täällä taivaalla.

"Pitäkää huolta, veljet, ei anneta perään! Otamme yösijan, maksoi


mitä maksoi!"

Kolme oppinutta miestä löi yht'aikaa porttiin ja huusi:

"Avatkaa."

Erään huoneen ovi narisi, ja hetkisen perästä näkivät pojat vanhan


muorin edessään päällyksetön lammasnahkaturkki päällä.

"Kuka siellä?" huusi muori yskien kuivasti.

"Anna, hyvä muori, yösijaa, olemme eksyneet tieltä ja taivasalla


olo on yhtä ilkeätä kuin nälkäisellä vatsalla eläminen."

"Mitä väkeä te sitte olette?"

"Niin, emme ole tavallista väkeä: teologi Haljava, filosofi Brut ja


retori Gorobets."

"Ei ole tilaa", mumisi muori: "piha on täynnä vieraita ja joka tuvan
nurkka nukkujia. Mihinkä minä teidät sijoitan? Ja kaiken lisäksi kaikki
kolme niin suuria vahvoja miehiä! Tupanihan hajoaa aivan, jos minä
päästän teidät sinne. Kyllä minä tunnen nuo filosofit ja teologit: jos
ne juopot laskee sisään, niin ei koko talosta jää mitään jäljelle.
Menkää, menkää! Ei täällä ole tilaa teikäläisille."

"Ole nyt armelias, rakas muori! Eihän sovi, että kristitty sielu
joutuu tuhoon aivan syyttä? Sijoita meidät, mihin tahdot; ja jos me
jotakin pahaa teemme, niin kuivukoon kätemme heti. Usko se."
Muori näytti tulevan leppeämmäksi. "Hyvä", lausui hän ikäänkuin
ajatellen: "minä päästän teidät, mutta sijoitan kaikki eri paikkoihin;
en saa rauhaa sielussani, jos makaatte yhdessä."

"Tee kuten tahdot; me tottelemme."

Portti narisi, ja matkalaiset astuivat pihaan.

"Kuuleppa, muoriseni", sanoi filosofi käyden vanhuksen perässä:


"vatsassa tuntuu kuin joku rattailla ajaisi: aamusta lähtien ei ole ollut
ruuan muruakaan suussa."

"Kas, mitä vielä tahtoo!" tuumi muori: "minulla ei ole mitään,


uunikaan ei lämminnyt tänä päivänä."

"Kyllä me huomenna maksaisimme kaikesta aivan puhtaassa


rahassa", jatkoi filosofi. "Niin", virkkoi hän hiljaa, "kyllä saisit odottaa
maksua!"

"Menkää, menkää! ja tyytykää siihen, mitä saatte! Kyllä piru toi


nuo hienot nuoret herrat tänne!"

Filosofi Homa tuli aivan alakuloiseksi näistä sanoista, mutta äkkiä


tunsi hänen nenänsä kuivatun kalan hajua; hän katsahti sivullaan
kulkevaan teologiin ja huomasi hänen taskustaan pistävän suuren
kalan hännän: tämä oli ehtinyt siepata kalan kuormasta. Ja kun hän
ei tehnyt sitä mistään omanvoitonpyynnöstä, vaan pelkästä tavasta,
niin filosofi Homa pisti kätensä teologin taskuun aivan kuin omaansa
ja otti sieltä kalan, varsinkin kun teologi näytti unhoittaneen koko
tavaran ja kaikesta päättäen valmistautui toista hankkimaan.

Muori sijoitti retorin tupaan, teologin hän sulki tyhjään kamariin ja


filosofin lammasnavettaan.
Jäätyänsä yksin söi filosofi yhdessä minuutissa kalan, katsellen
hämähäkin verkon peittämiä navetan seiniä, potkaisi jalallaan
toisesta navetasta uteliaisuudesta esiin pistävää sian kärsää ja
kääntyi sitte oikealle kyljelleen ottaakseen hyvän unen. Äkkiä aukeni
matala ovi ja muori ilmestyi kynnykselle.

"No, muoriseni, mitä tahdot?" lausui filosofi.

Mutta vanhus käveli suoraan häntä kohti kädet levällään.

"Ahaa!" ajatteli filosofi. "Ei, kyyhkyseni, olet liian vanha!"

Hän perääntyi vähän, mutta kursailematta läheni vanhus


nuorukaista.

"Kuuleppas, muoriseni!" sanoi filosofi: "nyt on paastonaika; minä


puolestani olen sellainen ihminen, etten tuhannesta
kultarahastakaan riko paastoa."

Mutta muori liikutteli käsiään ja tahtoi tarttua häneen virkkamatta


sanaakaan.

Filosofin valtasi kauhu, kun hän huomasi omituisen loisteen


muorin silmissä. "Muori hyvä, mitä sinä? Mene, mene Jumalan
nimeen!" huudahti hän.

Mutta muori tarttui hänen käsiinsä lausumatta sanaakaan.

Filosofi hyppäsi jaloilleen aikoen paeta; mutta vanhus asettui


ovelle, kiinnitti häneen kiiluvat silmänsä ja uudelleen alkoi lähetä
häntä.
Filosofi tahtoi hänet torjua luotaan käsillään, mutta hän huomasi
ihmeekseen, ettei hän voinut kohottaa käsiänsä eikä liikuttaa
jalkojaan; ja kauhukseen hän lisäksi huomasi, ettei ääni päässyt
hänen kurkustaan: huulet liikkuivat, mutta ääntä ei kuulunut. Hän
kuuli vain sydämensä lyövän; hän näki muorin lähestyvän itseään,
tarttuvan hänen käsiinsä, painavan hänen päätänsä ja hyppäävän
sitte kissan nopeudella hänen selkäänsä, ja lyövän häntä luudalla.
Hän hyppeli kuin ratsuhevonen, kantaen muoria selässään. Kaikki
tämä tapahtui niin nopeasti, että filosofi tuskin ehti tointua ja tarttua
molemmin käsin polviinsa pidättääkseen jalat liikkumasta, mutta ne
hänen suureksi hämmästyksekseen kohosivat maasta vastoin hänen
tahtoaan ja ravasivat nopeammin tsherkessiläistä juoksijaa. He
sivuuttivat talon, tulivat tasangolle, sivulla näkyi sysimusta metsä.
Vasta silloin hän sanoi itsekseen: "Ahaa, se on noita!"

Kuun sirppi kumotti taivaalla. Arka puoliyön kuutamo läpinäkyvänä


verhona laskeutui maahan. Metsä, niitty, taivas, laakso — kaikki
näytti nukkuvan avoimin silmin; ei tuulen henkäystäkään miltään
puolen; viileässä yössä oli jotakin kostean lämpöistä; puitten ja
pensaitten varjot pyrstötähtien tavoin laskeutuivat tasangolle:
tällainen oli yö, kun filosofi Homa Brut laukkasi käsittämätön
ratsastaja selässä. Hän tunsi jonkunlaisen uuvuttavan,
vastenmielisen ja samalla suloisen tunteen valtaavan sydämensä.
Hän painoi päänsä alas ja oli näkevinänsä, että ruoho, joka oli
melkein hänen jalkainsa alla, kasvoi syvällä ja kaukana ja että sen
yläpuolella oli läpikuultava vesi kuten vuorilähteessä ja ruohikko
näytti valkoisen, läpikuultavan meren pohjalta; ainakin hän näki
itsensä ja taakkansa heijastavan siihen. Hän huomasi siinä auringon
paistavan kuun sijasta. Hän kuuli sinisten kellokukkien, päät
alastaipuneina kahisevan, hän näki vedenneidon uivan ruohikosta
näkyviin; sen loistava, värähtelevä ruumis pilkisti vedestä.
Vedenneito kääntyi häntä kohden — ja katso, sen kasvot kirkkaine,
säteilevine, terävine silmineen tunkivat hänen sieluunsa; ne olivat jo
aivan lähellä häntä, koskettamaisillaan hänen poskiansa, mutta sitte
neito päästi heleän naurun ja loittoni; nyt se kääntyi selälleen — ja
sen pilvinen povi, himmeä kuin kiillottamaton porsliini, valaisi
auringossa valkoista, joustavan hempeää ruumista. Pienet
vesipisarat varisivat lasihelminä vedenneidon povelle. Neito värisi
koko ruumiiltaan ja nauroi vedessä…

Näkikö hän tämän, vai eikö? Oliko hän valveilla, vai uneksiko hän?
Entä tuolla? Tuuli vai soittoako? Se heläjää, kilisee ja ulvoo ja
lähestyy, ja tunkee sieluun vastustamattomana…

"Mitä tämä on?" ajatteli Homa Brut katsellen alas ja kiitäen täyttä
lentoa. Hiki valui virtanaan pitkin ruumista. Hänestä tuntui hyvin
suloiselta, hän tunsi raukaisevaa, kauhean uuvuttavaa nautintoa.
Hänestä tuntui usein kuin hänen sydämensä olisi lakannut
tykkimästä ja kauhulla hän tapasi sitä kädellään. Perin väsyneenä ja
hämmästyneenä alkoi hän muistella ennen oppimiansa rukouksia.
Hän luki kaikki rukoukset henkiä vastaan, ja äkkiä tunsi
virkistyvänsä; hän tunsi askeleensa käyvän hitaammiksi,
laiskemmiksi; noita tuntui pitävän heikommin hänestä kiinni, sankka
ruoho kosketti hänen jalkoihinsa eikä hän enää huomannut siinä
mitään tavatonta. Kirkas kuun sirppi kumotti taivaalla.

"Hyvä!" ajatteli filosofi Homa Brut ja alkoi melkein ääneen lukea


rukouksia henkiä vastaan. Vihdoin hän nuolen nopeudella ponnahti
vanhuksen alta ja hyppäsi vuorostaan tämän selkään. Vanhus juoksi
tihein askelin niin nopeasti, että ratsastajan oli vaikea hengittää. Maa
vilahteli vain hänen allansa; oli kirkasta kuun valossa; laaksot olivat
tasaisia, mutta nopean kulun vuoksi ei hän voinut tarkasti esineitä
erottaa. Hän sieppasi tiellä olevan kepin ja alkoi sillä voimiensa takaa
mätkiä vanhusta. Tämä parkui hirmuisesti, ensin vihaisesti,
uhkaavasti, sitten heikommin, miellyttävämmin, puhtaammin ja
vihdoin aivan hiljaan, tuskin kuuluvasti. Se tuntui vienolta
hopeakellon kilinältä ja koski hänen sieluunsa; tahtomattaan leimahti
hänessä ajatus: onko se todellakin vanhus? "Ah, minä en voi enää!"
lausui ratsu voimattomana ja vaipui maahan.

Filosofi nousi ja katsoi häntä silmiin (alkoi sarastaa, Kijevin


kirkkojen kultakupolit loistivat kaukaa): hänen edessään makasi
kaunotar, upea hiuspalmikko hajallaan harteilla, silmäripset pitkät
kuin jouhet. Tunnottomana hän levitti valkoiset, paljaat käsivartensa
ja voihkien kohotti kyynelten täyttämät silmänsä.

Homa vapisi kuin haavan lehti tuulessa; sääli, omituinen


levottomuus, arkuus, jota hän ei ennen ollut tuntenut, valtasi hänet.
Hän läksi juoksemaan pakoon täyttä karkua. Hänen sydämensä löi
levottomasti eikä hän mitenkään voinut selittää itselleen sitä
omituista uutta tunnetta, joka oli hänet vallannut. Hän ei enää
tahtonut mennä taloon, vaan kiiruhti Kijeviin, ajatellen koko matkan
käsittämätöntä seikkailuaan.

Seminaarilaisia oli vähän kaupungissa: kaikki olivat hajonneet


koteihinsa, tahi menneet kotiopettajiksi tahi yksinkertaisesti
lähteneet kiertelemään maaseudulle, sillä vähävenäläisissä
maakylissä saa syödä kaikkinaisia herkkuja vatsansa täyteen
tarvitsematta maksaa mitään. Seminaari oli aivan tyhjä, ja vaikka
filosofi etsi joka nurkan, ei hän löytänyt palaakaan silavaa tahi muuta
suuhun pantavaa.

Filosofi keksi kumminkin kohta keinon surunsa parantamiseksi:


hän kulki pari kolme kertaa hiljaa vihellellen kauppatorin halki,
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebooknice.com

You might also like