CSS - зроби це красиво!

Наш блог все ще виглядає доволі жахливо, чи не так? Час зробити його гарним! Для цього будемо використовувати CSS.

Що таке CSS?

Каскадні таблиці стилів (англ. Cascading Style Sheets або скорочено CSS) - спеціальна мова, що використовується для опису зовнішнього вигляду і форматування сайту написаного мовою розмітки (як HTML). Сприймайте це, як свого роду макіяж для нашої веб-сторінки;).

Але ми ж не хочемо починати знову все з нуля, правда? А візьмемо знову щось, що вже було створене програмістами і опубліковано в Інтернеті для вільного користування. Ви ж знаєте, знову винаходити велосипед зовсім не весело.

Скористаємось Bootstrap!

Bootstrap - один з найбільш популярних HTML і CSS фреймворків для розробки прекрасних веб-сайтів: http://getbootstrap.com/

Він був написаний програмістами, які працювали для Twitter'у і на сьогоднішній день удосконалюється волонтерами з усього світу.

Встановлення Boostrap

Для встановлення Bootstrap, вам потрібно додати наступні рядки у розділ <head> вашого .html файлу (blog/templates/blog/post_list.html):

<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">

Це не додасть жодного файлу до вашого проекту. Натомість ці рядки просто вказують на файли опубліковані в інтернеті. Просто рухайтесь вперед, відкрийте ваш веб-сайт і оновіть сторінку. Ось так!

Рисунок 14.1

Вже краще!

Статичні файли в Django

Інше поняття, про яке ви дізнаєтесь сьогодні називається статичні файли. Статичні файли включають усі ваші CSS файли та малюнки -- файли, які не є динамічними, а отже їхній вміст не залежить від змісту запиту і буде однаковим для усіх користувачів.

CSS -- статичний файл, отже для того щоб налаштувати CSS, нам потрібно спочатку налаштувати статичні файли в Django. Вам потрібно зробити це лише один раз. Почнемо:

Налаштування статичних файлів в Django

Спочатку, нам потрібно створити папку для зберігання наших статичних файлів. Створимо папку static всередині нашої папки djangogirls .

djangogirls
├─── static
└─── manage.py

Відкриємо файл mysite/settings.py, опустимося вниз і додамо наступні рядки:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

Таким чином Django буде знати де можна знайти ваші статичні файли.

Ваш перший CSS файл!

Що ж, тепер давайте створимо CSS файл для того, щоб додати ваш власний стиль до вашої веб-сторінки. Створіть нову папку з назвою css всередині вашої папки static. Потім всередині цієї папкиcss створіть новий файл з назвою blog.css. Готово?

static
└─── css
        blog.css

Настав час написати CSS! Відкрийте файл static/css/blog.css в обраному кодовому редакторі.

Не будемо тут занурюватись надто глибоко в процес налаштування і вивчення CSS, оскільки це так просто, що ви можете вивчити цей матеріал самостійно після завершення воркшопу. Ми наполегливо рекомендуємо пройти цей курс Codeacademy HTML & CSS course для того щоб вивчити все, що вам потрібно знати про оформлення веб-сайтів з CSS.

Але принаймні попрацюємо трохи. Можливо, ми могли б змінити колір заголовка? Щоб зрозуміти кольори, комп'ютери використовують спеціальні коди. Вони починаються з # і далі слідують 6 літер (A-F), а також цифри (0-9). Ви можете знайти коди кольорів, наприклад, тут: http://www.colorpicker.com/. Також можете користуватися вже визначеними кольорами , такими як red та green.

У вашому файлі static/css/blog.css потрібно додати наступний код:

h1 a {
    color: #FCA205;
}

h1 a -- CSS селектор. Це означає, що ми застосовуємо наші стилі до кожного елементу a всередині елементу h1 (наприклад, коли ми маємо в коді щось на зразок: <h1><a href="">link</a></h1>). У цьому випадку, ми повідомляємо про те, що треба змінити колір на #FCA205, тобто помаранчевий. Звичайно, ви можете визначити тут ваш власний колір!

В CSS файлі ми визначаємо стилі для елементів файлу HTML. Елементи ідентифікуються іменами (тобто a, h1, body), атрибутом class або атрибутом id. Class і id -- імена, які ви присвоюєте елементам власноруч. Класи (сlasses) визначають групи елементів, а ідентифікатори (id), в свою чергу, вказують на специфічні елементи. Наприклад, наступний тег може бути ідентифікований CSS з використанням тегового імені a, класу external_link, або ідентифікатора link_to_wiki_page:

<a href="http://en.wikipedia.org/wiki/Django" class="external_link" id="link_to_wiki_page">

Читайте про CSS селектори в CSS Selectors in w3schools.

Далі, нам треба також повідомити наш HTML шаблон про те, що ми додали CSS. Відкрийте файл blog/templates/blog/post_list.html і цей рядок до самого початку:

{% load staticfiles %}

Тут ми лише завантажуємо статичні файли:). Далі, між <head> і </head>, після лінків на файли Bootstrap CSS (браузер читає файли за порядком їх слідування, отже код нашого файлу перекриває код в файлах Bootstrap), додайте цей рядок:

<link rel="stylesheet" href="{% static 'css/blog.css' %}">

Ми щойно повідомили наш шаблон де розташовані наші CSS файли.

Тепер ваш файл має виглядати наступним чином:

{% load staticfiles %}
<html>
    <head>
        <title>Django Girls blog</title>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
        <link rel="stylesheet" href="{% static 'css/blog.css' %}">
    </head>
    <body>
        <div>
            <h1><a href="/">Django Girls Blog</a></h1>
        </div>

        {% for post in posts %}
            <div>
                <p>published: {{ post.published_date }}</p>
                <h1><a href="">{{ post.title }}</a></h1>
                <p>{{ post.text|linebreaks }}</p>
            </div>
        {% endfor %}
    </body>
</html>

OK, збережіть файл і перезавантажте сторінку!

Рисунок 14.2

Чудова робота! Можливо, ми також хотіли б дати нашому веб-сайту трохи повітря і збільшити відступ зліва? Давайте спробуємо!

body {
    padding-left: 15px;
}

Додайте це до вашого CSS, збережіть файл і подивіться як це працює!

Рисунок 14.3

Можливо, ми могли б також налаштувати шрифт нашого заголовка? Вставте це всередину розділу <head> файлу blog/templates/blog/post_list.html:

<link href="//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext" rel="stylesheet" type="text/css">

Цей рядок імпортує шрифт із назвою Lobster з шрифтів Google (https://www.google.com/fonts).

Тепер додайте рядок font-family: 'Lobster'; до файлу static/css/blog.css всередині блоку визначення стилю для h1 a (код між дужками { і }) та перезавантажте сторінку:

h1 a {
    color: #FCA205;
    font-family: 'Lobster';
}

Рисунок 14.3

Чудово!

Як було зазначено вище, CSS має концепцію класів, котра дозволяє вам іменувати частину HTML коду і застосовувати стилі лише для цієї частини без будь-якого ефекту для інших. Це надзвичайно корисно якщо у вас є скажімо два блоки div, але вони виконують зовсім різні функції (як ваш заголовок і пост), отже, ви не хочете, щоб вони виглядали однаково.

Дайте імена певним частинам HTML коду. Додайте клас із назвою page-header до блоку div, що містить ваш заголовок, як це зроблено тут:

<div class="page-header">
    <h1><a href="/">Django Girls Blog</a></h1>
</div>

А тепер додайте клас post до вашого блоку div, що містить сам допис.

<div class="post">
    <p>published: {{ post.published_date }}</p>
    <h1><a href="">{{ post.title }}</a></h1>
    <p>{{ post.text|linebreaks }}</p>
</div>

А тепер додамо визначення блоків для різних селекторів. Селектори, які починають із символу . стосуються класів. Існує багато хороших довідників про CSS в Інтернеті, які можуть допомогти вам зрозуміти наступний код. Поки що, просто скопіюйте і вставте це у ваш файл djangogirls/static/css/blog.css:

.page-header {
    background-color: #ff9400;
    margin-top: 0;
    padding: 20px 20px 20px 40px;
}

.page-header h1, .page-header h1 a, .page-header h1 a:visited, .page-header h1 a:active {
    color: #ffffff;
    font-size: 36pt;
    text-decoration: none;
}

.content {
    margin-left: 40px;
}

h1, h2, h3, h4 {
    font-family: 'Lobster', cursive;
}

.date {
    float: right;
    color: #828282;
}

.save {
    float: right;
}

.post-form textarea, .post-form input {
    width: 100%;
}

.top-menu, .top-menu:hover, .top-menu:visited {
    color: #ffffff;
    float: right;
    font-size: 26pt;
    margin-right: 20px;
}

.post {
    margin-bottom: 70px;
}

.post h1 a, .post h1 a:visited {
    color: #000000;
}

Далі модифікуйте HTML код, що відображує пости. Замініть:

{% for post in posts %}
    <div class="post">
        <p>published: {{ post.published_date }}</p>
        <h1><a href="">{{ post.title }}</a></h1>
        <p>{{ post.text|linebreaks }}</p>
    </div>
{% endfor %}

в blog/templates/blog/post_list.html на:

<div class="content container">
    <div class="row">
        <div class="col-md-8">
            {% for post in posts %}
                <div class="post">
                    <div class="date">
                        {{ post.published_date }}
                    </div>
                    <h1><a href="">{{ post.title }}</a></h1>
                    <p>{{ post.text|linebreaks }}</p>
                </div>
            {% endfor %}
        </div>
    </div>
</div>

Збережіть файли і перезавантажте свій сайт.

Рисунок 14.4

Юхууу! Виглядає прекрасно, чи не так? Код, який ми щойно вставили насправді не є складним для розуміння і ви маєте бути в змозі зрозуміти більшу його частину просто прочитавши.

Не бійтеся трохи повозитися з цим CSS файлом і спробуйте поміняти деякі речі. Якщо щось зламається, не хвилюйтесь, ви завжди можете відмінити попередню дію!

В будь-якому разі, ми настійно рекомендуємо пройти цей безкоштовний он-лайн курс Codeacademy HTML & CSS course як своєрідну домашню роботу після воркшопу щоб вивчити усе, що потрібно знати про оформлення ваших веб-сайтів із CSS.

Готові до наступного розділу?! :)