Advertisement
  1. Web Design
  2. Complete Websites

Створюємо фільтрівне портфоліо з адаптивним дизайном завдяки можливостям CSS

Scroll to top
Read Time: 23 min

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

Завдяки властивій фільтрівним портфоліо (на зразок Tuts+ hub) візуальній привабливості вони стали дуже популярними. Сьогодні ми будемо створювати одне з таких за допомогою простої розмітки, коду CSS та невеликої кількості коду jQuery.


Крок 1: Файлова структура

Ми організуємо файли проекту наступним чином:

File Structure

Сформуйте проект на основі цих файлів (вам потрібно буде завантажити HTML5 Shiv (* прокладка (додає до старих браузерів підтримку можливостей, які вбудовано до сучасних браузерів), що дозволяє раннім версіям Internet Explorer розпізнавати теги HTML5). Тут і надалі примітка перекладача), і давайте приступимо до роботи з розміткою HTML у файлі index.html.


Крок 2: Заголовок HTML-документа

Давайте продовжимо у тому самому темпі та настрочимо список дій, потрібних для створення  <head>:

  • об'явити тип контенту та набір символів, використовуваних на сторінці;
  • встановити у якості значення ширини вікна перегляду значення ширини пристрою та задати у якості значення початкового масштабу 1 (Докладніше про це читайте тут);
  • додати назву для нашої сторінки;
  • додати значок веб-сайту (зацікавлені в іконках, сумісних з екранами, розробленими на основі технології Retina (* технологія візуалізації інформації, що перевищує здатність сітківки ока виділити окремі пікселі у зображенні (розробник: компанія Apple Inc.))?);
  • додати нашу головну таблицю стилів (style.css);
  • додати нашу таблицю стилів для роботи з медіа-запитами (media-queries.css);
  • підключити останню версію jQuery;
  • додати HTML5 Shiv для вирішення проблем підтримки HTML5 у ранніх браузерах;

І ось, що у нас виходить:

1
<!doctype html>
2
<html lang="en">
3
  <head>
4
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
5
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
6
		<title>John Doe's Portfolio</title>
7
		<link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico">
8
		<link rel="stylesheet" href="css/style.css" media="screen">
9
		<link rel="stylesheet" href="css/media-queries.css" media="screen">
10
		<script src="http://code.jquery.com/jquery-latest.min.js"></script>
11
		<script src="js/js.js"></script>
12
		<!--[if lt IE 9]>

13
			<script src="js/html5shiv.js"></script>

14
		<![endif]-->
15
	</head>

Крок 3: Базова розмітка HTML-документа

У тілі документа ми спершу додаємо «контейнер» для розміщення всіх наших елементів у межах елемента зі встановленою шириною, вирівняний по центру сторінки. Усередині того елемента ми додаємо (підготуйтеся до того, щоб настрочити ще один список):

  •  <header> для розміщення нашого заголовка (‘John Doe’);
  • базове навігаційне меню ( <nav>), що містить <ul> з п'ятьома елементами, для кожного з котрих задано відповідний ID.
  • <section> з класом ‘work’ для розміщення контрольних  зображень (* зменшена і спрощена копія (зазвичай в окремому невеликому вікні) графічного об'єкта, а також макета документа, який верстають);
  • <footer> з попередженням про авторське право (* рядок, що містить знак копирайта та супровідний текст. Є заявою (попередженням) про те, що матеріал, який публікується, оберігається законом про авторське право);
1
<body>
2
	<div class="container">
3
		<header>
4
			<h1 class="title">
5
				John Doe
6
			</h1>
7
		</header>
8
		<nav>
9
			<ul>
10
				<li id="all">All</li>
11
				<li id="web">Web</li>
12
				<li id="print">Print</li>
13
				<li id="illustration">Illustration</li>
14
				<li id="logo">Logo</li>
15
			</ul>
16
17
		</nav>
18
		<section class="work">
19
		</section>
20
		<footer>&copy; 2012 John Doe. Valid HTML5.</footer>
21
</body>

Крок 4: Ілюстрація та зображення

Ми будемо використовувати тег <figure> для розміщення наших контрольних зображень та застосуємо до нього клас із назвою відповідної категорії, до якої він належить. Усередині цього тегу ми додамо тег <a>, що містить зображення (<img>) для реалізації фону контрольного зображення та список визначень (<dl>) для додавання надпису.

1
<figure class="illustration">
2
	<a href="#">
3
		<img src="images/1.png" alt="" />
4
		<dl>
5
		</dl>
6
	</a>	
7
</figure>

Крок 5: HTML-надпис (DL, DT, DD)

Як було згадано вище, ми будемо використовувати список визначень для додання надписів до зображень. У якості термінів (<dt>) будуть виступати наші невеликі заголовки – Client и Role (* Клієнт та Категорія), у якості визначень (<dd>) – Envato и Illustration (* наприклад) відповідно.

1
<figure class="illustration">
2
	<a href="#">
3
		<img src="images/1.png" alt="" />
4
		<dl>
5
			<dt>Client</dt>
6
				<dd>Envato</dd>
7
			<dt>Role</dt>
8
				<dd>Illustration</dd>	
9
		</dl>
10
	</a>	
11
</figure>

Крок 6: Повний код HTML

Нижче наведено весь код нашої розмітки:

1
<!doctype html>
2
3
<html lang="en">
4
5
	<head>
6
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
7
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
8
		<title>John Doe's Portfolio</title>
9
		<link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico">
10
		<link rel="stylesheet" href="css/style.css" media="screen">
11
		<link rel="stylesheet" href="css/media-queries.css" media="screen">
12
		<script src="http://code.jquery.com/jquery-latest.min.js"></script>
13
		<script src="js/js.js"></script>
14
		<!--[if lt IE 9]>

15
			<script src="js/html5shiv.js"></script>

16
		<![endif]-->
17
18
	</head>
19
20
	<body>
21
22
		<div class="container">
23
24
			<header>
25
26
				<h1 class="title">
27
					John Doe
28
				</h1>
29
30
			</header>
31
32
			<nav>
33
34
				<ul>
35
					<li id="all">All</li>
36
					<li id="web">Web</li>
37
					<li id="print">Print</li>
38
					<li id="illustration">Illustration</li>
39
					<li id="logo">Logo</li>
40
				</ul>
41
42
			</nav>
43
44
			<section class="work">
45
46
				<figure class="illustration">
47
					<a href="#">
48
						<img src="images/1.png" alt="" />
49
50
						<dl>
51
							<dt>Client</dt>
52
								<dd>Envato</dd>
53
							<dt>Role</dt>
54
								<dd>Illustration</dd>	
55
						</dl>
56
					</a>	
57
				</figure>	
58
59
				<figure class="print">
60
					<a href="#">
61
						<img src="images/2.png" alt="" />
62
						<dl>
63
							<dt>Client</dt>
64
								<dd>Envato</dd>
65
							<dt>Role</dt>
66
								<dd>Print</dd>	
67
						</dl>
68
					</a>	
69
				</figure>	
70
71
				<figure class="logo">
72
					<a href="#">
73
						<img src="images/3.png" alt="" />
74
						<dl>
75
							<dt>Client</dt>
76
								<dd>Envato</dd>
77
							<dt>Role</dt>
78
								<dd>Logo</dd>	
79
						</dl>
80
					</a>	
81
				</figure>	
82
83
				<figure class="web">
84
					<a href="#">
85
						<img src="images/4.png" alt="" />
86
						<dl>
87
							<dt>Client</dt>
88
								<dd>Envato</dd>
89
							<dt>Role</dt>
90
								<dd>Web</dd>	
91
						</dl>
92
					</a>	
93
				</figure>	
94
95
				<figure class="print">
96
					<a href="#">
97
						<img src="images/5.png" alt="" />
98
						<dl>
99
							<dt>Client</dt>
100
								<dd>Envato</dd>
101
							<dt>Role</dt>
102
								<dd>Print</dd>	
103
						</dl>
104
					</a>	
105
				</figure>	
106
107
				<figure class="web">
108
					<a href="#">
109
						<img src="images/6.png" alt="" />
110
						<dl>
111
							<dt>Client</dt>
112
								<dd>Envato</dd>
113
							<dt>Role</dt>
114
								<dd>Web</dd>	
115
						</dl>
116
					</a>	
117
				</figure>	
118
119
				<figure class="print">
120
					<a href="#">
121
						<img src="images/7.png" alt="" />
122
						<dl>
123
							<dt>Client</dt>
124
								<dd>Envato</dd>
125
							<dt>Role</dt>
126
								<dd>Print</dd>	
127
						</dl>
128
					</a>	
129
				</figure>	
130
131
				<figure class="web">
132
					<a href="#">
133
						<img src="images/8.png" alt="" />
134
						<dl>
135
							<dt>Client</dt>
136
								<dd>Envato</dd>
137
							<dt>Role</dt>
138
								<dd>Web</dd>	
139
						</dl>
140
					</a>	
141
				</figure>	
142
143
				<figure class="illustration">
144
					<a href="#">
145
						<img src="images/9.png" alt="" />
146
						<dl>
147
							<dt>Client</dt>
148
								<dd>Envato</dd>
149
							<dt>Role</dt>
150
								<dd>Illustration</dd>	
151
						</dl>
152
					</a>	
153
				</figure>	
154
155
				<figure class="print">
156
					<a href="#">
157
						<img src="images/10.png" alt="" />
158
						<dl>
159
							<dt>Client</dt>
160
								<dd>Envato</dd>
161
							<dt>Role</dt>
162
								<dd>Print</dd>	
163
						</dl>
164
					</a>	
165
				</figure>		
166
167
				<figure class="web">
168
					<a href="#">
169
						<img src="images/11.png" alt="" />
170
						<dl>
171
							<dt>Client</dt>
172
								<dd>Envato</dd>
173
							<dt>Role</dt>
174
								<dd>Web</dd>	
175
						</dl>
176
					</a>	
177
				</figure>	
178
179
				<figure class="logo">
180
					<a href="#">
181
						<img src="images/12.png" alt="" />
182
						<dl>
183
							<dt>Client</dt>
184
								<dd>Envato</dd>
185
							<dt>Role</dt>
186
								<dd>Logo</dd>	
187
						</dl>
188
					</a>	
189
				</figure>	
190
191
				<figure class="illustration">
192
					<a href="#">
193
						<img src="images/13.png" alt="" />
194
						<dl>
195
							<dt>Client</dt>
196
								<dd>Envato</dd>
197
							<dt>Role</dt>
198
								<dd>Illustration</dd>	
199
						</dl>
200
					</a>	
201
				</figure>	
202
203
				<figure class="web">
204
					<a href="#">
205
						<img src="images/14.png" alt="" />
206
						<dl>
207
							<dt>Client</dt>
208
								<dd>Envato</dd>
209
							<dt>Role</dt>
210
								<dd>Web</dd>	
211
						</dl>
212
					</a>	
213
				</figure>	
214
215
				<figure class="logo">
216
					<a href="#">
217
						<img src="images/15.png" alt="" />
218
						<dl>
219
							<dt>Client</dt>
220
								<dd>Envato</dd>
221
							<dt>Role</dt>
222
								<dd>Logo</dd>	
223
						</dl>
224
					</a>	
225
				</figure>	
226
227
				<figure class="print">
228
					<a href="#">
229
						<img src="images/16.png" alt="" />
230
						<dl>
231
							<dt>Client</dt>
232
								<dd>Envato</dd>
233
							<dt>Role</dt>
234
								<dd>Print</dd>	
235
						</dl>
236
					</a>	
237
				</figure>	
238
239
			</section>
240
			
241
			<footer>&copy; 2012 John Doe. Valid HTML5.</footer>
242
		
243
		</div>
244
	
245
	</body>
246
247
</html>

Тепер давайте перейдемо до додання стильового оформлення.


Крок 7: Стильове оформлення для тексту, який виділяється користувачем, та лінійки прокручування

Ми почнемо з деяких цікавих елементів: виділеного користувачем тексту та лінійки прокручування (для яких додавати стильове оформлення зовсім не обов'язково), а також ми підберемо деякі шрифти.

1
@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,300);
2
@import url(http://fonts.googleapis.com/css?family=PT+Sans+Narrow);
3
4
::selection {
5
	background: #333;
6
	color: #FFF;
7
}
8
9
::-webkit-scrollbar {
10
	width: 9px;
11
}
12
13
::-webkit-scrollbar-track {
14
	background:#eee;
15
	border: thin solid lightgray;
16
	box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.1) inset;
17
}
18
19
::-webkit-scrollbar-thumb {
20
	background:#999;
21
	border: thin solid gray;
22
}

У коді вище ми імпортували два веб-шрифти з Google: Open Sans та PT Sans Narrow. Потім ми просто встановили темно-сірий фон та білий колір для тексту, який виділяється користувачем.

Після цього ми встановили у якості значення ширини лінійки 9px (для браузерів, що працюю на основі Webkit) та додали для доріжки лінійки світло-сірий фон, тонку границю та невелику тінь, яка виводиться всередині елемента. Далі ми встановили темно-сірий фон та тонку границю для повзунка лінійки прокручування.

Зверніть увагу: за детальною інформацією про webkit-scrollbars звертайтеся до посту Chris Coyier.


Крок 8: Стильове оформлення для тіла

Ми додамо для нашого фону шум у вигляді світло-сірого кольору та встановимо у якості шрифту ‘Open Sans’, який імпортували раніше. Також ми додамо границю зверху червоного кольору для надання додаткової вишуканості.


Трохи пошумимо...
1
body {
2
	font-family: 'Open Sans', sans-serif;
3
	background: url('../images/bg.gif');
4
	padding: 0;
5
	margin: 0;
6
	border-top: 10px solid #9d2e2c;
7
}

Крок 9: Стильове оформлення для контейнера

Тепер переходимо до контейнеру, для якого встановлюємо у якості значення ширини 960px, у якості значень відступів зверху та знизу 10px та вирівнюємо його по центру завдяки встановленню у якості значень відступів справа та зліва ‘auto’. Також ми запустимо апаратне прискорення роботи з графікою (* стимулювання роботи GPU (Graphics Processing Unit – графічний процесор) відеокарти, а не CPU – Central Processing Unit – центральний процесор) для (деяких) мобільних пристроїв завдяки додаванню ‘-webkit-transform: translateZ(0);’ (* використовується для зсуву елемента по осі z на вказане значення).

1
.container {
2
	width: 960px;
3
	margin: 10px auto;
4
	-webkit-transform: translateZ(0);
5
}

Крок 10: Стильове оформлення для заголовка

Ми просто збільшимо розмір нашого шрифту, вирівняємо текст по центру та встановимо у якості значення властивості font-weight (* насиченість шрифту) 300, щоб текст виглядав витончиніше.

1
header {
2
	text-align: center;
3
	font-weight: 300;
4
	font-size: 700%;
5
}

Крок 11: Стильове оформлення для підвалу

Ми вирівняємо текст по центру горизонтально, додамо відступи зверху та знизу величиною 50px, встановимо у якості значення кольору тексту сірий та розмістимо підвал під «робочою» областю завдяки ‘clear: both’.

1
footer {
2
	text-align: center;
3
	height: 100px;
4
	line-height: 100px;
5
	color: gray;
6
	clear: both;
7
}

Давайте тепер перейдемо до навігаційного меню.


Крок 12: Стильове оформлення для навігаційного меню

Ми почнемо з видалення всіх стильових правил, застосовуваних за налаштуванням, для нашого <ul>. Потім ми додамо відступи зверху та знизу величиною 50px та вирівняємо текст по центру.

1
nav ul {
2
	list-style: none;
3
	padding: 0;
4
	margin: 50px 0;
5
	text-align: center;
6
}

Тепер за допомогою ‘display: inline’ ми зробимо так, щоб наші елементи <li> розташовувались на одній лінії. Ми встановимо у якості курсору курсор-руку (* використовується для повідомлення користувачеві, що під ним знаходиться гіперпосилання) та додамо відступ справа величиною 10px для кожного <li>. Кольором тексту за налаштуванням буде світло-сірий, який змінюється на чорний при наведенні курсору поверх нього.

Також ми додамо деякий час переходу для анімування зміни кольору.

1
nav ul li {
2
	display: inline;
3
	cursor: pointer;
4
	margin-right: 10px;
5
	color: #666;
6
	
7
	transition: 0.3s;
8
	-webkit-transition: 0.3s;
9
	-moz-transition: 0.3s;
10
	-o-transition: 0.3s;
11
	-ms-transition: 0.3s;
12
}
13
14
nav ul li:hover {
15
	color: #000;
16
}

Оскільки останній елемент <li> є, м-м, останнім дочірнім елементом, для нього не потрібно встановлювати будь-який відступ справа. Так що ми видалимо його.

1
nav ul li:last-child {
2
	margin-right: 0;
3
}

Тепер давайте додамо слеши після елементів <li>. Ми реалізуємо це за допомогою псевдо-селектора ‘:after’. Завдяки встановленню у якості значення його властивості ‘content’ ‘/’, у якості кольору світло-сірий та відповідного відступу зліва ми можемо створити просту та одночасно ефективну систему розділу посилань. Також ми гарантуємо, що колір слешей на змінюється при наведенні курсору поверх них завдяки явному вказанню значень за налаштуванням їх кольору за допомогою селектора li:hover.

1
nav ul li:after {
2
	margin-left: 10px;
3
	content: '/';
4
	color: #bbb;
5
}
6
7
nav ul li:hover:after {
8
	color: #bbb;
9
}

Знов-таки нам буде потрібно видалити слеш в останнього елемента <li>.

1
nav ul li:last-child:after {
2
	content: '';
3
}

Тепер, коли ми завершили з навігаційним меню, давайте візьмемося за контрольні зображення.


Крок 13: Стильове оформлення для контрольних зображень

Для початку ми додамо відступи зверху та знизу величиною 20px для розділу з класом ‘.work’.

1
.work {
2
	margin: 20px 0;
3
}

Далі ми додамо стильове оформлення для кожного ‘.work figure’ (тобто для всіх наших контрольних зображень). Ми будемо використовувати ‘float: left’ для того, щоб їх вишикувати у ряд. Потім ми додамо відступ величиною 20px, встановимо у якості значень висоти та ширини 200px та додамо незначний ефект сепії (* світло-коричневий колір) за допомогою ‘-webkit-filter: sepia(0.4)’. Потім ми встановимо у якості position значення relative, завдяки чому зможемо задати для інших елементів (надписів у нашому випадку), що розташовуються усередині елемента figure, абсолютне позиціонування. Потім ми додамо невелику box-shadow (* тінь), що буде виступати також і в якості нашої границі. Також ми додамо деякий час переходу для збільшення та зменшення масштабу наших елементів.

1
.work figure {
2
	float: left;
3
	margin: 20px;
4
	width: 200px;
5
	height: 200px;
6
	background: #9d2e2c;
7
	line-height: 200px;
8
	-webkit-filter: sepia(0.4);
9
	position: relative;
10
	padding: 0 !important;
11
	
12
	box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.5);	
13
14
	transition: 0.6s;
15
	-webkit-transition: 0.6s;
16
	-moz-transition: 0.6s;
17
	-o-transition: 0.6s;
18
	-ms-transition: 0.6s;
19
}

Ми гарантуємо, що наше зображення завжди відповідає за розмірами контрольному зображенню завдяки встановленню у якості значення його ширини та висоти 100%.

1
.work figure a img {
2
	height: 100%;
3
	width: 100%;
4
}

Тепер ми завершили базове стильове оформлення для наших контрольних зображень. Давайте візьмемося за надписи.


Крок 14: Стильове оформлення для надписів

Список визначень

Оскільки ми не хочемо, щоб наш надпис був видимим  спочатку, ми задамо у якості значення властивості opacity 0. Потім ми встановимо для нього абсолютне позиціонування (всередині елемента figure) і зробимо так, щоб він повністю заповнював figure, завдяки встановленню у якості значень всіх 4-х властивостей – top, right, bottom та left 0.

Потім ми задамо у якості значення властивості line-height (* міжрядковий інтервал) 2.5 та додамо напівпрозорий фон темного кольору. Оскільки ми використовуємо темний фон, то задамо в якості значення кольору тексту білий. Також ми додамо невеликий час переходу для анімування прозорості надпису при figure:hover.

1
.work figure dl {
2
	opacity: 0;
3
	position: absolute;
4
	left: 0;
5
	right: 0;
6
	bottom: 0;
7
	top: 0;
8
	padding: 20px;
9
	margin: 0;
10
	line-height: 2.5; 
11
	background: rgba(0, 0, 0, 0.8);
12
	color: white;
13
	
14
	transition: 0.6s;
15
	-webkit-transition: 0.6s;
16
	-moz-transition: 0.6s;
17
	-o-transition: 0.6s;
18
	-ms-transition: 0.6s;
19
}

Оскільки ми хочемо, щоб він з'являвся при наведенні курсору поверх контрольного зображення, то встановлюємо у якості значення прозорості надпису 1 при figure:hover.

1
.work figure:hover dl {
2
	opacity: 1;
3
}

Терміни

Для початку ми встановимо у якості значення властивості font-family ‘PT Sans Narrow’. Для того щоб терміни були меншого розміру, ніж їх описи, ми встановимо у якості значення їх властивості font-size 80%. Потім ми змінюємо регістр наших термінів (Client та Role) на верхній за допомогою ‘text-transform:uppercase’. Також ми встановили відступ знизу негативної величини, щоб уникнути надмірного проміжку між термінами та їх визначеннями.

1
.work figure dl dt {
2
	text-transform: uppercase;
3
	font-family: 'PT Sans Narrow';
4
	font-size: 12px;
5
	margin-bottom: -16px;
6
}

Визначення

Нам не потрібно тут нічого робити – просто потрібно задати у якості значення властивості margin 0. (За налаштуванням для <dd> задано невеликий відступ зліва).

1
.work figure dl dd {
2
	margin-left: 0;
3
}

Крок 15: Стильове оформлення для контрольних зображень з класами ‘current’/‘not-current

.current

При додаванні контрольним зображенням певної категорії класу .current (за допомогою JS) нам потрібно, щоб вони збільшувалися у розмірі та знову набували свій звичайний тон (тобто видалити сепію). Ми збільшимо їх розмір за допомогою ‘transform: scale(1.05)’, завдяки чому їх масштаб буде збільшуватися в 1.05 рази у порівнянні з початковим по осям х та у, і видалимо доданий раніше ефект сепії завдяки використанню ‘-webkit-filter: sepia(0)’.

1
.current {
2
	-webkit-filter: sepia(0) !important;
3
4
	-webkit-transform: scale(1.05);
5
	-moz-transform: scale(1.05);
6
	-o-transform: scale(1.05);
7
	-ms-transform: scale(1.05);
8
	transform: scale(1.05);
9
10
	-webkit-backface-visibility: hidden;
11
	-moz-backface-visibility: hidden;
12
	-o-backface-visibility: hidden;
13
	-ms-backface-visibility: hidden;
14
	backface-visibility: hidden;
15
}

.not-current

Тут ми будемо виконувати повністю протилежне тому, що робили з контрольними зображеннями з класом .current – ми зменшимо їх розмір до 75% за допомогою ‘transform: scale(0.75)’ та зробимо контрольні зображення чорно-білими за допомогою ‘-webkit-filter: grayscale(1)’.

1
.not-current {
2
	-webkit-transform: scale(0.75);	
3
	-moz-transform: scale(0.75);
4
	-o-transform: scale(0.75);
5
	-ms-transform: scale(0.75);
6
	transform: scale(0.75);
7
8
	-webkit-filter: grayscale(1) !important;
9
}

.current-li

Ми просто задамо у якості значення кольору тексту елементів з класом ‘.current-li’ чорний.

1
.current-li {
2
	color: #000;
3
}

Крок 16: Весь код CSS

Нижче наведено повний код CSS:

1
/* Style */
2
3
@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,300);
4
@import url(http://fonts.googleapis.com/css?family=PT+Sans+Narrow);
5
6
::selection {
7
	background: #333;
8
	color: #FFF;
9
}
10
11
::-webkit-scrollbar {
12
	width: 9px;
13
}
14
15
::-webkit-scrollbar-track {
16
	background:#eee;
17
	border: thin solid lightgray;
18
	box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.1) inset;
19
}
20
21
::-webkit-scrollbar-thumb {
22
	background:#999;
23
	border: thin solid gray;
24
}
25
26
/* --------------------------

27
	Body

28
----------------------------- */
29
30
body {
31
	font-family: 'Open Sans', sans-serif;
32
	background: url('../images/bg.gif');
33
	padding: 0;
34
	margin: 0;
35
	border-top: 10px solid #9d2e2c;
36
}
37
38
/* --------------------------

39
	Container

40
----------------------------- */
41
42
.container {
43
	width: 960px;
44
	margin: 10px auto;
45
	-webkit-transform: translateZ(0);
46
}
47
48
a {
49
	text-decoration: none;
50
}
51
52
/* --------------------------

53
	Header

54
----------------------------- */
55
56
header {
57
	text-align: center;
58
	font-weight: 300;
59
	font-size: 700%;
60
}
61
62
/* --------------------------

63
	Footer

64
----------------------------- */
65
66
footer {
67
	text-align: center;
68
	height: 100px;
69
	line-height: 100px;
70
	color: gray;
71
	clear: both;
72
}
73
74
/* --------------------------

75
	Navigation

76
----------------------------- */
77
78
nav ul {
79
	list-style: none;
80
	padding: 0;
81
	margin: 50px 0;
82
	text-align: center;
83
}
84
85
nav ul li {
86
	display: inline;
87
	cursor: pointer;
88
	margin-right: 10px;
89
	color: #666;
90
91
	transition: 0.3s;
92
	-webkit-transition: 0.3s;
93
	-moz-transition: 0.3s;
94
	-o-transition: 0.3s;
95
	-ms-transition: 0.3s;
96
}
97
98
nav ul li:last-child {
99
	margin-right: 0;
100
}
101
102
nav ul li:hover {
103
	color: #000;
104
}
105
106
nav ul li:hover:after {
107
	color: #bbb;
108
}
109
110
nav ul li:after {
111
	margin-left: 10px;
112
	content: '/';
113
	color: #bbb;
114
}
115
116
nav ul li:last-child:after {
117
	content: '';
118
}
119
120
/* --------------------------

121
	Main Image Box

122
----------------------------- */
123
124
.work {
125
	margin: 20px 0;
126
}
127
128
.work figure {
129
	float: left;
130
	margin: 20px;
131
	width: 200px;
132
	height: 200px;
133
	background: #9d2e2c;
134
	line-height: 200px;
135
	-webkit-filter: sepia(0.4);
136
	position: relative;
137
	padding: 0 !important;
138
	
139
	box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.5);	
140
141
	transition: 0.6s;
142
	-webkit-transition: 0.6s;
143
	-moz-transition: 0.6s;
144
	-o-transition: 0.6s;
145
	-ms-transition: 0.6s;
146
}
147
148
.work figure a img {
149
	height: 100%;
150
	width: 100%;
151
}
152
153
.work figure dl {
154
	opacity: 0;
155
	position: absolute;
156
	left: 0;
157
	right: 0;
158
	bottom: 0;
159
	top: 0;
160
	padding: 20px;
161
	margin: 0;
162
	line-height: 2.5; 
163
	background: rgba(0, 0, 0, 0.8);
164
	color: white;
165
166
	transition: 0.6s;
167
	-webkit-transition: 0.6s;
168
	-moz-transition: 0.6s;
169
	-o-transition: 0.6s;
170
	-ms-transition: 0.6s;
171
}
172
173
.work figure:hover dl {
174
	opacity: 1;
175
}
176
177
.work figure dl dt {
178
	text-transform: uppercase;
179
	font-family: 'PT Sans Narrow';
180
	font-size: 12px;
181
	margin-bottom: -16px;
182
}
183
184
.work figure dl dd {
185
	margin-left: 0;
186
}
187
188
.current-li {
189
	color: #000;
190
}
191
192
.current {
193
	-webkit-filter: sepia(0) !important;
194
195
	-webkit-transform: scale(1.05);
196
	-moz-transform: scale(1.05);
197
	-o-transform: scale(1.05);
198
	-ms-transform: scale(1.05);
199
	transform: scale(1.05);
200
201
	-webkit-backface-visibility: hidden;
202
	-moz-backface-visibility: hidden;
203
	-o-backface-visibility: hidden;
204
	-ms-backface-visibility: hidden;
205
	backface-visibility: hidden;
206
}
207
208
.not-current {
209
	-webkit-transform: scale(0.75);	
210
	-moz-transform: scale(0.75);
211
	-o-transform: scale(0.75);
212
	-ms-transform: scale(0.75);
213
	transform: scale(0.75);
214
215
	-webkit-filter: grayscale(1) !important;
216
}
217
218
.not-current:hover dl {
219
	opacity: 0 !important;
220
}

Давайте тепер візьмемося за JS.


Крок 17: Алгоритм

Нижче перераховується те що ми будемо виконувати за допомогою коду JavaScript (у хронологічному порядку):

  1. відстежувати вибір nav > li;
  2. зменшувати розмір всіх контрольних зображень завдяки додаванню їм класу .not-current ;
  3. додавати клас .current-li до елементів <li>, що відповідають   вибраній категорії;
  4. видаляти клас .not-current тільки у контрольних зображень вибраної категорії;
  5. додавати клас .current до всіх контрольних зображень вибраної категорії;

крок 2 буде виконано за допомогою функції scaleDown(), а 3, 4 та 5 – за допомогою функції show(category);


Крок 18: Функція scaleDown()

Використовуючи методи removeClass та addClass ми видалимо клас .current у елементів, які його мають, та додамо до них всіх клас .not-current . Також ми видалимо клас .current-li у всіх елементів <li>, які у цей момент його мають.

1
function scaleDown() {
2
3
	$('.work > figure').removeClass('current').addClass('not-current');
4
	$('nav > ul > li').removeClass('current-li');
5
6
}

Крок 19: Функція show(category)

Ця функція буде виконуватися кожного разу при виборі <li>. Для початку ми викличемо scaleDown() для того, щоб зменшити розмір всіх контрольних зображень. Потім ми додамо клас .current-li до елементу <li>, що відповідає вибраній категорії; Після цього ми змінимо клас контрольних зображень, що належать до вибраної категорії, з .not-current на .current (ми застосуємо клас .not-current до всіх контрольних зображень у функції scaleDown()). Нарешті, якщо вибрано категорію ‘all’, то ми видалимо динамічно додані класи (тобто .current та .not-current) у всіх контрольних зображень.

Зверніть увагу: оскільки ім'я id (<li>) та класу (елементів figure) кожної категорії однакові, то ми просто будемо посилатися на <li> за допомогою ‘# + category’ та на елементи figure за допомогою ‘. + category’.

1
function show(category) {
2
3
	scaleDown();
4
5
	$('#' + category).addClass('current-li');
6
	$('.' + category).removeClass('not-current');
7
	$('.' + category).addClass('current');
8
9
	if (category == "all") {
10
		$('nav > ul > li').removeClass('current-li');
11
		$('#all').addClass('current-li');
12
		$('.work > figure').removeClass('current, not-current');
13
	}
14
15
}

Крок 20: Визначення вибраних елементів та виконання функції show(category)

Нарешті, за допомогою методу document.ready ми додамо клас .current-li до li#all та визначимо вибрані елементи nav > li. Потім ми отримаємо id вибраного <li> та виконаємо функцію show(category), де в якості ‘category’ буде виступати ‘this.id’, тобто вибраний <li>. Таким чином, наприклад, якщо вибрано <li> в id #print, то буде виконано функцію show(‘print’).

1
$(document).ready(function(){
2
3
	$('#all').addClass('current-li');
4
5
	$("nav > ul > li").click(function(){
6
		show(this.id);
7
	});
8
9
});

На цьому наш код JavaScript завершено.


Крок 21: Повний код Javascript

Весь код JavaScript виглядає наступним чином:

1
function scaleDown() {
2
3
	$('.work > figure').removeClass('current').addClass('not-current');
4
	$('nav > ul > li').removeClass('current-li');
5
6
}
7
8
function show(category) {
9
10
	scaleDown();
11
12
	$('#' + category).addClass('current-li');
13
	$('.' + category).removeClass('not-current');
14
	$('.' + category).addClass('current');
15
16
	if (category == "all") {
17
		$('nav > ul > li').removeClass('current-li');
18
		$('#all').addClass('current-li');
19
		$('.work > figure').removeClass('current, not-current');
20
	}
21
22
}
23
24
$(document).ready(function(){
25
26
	$('#all').addClass('current-li');
27
28
	$("nav > ul > li").click(function(){
29
		show(this.id);
30
	});
31
32
});

Тепер, коли наш сайт повноцінно функціонує, давайте зробимо його дизайн адаптивним.


Крок 22: Робимо дизайн адаптивним

Давайте відкриємо ‘media-queries.css’ та приступимо. То, як ви вирішите реалізувати ваші медіа-запити, повністю залежить від вас. Можливо, ви віддаєте перевагу розміщенню медіа-запитів у вашій головній таблиці стилів, можливо ви навіть полюбляєте розміщувати їх модулями та на одній лінії з об'явленнями стилів – вибір за вами!

Зміни стильового оформлення, потрібні для кожної контрольної точки, описуються нижче.

965px або менше

  • зменшити ширину контейнера до 840px;
  • зменшити висоту та ширину всіх контрольних зображень до 170px, щоб у кожному ряду розміщувалося 4 контрольних зображення [(170px + 40px) x 4 = 210px x 4 = 840px];
1
/* Small viewports — Old monitors, netbooks, tablets (landscape), etc. */
2
3
@media only screen and (max-width: 965px) {
4
	.container {
5
		width: 840px;
6
	}
7
	.work figure {
8
		width: 170px;
9
		height: 170px;
10
	}
11
}

860px або менше

  • зменшити ширину контейнера до 720px;
  • збільшити висоту та ширину всіх контрольних зображень назад до 200px, щоб у кожному ряду розміщувалося 3 контрольних зображення [(200px + 40px) x 3 = 240px x 3 = 720px];
1
/* Smaller viewports — more tablets, old monitors */
2
3
@media only screen and (max-width: 860px) {
4
	.container {
5
		width: 720px;
6
	}
7
	.work figure {
8
		width: 200px;
9
		height: 200px;
10
	}
11
}

740px або менше

  • зменшити ширину контейнера до 600px;
  • зменшити прозорість елементів з класом .not-current до 50% (оскільки ми тут працюємо, головним чином, з мобільними пристроями);
  • зменшити висоту та ширину всіх контрольних зображень до 160px, щоб у кожному ряду розміщувалося 3 контрольних зображення [(160px + 40px) x 3 = 200px x 3 = 600px];
1
/* Even smaller viewports — more tablets, etc. */
2
3
@media only screen and (max-width: 740px) {
4
	.container {
5
		width: 600px;
6
	}
7
	.work figure {
8
		width: 160px;
9
		height: 160px;
10
	}
11
	.not-current {
12
		opacity: 0.5;
13
	}
14
}

610px або менше

  • зменшити ширину контейнера до 460px;
  • задати відступи зверху та знизу для контрольних зображень величиною 20px та відступи зліва та справа величиною 60px;
  • збільшити висоту та ширину всіх контрольних зображень назад до 200px, щоб у кожному ряду розміщувалося 1 контрольне  зображення [(200px + 120px) x 1 = 320px x 1 = 320px];
1
/* Mobile phones (Landscape) and Tablets (Portrait) */
2
3
@media only screen and (max-width: 610px) {
4
	.container {
5
		width: 460px;
6
	}
7
	header {
8
		font-size: 400%;
9
	}
10
	nav ul li {
11
	}
12
	.work figure {
13
		margin-left: 40px;
14
		margin-bottom: 60px;
15
	}
16
	.work figure dl {
17
		height: 40px;
18
		top: 200px;
19
		bottom: 0px;
20
	}
21
}

480px або менше

  • зменшити ширину контейнера до 320px;
  • задати відступи зверху та знизу для контрольних зображень величиною 20px та відступи зліва та справа величиною 60px;
  • збільшити висоту та ширину всіх контрольних зображень назад до 200px, щоб у кожному ряду розміщувалося 1 контрольне  зображення [(200px + 120px) x 1 = 320px x 1 = 320px];
1
/* Mobile phones (Portrait) */
2
3
@media only screen and (max-width: 480px) {
4
	.container {
5
		width: 320px;
6
	}
7
8
	.work figure {
9
		width: 200px;
10
		height: 200px;
11
		margin: 20px 60px;
12
	}
13
}


Підтримка браузерами

Базова можливість масштабування (трансформації CSS) відмінно працює у більшості головних браузерів, серед яких:

  • IE 9+ (використовуйте http://www.useragentman.com/IETransformsTranslator/ для ранніших версій)
  • Firefox 14+
  • Chrome 21+
  • Safari 5.1+

Ефект фільтр (* візуальний ефект) (сепія та шкала рівнів сірого) функціонує тільки у браузерах, що працюють на основі Webkit.


Фідли jsFiddle (* онлайн редактор коду для тестування JavaScript, HTML та CSS)

Ми підготували три фідли js для вас, щоб ви спробували поекспериментувати з:

  1. Caption Split Effect (Vertical) (*ефектом розділу надпису на частини по вертикалі)
  2. Caption Split Effect (Horizontal) (* ефектом розділу надпису на частини по горизонталі)
  3. Diagonal Masked Thumbnail Images

Завершення

От і все! Ми вдало створили робоче фільтрівне портфоліо з адаптивним дизайном. Сподіваюся, що ви з користю провели час! Дякую за проявлену зацікавленість!

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