Авторесайз внешних изображений в bbcodes через Fancybox

+29
2.23K
(Больших под ширину блога, маленьких по их истинному размеру.)
Пример:
Группе, к которой вы принадлежите, запрещено просматривать этот скрытый текст

Делалось для того, чтобы большие изображения не покидали пределов блока тела сообщения блога.
Еще удобство в том, что можно их просмотреть в текущем блоге все поочередно как галерею.
Все делалось на версии 1.7
Хак маленький и несложный.
UPD: Как заметил Keep — при при апдейте jquery, перестает работать lightbox. Проверил, если обновить lightbox — делу это не помогает. Зато при даунгрейде fancybox — до 1.2.5 — работает и то и другое. Возможно при обновлении jquery что-то еще перестало работать, и это пока незаметно. Перепишу тогда статью для 1.2.5. версии — т.е. идущей с дистрибутивом Instant. Переписал.


Загружаем архив Fancybox на геглекоде, Распаковываем его.
Нам понадобятся файлы
  1.  
  2. fancybox/fancybox/jquery.fancybox-1.2.5.css
  3. fancybox/fancybox/jquery.fancybox-1.2.5.js
  4. fancybox/fancybox/jquery.fancybox-1.2.5.pack.js
И все изображения из папки fancybox/fancybox/

Создадим например папку /includes/jquery/fancybox/ в которую все и скопируем.
Переносим нужные файлы в соответствии с нижеприведенным кодом, где указаны пути.
Далее добавляем в /templates/_default_/template.php перед </head>
  1.  
  2. <script type="text/javascript" src="/includes/jquery/fancybox/jquery.fancybox-1.2.5.pack.js"></script>
  3. <script type="text/javascript" src="/includes/jquery/fancybox/jquery.fancybox-1.2.5.js"></script>
  4. <link rel="stylesheet" type="text/css" href="/includes/jquery/fancybox/jquery.fancybox-1.2.5.css" media="screen" />
  5. <script type="text/javascript">
  6. // <![CDATA[
  7.  
  8. $(document).ready(function() {
  9.  
  10. $("a[rel=example_group]").fancybox({
  11. 'titlePosition' : 'over',
  12. 'overlayColor' : '#000',
  13. 'overlayOpacity' : 0.9,
  14. 'hideOnOverlayClick' : true,
  15. 'hideOnContentClick' : false,
  16. 'titleShow' : true,
  17. 'titleFormat' : function(title, currentArray, currentIndex, currentOpts) {
  18. return '<span id="fancybox-title-over">Image ' + (currentIndex + 1) + ' / ' + currentArray.length + '</span>';
  19. }
  20. });
  21. });
  22.  
  23. // ]]>
  24. </script>
В файле /includes/bbcode/bbcode.lib.php
В функции img_2html
вместо

  1. } else {
  2. return '<div class="bb_img" style="'.$div_style.'"><img src="'.htmlspecialchars($src).'" '.$attr.' /></div>';
  3. }
вставляем

  1. else {
  2. return '<span class="hoverbox" title="Нажмите левую кнопку мыши для просмотра изображения"><a rel="example_group" href="'.htmlspecialchars($src).'" title=""><img src="'.htmlspecialchars($src).'" alt=""/></a></span>';
  3. }
  4.  
В шаблоне в style.css — добавляем

  1. /** Стиль Fancybox **/
  2. .hoverbox img {
  3. background: #fff;
  4. color: inherit;
  5. vertical-align: top;
  6. max-width: 600px; /** Максимальная ширина при после которой будет идти ресайз - например ширина блога**/
  7. min-width: 100px; /** Минимальная ширина изображения, порога далее которого уменьшаться оно не будет**/
  8. border-color: #ddd #bbb #aaa #ccc;
  9. border-style: solid;
  10. border-width: 1px;
  11. padding: 3px;
  12. margin: 1px;
  13. }
Тестировалось только на Firefox 3.6.15 и Opera 11.01.
Скриншоты тут скорее неуместны, лучше посмотреть пример по вышеприведенной ссылке.
upd спустя 11 дней: Или никто не ставил или оно волшебным образом у всех работало )
Обнаружил, что одинаковых строк в bb_code.lib.php — две, заменять надо было вторую, та которая с "else", а не "if (!$zoom)". Статью обновил. Не всегда спустя время — удается четко воссоздать пошагово свои действия, вот и получаются такие косяки.
Да, решений подобного этому — уйма, всегда рад альтернативным решениям, менее громоздким и грациозным.
+1
Keep Keep 13 лет назад #
У вас не работает lightbox в фотогалереи
+1
Алхимик Алхимик 13 лет назад #
Да, благодарю за находку. Проверил - со старым jquery она работает, но перестает работать топик. Буду копать дальше.
+2
Алхимик Алхимик 13 лет назад #
Даунгрейдил fancybox до идущей с дистрибутивом версии jquery (1.2.5) - все заработало. Обновил статью.
0
Zau4man Zau4man 13 лет назад #
Мега плюс... Всю ночь искал нечто подобное, даже прикрутил, но найденный мною растягивал маленькие изображения, что не гуд...
Спасибо! Вечером прикручу.
0
Алхимик Алхимик 13 лет назад #
Ну да, как говорится - На девелоперов надейся, а сам не плошай.
Уверен после непродолжительного копания решение бы тоже нашлось - как описал Захар.
+1
Захар Захар 13 лет назад #
Ребятушки ))) Всё решается гораздо проще ))) Галерея, конечно же это круть, но это всё равно, что стрелять из гранатомёта по тараканам в закрытой комнате. Раз такая тема назрела, значит не все в курсе, что в CSS есть такие чудесные параметры, как max-width и max-height добавляем к классу того модуля, где картинки портят шаблон max-width: требуемая ширина в пикселах;
+2
Захар Захар 13 лет назад #
"буратино был тупой" это про меня ))) забыл разжевать, применяем к классу с параметром img
например для стенки в профиле это будет выглядеть так
Код PHP:
.usr_wall usr_profile_block img {max-width:600px;}
0
13 лет назад #
я совсем тупой, куда ето вставлять? .usr_wall usr_profile_block img {max-width:600px;}
У меня вот такое есть
.usr_profile_block{
clear:both;
margin-top:10px;
padding-top:10px;
border-top:1px solid #C3D6DF;
margin-left:10px;
што нужно изменить?
0
fact fact 13 лет назад #
а куда действительно это нужно вставить в css?
+1
EVV EVV 13 лет назад #
а куда действительно это нужно вставить в css?

И мне интересно. Подскажите пожалуйста.
+1
Алхимик Алхимик 13 лет назад #
Ну не так уж чтобы, с тараканами я всегда находил общий язык, и до гранатометов так и не дошло.
Через max/min-width тут по сути и регулируется максимальная/минимальная ширина, просто кроме всего прочего - нажав на изображение его становится видно на весь экран сразу, без манипуляций с копипастой. А, что напомнил про высоту - это благодарю, полезное замечание. А то ведь могут и вставить прозрачную картинку в 1px по ширине и over 9000px по высоте и думай потом - чем прогневил богов )
Естественно покопавшись еще больше в движке может чего более интересного и придумал бы. Но такую-же схему использую на форуме phpbb - и она не вызывала нареканий пользователей. Если пользователь ходит по сайтам в режиме [Paranoia] с отключенной JavaScript - то картинка просто откроется в этом-же окне.
По хорошему счету - авторесайз изображения по ширине соответствующего блока должен идти в шаблоне по дефолту. Тогда и не будет постройки велосипедов на гусеничном ходу )
0
Захар Захар 13 лет назад #
Дружище, я не пытался как то гнобить твоё решение, просто кому то потребуется более простое решение и я в него ткнул своим кривым пальцем. Твою фишку тоже применю на парочке проектов ))) Спасибо
0
Алхимик Алхимик 13 лет назад #
Ну дык ты видел палки у лыжников скоростного спуска? Тут та-же фигня )
+1
EVV EVV 13 лет назад #
Алхимик, все замечательно работает. Спасибо и +++

Еще от автора

Сворачивание блоков в сайдбаре с запоминанием позиции в cookies
Тут уже была статья о сворачивающихся блоках - http://instantcms.ru/blogs/narabotochki/svorachivanie-blokov.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.