FAQ страница для сайта на jQuery, HTML и CSS

Простая FAQ страница на сайте с jQuery, HTML и CSS

· HTML & CSS, JavaScript и Блог · 5 мин чтения
AnyComment - Современный виджет комментариев для WordPress

На всех успешных или популярных сайтах есть страница FAQ (Frequently Asked Questions).

Переводя на русский, FAQ — это «Часто Задаваемые Вопросы». Такая страница помогает ответить на часто задаваемые вопросы от пользователей.

В этой записи я хочу поделиться вариантом того, как такую страницу можно сделать с использованием HTML, CSS (SASS — необязательно) и jQuery.

FAQ демо

Ниже я покажу и немного опишу код, который использовался для создания FAQ страницы из демо выше.

HTML

Ниже представлен каркас для FAQ, который я в дальнейшем использовал для jQuery, чтобы открыть/закрыть вопрос.

Некоторые из классов очень важны для корректной его работы, поэтому сначала полностью используйте мой вариант, а дальше уже исправляйте как вам захочется.

<div class="container">
  <h1 class="nice-header">NICE FAQ <a href="http://bologer.ru/prostaya-faq-stranica-s-jquery-html-i-css/" class="sub">by Alexander Teshabaev</a></h1>
  <div class="faq">
    <ul class="faq-questions">
      <li>
        <h4 class="faq-question">Вопрос</h4>
        <p class="faq-answer">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book</p>
      </li>
      <li>
        <h4 class="faq-question">Вопрос длиннее </h4>
        <p class="faq-answer"><img src="http://www.lipsum.com/images/banners/black_234x60.gif"></p>
      </li>
      <li>
        <h4 class="faq-question">Вопрос</h4>
        <p class="faq-answer">Ответ</p>
      </li>
      <li>
        <h4 class="faq-question">Вопрос которы может быть последним</h4>
        <p class="faq-answer">Ответ</p>
      </li>
    </ul>
  </div>
</div>

Основная часть этого каркаса — это маркированный список (<ul>), внутри которого пишутся <li>.

Каждый <li> элемент — это новый вопрос в FAQ. Так же, каждый <li> должен включать в себя <h4 class="faq-question"></h4>  — это вопрос и <p class="faq-answer"></p>  — это ответ на вопрос из <h4>.

Далее нужно сделать примерный дизайн для FAQ.

CSS (SCSS)

С помощью CSS нужно придать каркасу выше более-менее приятный вид. Я использовать SCSS препроцессор, так как это быстрее и понятнее для меня.

Если вы не понимаете как пользоваться препроцессором SCSS, то во вкладке CSS есть кнопка «View Compiled» как показано на скриншоте ниже:

View Compiled внопка CSS

Нажав на нее, вы сможете посмотреть уже скопилированный CSS, то есть его нормальный (традиционный) вид. Как например код ниже.

:after, :before, * {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

body {
  font-size: 11pt;
  text-align: left;
  font-family: Verdana, Tahoma, sans-serif;
}

.container {
  width: 70%;
  margin: 50px auto;
  display: block;
}
.container .nice-header {
  text-align: center;
  font-size: 4.5em;
  margin-bottom: 20px;
  font-weight: bold;
  color: #D8D8D8;
  position: relative;
}
.container .nice-header .sub {
  color: #676767;
  position: absolute;
  top: -20px;
  right: 0;
  font-family: Georgia, serif;
  font-size: 13pt;
  font-weight: normal;
  font-style: italic;
  text-decoration: none;
}
.container .nice-header .sub:hover {
  text-decoration: underline;
  color: #000;
}
.container .faq {
  width: 100%;
  position: relative;
}
.container .faq-questions {
  list-style: none;
}
.container .faq-questions, .container .faq-questions > li {
  width: 100%;
  display: block;
  padding: 10px;
}
.container .faq-questions > li:nth-child(odd) {
  background-color: #E8E8E8;
}
.container .faq-questions > li:nth-child(even) {
  background-color: #D8D8D8;
}
.container .faq-questions > li h4.faq-question, .container .faq-questions > li faq-question {
  font-size: 12pt;
  font-weight: bold;
  color: #4E4E4E;
  cursor: pointer;
}
.container .faq-questions > li p.faq-answer, .container .faq-questions > li .faq-asnwer {
  font-size: 10pt;
  line-height: 1.5;
  margin-top: 7px;
  display: none;
}
.container .faq-questions > li p.faq-answer:hover, .container .faq-questions > li .faq-asnwer:hover {
  color: #000;
}

После этого нужно добавить немного магии с помощью jQuery.

jQuery

С помощью jQuery я смогу контролировать события связанные с FAQ страницей. Например, чтобы при нажатии на заголовок вопроса — открывался ответ на него. Или чтобы при нажатии на другой вопрос (при условии того, что какой-либо вопрос уже был открыт), предыдущий скрывался и открывался только текущий.

$(function() {
  var $speed = 200; 
  var $class = 'opened';
  var $class_open = '.faq-answer';
  
  $(document).ready(function() {
     $('.faq-question').on('click', function() {
       $ul = $(this).closest('ul');
       $answer = $(this).closest('li').find($class_open);
       
       if( !$(this).closest('li').hasClass($class) ) {
       
         $ul.find('li').each(function() {
           if( $(this).hasClass($class) )
             $(this).removeClass($class).find($class_open).slideUp($speed);
         });
       }
       
       $answer
         .slideToggle($speed)
         .closest('li')
         .toggleClass($class);
     });
  });
});

Из jQuery скрипта выше, видно три основных переменные — это $speed, $class и  $class_open.

$speed отвечает за скорость скрытия или показа ответа на вопрос при нажатии на заголовок.

$class — это имя класса, которое добавляется на <li> элемент открытого вопроса. Например, если вы нажали на первый вопрос, то на <li> элемент текущего вопроса будет добавлен класс, который вы напишите для этой переменной.

$class_open  — это имя класса, которое используется для ответа на каждый из вопросов. Если вы поменяли имя класса в HTML каркасе, то для этой переменной его тоже нужно поменять.

В целом логику работы данного скрипта я уже описал выше. Если у вас остались какие-либо вопросы — вы можете написать их ниже, к этой записи.