Створюємо фільтрівне портфоліо з адаптивним дизайном завдяки можливостям CSS
() translation by (you can also view the original English article)
Завдяки властивій фільтрівним портфоліо (на зразок Tuts+ hub) візуальній привабливості вони стали дуже популярними. Сьогодні ми будемо створювати одне з таких за допомогою простої розмітки, коду CSS та невеликої кількості коду jQuery.
Крок 1: Файлова структура
Ми організуємо файли проекту наступним чином:

Сформуйте проект на основі цих файлів (вам потрібно буде завантажити 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>© 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>© 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 (у хронологічному порядку):
- відстежувати вибір
nav > li
; - зменшувати розмір всіх контрольних зображень завдяки додаванню їм класу
.not-current
; - додавати клас
.current-li
до елементів<li>
, що відповідають вибраній категорії; - видаляти клас
.not-current
тільки у контрольних зображень вибраної категорії; - додавати клас
.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 для вас, щоб ви спробували поекспериментувати з:
- Caption Split Effect (Vertical) (*ефектом розділу надпису на частини по вертикалі)
- Caption Split Effect (Horizontal) (* ефектом розділу надпису на частини по горизонталі)
- Diagonal Masked Thumbnail Images
Завершення
От і все! Ми вдало створили робоче фільтрівне портфоліо з адаптивним дизайном. Сподіваюся, що ви з користю провели час! Дякую за проявлену зацікавленість!