0

我使用 Codrops 文章/实验创建了一个交互式环境,供当地团体在他们的会议上使用。这样做的问题是默认交互不是很直观。该模板使用 Flickity.js 和看起来像 classie.js 的东西来创建这个我遇到问题的滑动界面。

该页面可以在这里找到:

www.eyeconic.tv/ky-ffa/

问题:激活全视图的唯一方法是单击 html 元素:

<h2 class=".stack-title">

// 堆栈激活后,您应该能够通过单击第一个 .stack-item 来激活完整视图,该 .stack-item 用于在其下方创建缩略图。这整个 div 应该是可点击的。用户在屏幕上到处触摸,而不是实际单击所需操作的标题。我希望这是有道理的。

换句话说,您应该能够单击堆栈标题和每个堆栈标题下方的图像,以将堆栈拉入屏幕上的完整视图模式。然后单击 x 或屏幕上的任何其他位置以关闭完整视图。

以下位于 main.js 和我找到的用于创建我所指的事件的参考。

//
function initEvents() {
        stacks.forEach(function(stack) {
            var titleEl = stack.querySelector('.stack-title');

            // expand/close the stack
            titleEl.addEventListener('click', function(ev) {
                ev.preventDefault();
                if( classie.has(stack, 'is-selected') ) { // current stack
                    if( classie.has(bodyEl, 'view-full') ) { // stack is opened
                        var closeStack = function() {
                            classie.remove(bodyEl, 'move-items');

                            onEndTransition(slider, function() {
                                classie.remove(bodyEl, 'view-full');
                                bodyEl.style.height = '';
                                flkty.bindDrag();
                                flkty.options.accessibility = true;
                                canMoveHeroImage = true;
                            });
                        };

                        // if the user scrolled down, let's first scroll all up before closing the stack.
                        var scrolled = scrollY();
                        if( scrolled > 0 ) {
                            smooth_scroll_to(isFirefox ? docElem : bodyEl || docElem, 0, 500).then(function() {
                                closeStack();
                            });
                        }
                        else {
                            closeStack();
                        }
                    }
                    else if( canOpen ) { // stack is closed
                        canMoveHeroImage = false;
                        classie.add(bodyEl, 'view-full');
                        setTimeout(function() { classie.add(bodyEl, 'move-items'); }, 25);
                        bodyEl.style.height = stack.offsetHeight + 'px';
                        flkty.unbindDrag();
                        flkty.options.accessibility = false;
                    }
                }
                else if( classie.has(stack, 'stack-prev') ) {
                    flkty.previous(true);
                }
                else if( classie.has(stack, 'stack-next') ) {
                    flkty.next(true);
                }
            });

            titleEl.addEventListener('mouseenter', function(ev) {
                if( classie.has(stack, 'is-selected') ) {
                    canMoveHeroImage = false;
                    imghero.style.WebkitTransform = 'perspective(1000px) translate3d(0,0,0) rotate3d(1,1,1,0deg)';
                    imghero.style.transform = 'perspective(1000px) translate3d(0,0,0) rotate3d(1,1,1,0deg)';
                }
            });

            titleEl.addEventListener('mouseleave', function(ev) {
                // if current stack and it's not opened..
                if( classie.has(stack, 'is-selected') && !classie.has(bodyEl, 'view-full') ) {
                    canMoveHeroImage = true;
                }
            });
        });

        window.addEventListener('mousemove', throttle(function(ev) {
            if( !canMoveHeroImage ) return false;
            var xVal = -1/(win.height/2)*ev.clientY + 1,
                yVal = 1/(win.width/2)*ev.clientX - 1,
                transX = 20/(win.width)*ev.clientX - 10,
                transY = 20/(win.height)*ev.clientY - 10,
                transZ = 100/(win.height)*ev.clientY - 50;

            imghero.style.WebkitTransform = 'perspective(1000px) translate3d(' + transX + 'px,' + transY + 'px,' + transZ + 'px) rotate3d(' + xVal + ',' + yVal + ',0,2deg)';
            imghero.style.transform = 'perspective(1000px) translate3d(' + transX + 'px,' + transY + 'px,' + transZ + 'px) rotate3d(' + xVal + ',' + yVal + ',0,2deg)';
        }, 100));

        // window resize
        window.addEventListener( 'resize', throttle(function(ev) {
            // recalculate window width/height
            win = { width: window.innerWidth, height: window.innerHeight };
            // reset body height if stack is opened
            if( classie.has(bodyEl, 'view-full') ) { // stack is opened
                bodyEl.style.height = stacks[flkty.selectedIndex].offsetHeight + 'px';
            }
        }, 50));

        // Flickity events:
        flkty.on('cellSelect', function() {
            canOpen = false;
            classie.remove(bodyEl, 'item-clickable');

            var prevStack = stacksWrapper.querySelector('.stack-prev'),
                nextStack = stacksWrapper.querySelector('.stack-next'),
                selidx = flkty.selectedIndex,
                cellsCount = flkty.cells.length,
                previdx = selidx > 0 ? selidx - 1 : cellsCount - 1;
                nextidx = selidx < cellsCount - 1 ? selidx + 1 : 0;

            if( prevStack ) {
                classie.remove(prevStack, 'stack-prev');
            }
            if( nextStack ) {
                classie.remove(nextStack, 'stack-next');    
            }

            classie.add(stacks[previdx], 'stack-prev');
            classie.add(stacks[nextidx], 'stack-next');

        });

        flkty.on('dragStart', function() {
            canOpen = false; 
            classie.remove(bodyEl, 'item-clickable');
        });

        flkty.on('settle', function() { 
            classie.add(bodyEl, 'item-clickable');
            canOpen = true; 
        });
    }

    init();

})();
4

1 回答 1

0

我将标题和第一个堆栈项包装在一个 div 类 .touch-me 中,它工作得相当好。我之前曾尝试这样做并收到错误。但我可能打错了一些东西,因为它才有意义。

ISSUE: 它适用于鼠标单击,但不适用于 Windows 上的触摸。我没有在任何其他环境中对其进行测试,因为它将部署在 Windows 触摸屏上。

虽然当您滑动或触摸堆栈的标题图像时我不能告诉图层不要关闭触摸......我恐怕我没有技能来正确修改javascript中的逻辑,因为我不完全理解正在使用的插件。

于 2015-07-17T17:18:26.590 回答