Yii: Красивенький и чистенький JavaScript плавно прокручивает страницу до якоря и делает лёгкий откат
В нужном файле вида вставляем
<a href="#user_articles">Статьи от пользователей</a>
Это может быть меню второго уровня или просто ссылка-якорь в основном тексте. Дальше в том месте куда делаем переход ставим якорь
<a name="user_articles"></a> <h3 id="user_articles"> <span>Статьи от пользователей</span> </h3>
Указанный в заголовке id="user_articles" используется для отыскивания вложенного в него span, у которого JavaScript создаст class="active". А в CSS можно прописать для него стиль. Вот зачем это всё. Если нужен только плавный переход, то достаточно "голого" якоря.
Как хорошие мальчики, Javascript-функции будем сохранять в отдельный файл, например script.js
Вот всё его содержимое, которое и даёт нам чудный и привлекательный эффект:
$(function(){ // По нажатию на якорную ссылку едем к якорю и потом оттягиваемся на 100px вверх $("a[href*=#]:not([href=#])").bind('click', function (event) { // Устанавливаем class="active" у span document.getElementById("user_articles").getElementsByTagName('span')[0].setAttribute("class", "active"); var thisHash = this.hash; var targetOffset = $(thisHash).offset().top; $("html,body").stop().animate({ scrollTop: targetOffset }, 1100 ).animate({ scrollTop: targetOffset -100 }, 1100 ); location.hash = thisHash; event.preventDefault(); }); });
Я выделил основополагающее для себя место - доступ к HTML-элементу <span>, который сидит внутри другого элемента <h3 id="user_articles">.
Другой интересный момент - последовательное использование jQuery функции .animate(), первый раз она прокручивает нас до нашего якоря, вторая .animate() откручивает на 100px вверх.
Получился миленький эффект плавной прокрутки. Тут задействована библиотека jQuery, но ничего страшного, ведь в Yii Framework она подключается по умолчанию.
А вот наш файл со скриптами script.js надо подключить. И делаем мы это в контроллере, в соответствующем методе добавляя 2 строчки:
$cs = Yii::app()->clientScript; $cs->registerScriptFile(Yii::app()->request->baseUrl.'/js/script.js');
Для общего развития так же можно добавлять js скрипты и css стили в файлы вида (views):
$cs = Yii::app()->clientScript; // Get client script $cs->registerCSSFile(Yii::app()->request->baseUrl.'/css/lytebox.css'); // Add CSS $cs->registerScriptFile(Yii::app()->request->baseUrl.'/js/lytebox.js'); // Add JS
Пока такой способ нас устраивает, но если будем много фишек делать на JavaScript, то правильнее будет сделать автоматическое подключение js файлов в Yii
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 14 Разработка приложения на Yii. Урок 14: Выводим список категорий как новый виджет на сайте (29.04.2015)
- 13 Разработка приложения на Yii. Урок 13: Внедряем категории для статей. (29.04.2015)
- 12 Разработка приложения на Yii. Урок 12: Профилирование приложения, включаем кеширование. (20.01.2015)
- 11 Yiico. Видеокурс по разработке сайта на Yii. Урок 11: Отладка приложения, включаем журналирование. (20.01.2015)
- 10 Yiico. Видеокурс по разработке сайта на Yii. Урок 10: Если ваше приложение находится не в корневой папке, а во вложенной. (19.10.2014)
- 9 Разработка сайта на Yii с нуля. Урок 9. Выборка статей определённого автора. (13.08.2014)
- 8 Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? (25.07.2014)
- 7 Разработка сайта на Yii с нуля. Урок 7. Изменение количества выводимых записей на странице в CGridView. Включаем сессии Yii. (04.09.2013)
- 6 Разработка сайта на Yii с нуля. Урок 6. Автоматич. отправка оповещений об одобренных комментариях на email автора комментария (11.08.2013)
- 5 Разработка сайта на Yii с нуля. Урок 5. Переименовываем blog в yiico. Изменяем "Home" в breadcrumbs. Включаем Gzip-сжатие. (09.08.2013)
- 4 Курс по Yii с нуля. Урок 4. Дорабатываем простую работу с пользователями: хранение пароля при редактировании пользователя. (13.04.2013)
- 3 Курс по Yii с нуля. Урок 3. Создаём новых пользователей. Организуем простую систему авторизации. Аутентификация, пароли, соли. (20.07.2014)
- 2 Yii + Git (github) на Mac. (24.03.2013)
- 2 Курс по Yii с нуля. Урок 2. Переносим и настраиваем Yii и проект нашего сайта на рабочем сервере. Избавляемся от index.php в url (09.07.2014)
- 1 Курс по Yii с нуля. Урок 1. Устанавливаем Yii на локальном компьютере. Заводим проект будущего сайта. (10.03.2013)
- 0 Composer – пакетный менеджер PHP. Что и как? (22.07.2014)
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 Yii: Статичные страницы (создание, редактирование, удаление) (28.04.2014)
- 0 Yii: Расширение ECKEditor = Связка ckeditor + kcfinder (визуальный редактор с бесплатным файловым менеджером) (28.04.2014)
- 0 Yii: Bootstrap tabs, делаем активной вкладку на которую выполняется переход по ссылке (20.03.2014)
- 0 Yii: Доступ к атрибуту модели из файла шаблона (Вызов в шаблоне какого-либо атрибута модели). (17.02.2014)
- 0 CodeIgniter: Всплывающая форма обратной связи на Ajax в Bootstrap Modal и проверкой Captcha (18.02.2014)
- 0 Yii: Множественный автокомплит с помощью CJuiAutoComplete (автокомплит нескольких значений в одно поле) (07.02.2014)
- 0 Yii: Фотогалерея через поведение (доработка расширения imagesgallerymanager) (08.03.2016)
- 0 Opencart: Модуль Filter Product OpenCart_v1.5.x: Как скрывать недоступные опции в фильтре (23.10.2013)
3 комментариев
У нас эффект плавной прокрутки на jQuery применяется на странице описания города, значит в контроллере ищем action, который отвечает за это - actionViewCity и в самое начало этого экшна вписываем:
public function actionViewCity(/*id*/)
{
$cs = Yii::app()->clientScript;
$cs->registerScriptFile(Yii::app()->request->baseUrl.'/js/whytravel.js');
$city=$this->loadModel();
...
}
можно посмотреть демо на сайте ПочемуПутешествовать
Чтобы при переходах по ссылкам не "дергало", нужно добавить callback-функцию в последний animate и строку
перенести в него.