Переключение содержимого масонства и jQuery (слайддаун, шоу и т. Д.) - PullRequest
3 голосов
/ 12 февраля 2012

Я создаю блог, в котором я хочу отображать только соответствующие изображения каждого поста в хорошо упорядоченной сетке с помощью масонства.Когда пользователь нажимает на изображение, текстовое содержимое блога будет показано под изображением (на той же странице).По какой-то причине скрытый контент не будет отображаться, когда я добавлю функцию щелчка.Я не очень знаком с обработчиком событий on () (требуется из-за масонства), и может быть что-то очевидное, что я пропускаю.Что происходит, я вижу в DOM, что элементы получают display: block, но они не отображаются.

HTML -

<?php get_header(); ?>
        <div id="posts" class="clearfix">
        <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
            <div class="post">
                <a class="view" href="#"><?php the_post_thumbnail(465, 999) ?></a>
                <div class="overlay">+</div>
                <article>
                    <a href="#" class="close">x</a>
                    <h1><?php the_title() ?></h1>
                    <hr>
                    <?php the_content() ?>
                    <span><?php the_date('Y/d/m') ?></span>
                </article>
            </div>
        <?php endwhile; endif;  ?>
        </div>
        <div class="navigation">
            <?php next_posts_link(); ?>
        </div>
<?php get_footer(); ?>

JavasScript -

var $container = $('#posts');

    $container.imagesLoaded(function(){
        $container.masonry({
            itemSelector: '.post',
            columnWidth: 475,
            isAnimated: true
        });
    });

    $(document).on("click", "a.view", function(){
        if(!$(this).parent().find('article').is(':visible')){
            $(this).parent().find('article').slideDown(250);
        }
        else {
            $(this).parent().find('article').slideUp(250);
        }
        e.preventDefault();
    });

    $(document).on("mouseover", "a.view", function(){
      $(this).parent().find('.overlay').stop().animate({ opacity: 1 }, 250);
    });
    $(document).on("mouseout", "a.view", function(){
      $(this).parent().find('.overlay').stop().animate({ opacity: 0 }, 250);
    });

Ответы [ 7 ]

2 голосов
/ 21 февраля 2012

Посмотрел ваш сайт, и я верю, что ваша проблема в том, что Masonry вычисляет размеры и позиции, когда вы запускаете .masonry () и устанавливаете все элементы в положение: абсолютное, а затем при расширении текста он будет скрытПо пункту ниже ...

Так что вам нужно "обновить" кладку () после расширения элемента.Я не очень хорошо знаю плагин, но, возможно, $ ('# posts'). Masonry ('reload');сделает свое дело :)!

2 голосов
/ 18 февраля 2012

Ваш js-код работает нормально, но единственная проблема в том, что теги <article> перекрываются с другими изображениями, показанными ниже.Вы можете применить этот код к значку + (при наведении курсора на любое изображение), который будет отображать детали изображения и нажимать на изображение ниже.

$('div#posts > div.post > a.view').each (function (i) {
    $(this).click(function () {
        var articleHeight = $(this).siblings('article').show().height();
        $('div#posts > div.post').each (function (j) {
            if (i%2 == 0 && j%2 == 0 && j > i) {
                var currentTop = parseInt($(this).css('top'));
                $(this).css({top : currentTop + articleHeight});
            } else if (i%2 != 0 && j%2 != 0 && j > i) {
                var currentTop = parseInt($(this).css('top'));
                $(this).css({top : currentTop + articleHeight});
            }
        });
    });
}); 

PS Чтобы увидеть приведенный выше код, просто запустите код в консоли и нажмите +.

2 голосов
/ 18 февраля 2012

Не уверен, но попробуйте что-нибудь подобное с live (), возможно:

var $container = $('#posts');

$container.imagesLoaded(function(){
    $container.masonry({
        itemSelector: '.post',
        columnWidth: 475,
        isAnimated: true
    });
});

$(document).ready(function(){

    $("a.view").live("click", function(){
            if(!$(this).parent().find('article').is(':visible')){
                $(this).parent().find('article').slideDown(250);
            }
            else {
                $(this).parent().find('article').slideUp(250);
            }
            e.preventDefault();
        });

    $("a.view").live("mouseover", "a.view", function(){
          $(this).parent().find('.overlay').stop().animate({ opacity: 1 }, 250);
        });

    $("a.view").live("mouseout", "a.view", function(){
          $(this).parent().find('.overlay').stop().animate({ opacity: 0 }, 250);
    });

});

Изменить для вашего сайта

Попробуйте

<article style="display: block; z-index:1000;position:absolute;">

Кажется, что для отображения текста.

Если вы хотите сместить следующий блок / изображение, используйте положение: абсолютное;

1 голос
/ 31 января 2013

Ответ Bang даст вам 90% пути туда.

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

Вот что я сделал:

Да, функция 'reload' для плагина masonry - это то, что вам нужно.

Поместите его в часть обратного вызова вашего анимационного эффекта jquery.

Для меня это было:

$ ('# div-that-is-expanding)). SlideDown ("slow", function () {$ (' # container-for-masonry-tile '). Masonry (' reload ');}) ;

0 голосов
/ 17 апреля 2014

Если это поможет, я создал шаблон, который использует макет кладки для шаблона WordPress, который можно использовать в качестве индексной страницы блога. Вы можете увидеть его с помощью простого CSS, и вы можете протестировать его и поиграть с нимПока что я использую его как альтернативу необходимости использовать JQuery, но скоро я обновлю его, чтобы использовать JQuery и добавлять интересные функции.

`

<?php get_header(); ?>
    <style>
        @media all and (min-width: 676px) and (max-width: 1200px) {
            #list_blog {
            -moz-column-count: 2 !important;
            -moz-column-gap: 0px !important;
            -webkit-column-count: 2 !important;
            -webkit-column-gap: 0px !important;
            column-count: 2 !important;
            column-gap: 0px !important;
            }
        }
        @media all and (max-width: 676px) {
            #list_blog {
            -moz-column-count: 1 !important;
            -webkit-column-count: 1 !important;
            column-count: 1 !important;
            }
        }
    </style>
    <article id="post-<?php the_ID(); ?>" <?php post_class(); ?> ">
        <div class="x-container-fluid max width">
            <div id="blog_container">
            <div class="entry-content" id="list_blog"
                style=" -moz-column-count: 3;
                    -moz-column-gap: 0px;
                    -webkit-column-count: 3;
                    -webkit-column-gap: 0px;
                    column-count: 3;
                    column-gap: 0px;
                ">
                <?php query_posts( array( 'posts_per_page' => 15 ) ); ?>
                <?php if(have_posts()): while(have_posts()): the_post(); ?>
                <div class="post_item" style="display: inline-block;background: #fff;border-radius: 5px;box-shadow: 3px 3px 10px #BBB;margin-right: 30px;width: 96%;margin-bottom: 15px;">
                <h4 class="post-heading" style="padding: 10px;margin-top: 0;margin-bottom: 10px;"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
                <div class="blog-image"><a href="<?php the_permalink(); ?>"><?php echo get_the_post_thumbnail( $post_id, $size, $attr ); ?></a></div>
                <div class="content" style="padding: 10px;"><?php the_excerpt(); ?></div>

                </div>

                <?php endwhile; ?>
                <div class="navigation">
                    <span class="newer"><?php previous_posts_link(__('« Newer','example')) ?></span>
                    <span class="older"><?php next_posts_link(__('Older »','example')) ?></span>
                </div><!-- /.navigation -->
                <?php endif; ?>

            </div> <!-- end .entry-content -->

            </div><!--blog_container-->
        </div> <!-- .x-container-fluid.max.width -->
    </article> <!-- end .hentry -->

    <?php wp_reset_query(); ?>
<?php get_footer(); ?>`
0 голосов
/ 17 января 2013

Вам нужно запустить перезагрузку каменной кладки после завершения slideUp.

.slideUp(400,function() {
    $('#container').masonry('reload');
});
0 голосов
/ 22 февраля 2012

Это довольно просто - просто добавьте следующий код CSS в тег статьи

article {
   position: relative;
   z-index: 10;
}

Это поместит его над другими изображениями.

...