【问题标题】:Overlay multiple pages - like when you click on a Facebook photo覆盖多个页面 - 就像您点击 Facebook 照片时一样
【发布时间】:2015-12-13 15:44:43
【问题描述】:

也许是一个简单的问题,但我对 javascript 的了解仍然很少。 我有一个有 4 页的网站。在每个页面上,我都想制作一个可点击的 div,它会打开一个覆盖屏幕。但是每个覆盖屏幕都有不同的文本,因为覆盖屏幕中的内容(文本和图像)是 clicable div 中文本的扩展。现在我可以让每个 div 都可以点击,但我不知道如何打开正确的覆盖屏幕。

我正在考虑给覆盖类一个 ID 名称,例如 pagename-1(页面上的第一个 div)。然后使用 document.getElementById() 或其他东西选择 ID 并将其添加到 javascript。但我不知道该怎么做,因为我的 id 包含一个页面名称 + 一个数字(用于概述)......

jsfiddle: http://jsfiddle.net/52osrbcu/

HTML

<div class="trigger-overlay">
<img src="http://www.queness.com/resources/html/simple-portfolio-page/img/portfolios/card/4.jpg" width="100" height="100" alt="" />
</div>                                  

<div class="trigger-overlay">           
<img src="http://www.queness.com/resources/html/simple-portfolio-page/img/portfolios/logo/5.jpg" width="100" height="100" alt="" />
</div>


     <div class="overlay overlay-slidedown" id="pagename-1">
            <button type="button" class="overlay-close">Close</button>
      <p>
      text1
      </p>
        </div>

     <div class="overlay overlay-slidedown" id="pagename-2">
            <button type="button" class="overlay-close">Close</button>
      <p>
      text2
      </p>
        </div>


        <script src="http://tympanus.net/Development/FullscreenOverlayStyles/js/classie.js"></script>

CSS

/* Overlay style */
.overlay {
    position: fixed;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    background: rgba(7,6,10,0.9);
    z-index: 1000;
}

/* Overlay closing cross */
.overlay .overlay-close {
    width: 80px;
    height: 80px;
    position: absolute;
    right: 20px;
    top: 0;
    overflow: hidden;
    border: none;
    background: url(http://tympanus.net/Development/FullscreenOverlayStyles/img/cross.png) no-repeat center center;
    text-indent: 200%;
    color: transparent;
    outline: none;
    z-index: 100;
    cursor: pointer;
}

/* Effects */
.overlay-slidedown {
    visibility: hidden;
    -webkit-transform: translateY(-100%);
    transform: translateY(-100%);
    -webkit-transition: -webkit-transform 0.4s ease-in-out, visibility 0s 0.4s;
    transition: transform 0.4s ease-in-out, visibility 0s 0.4s;
}

.overlay-slidedown.open {
    visibility: visible;
    -webkit-transform: translateY(0%);
    transform: translateY(0%);
    -webkit-transition: -webkit-transform 0.4s ease-in-out;
    transition: transform 0.4s ease-in-out;
}

p {
  color: white;
}

Javascript

  (function() {
        var triggerBttn = document.getElementsByClassName( 'trigger-overlay' ),
            overlay = document.querySelector( 'div.overlay' ),
            closeBttn = overlay.querySelector( 'button.overlay-close' );
            transEndEventNames = {
                'WebkitTransition': 'webkitTransitionEnd',
                'MozTransition': 'transitionend',
                'OTransition': 'oTransitionEnd',
                'msTransition': 'MSTransitionEnd',
                'transition': 'transitionend'
            },
            transEndEventName = transEndEventNames[ Modernizr.prefixed( 'transition' ) ],
            support = { transitions : Modernizr.csstransitions };

        function toggleOverlay() {
            if( classie.has( overlay, 'open' ) ) {
                classie.remove( overlay, 'open' );
                classie.add( overlay, 'close' );
                var onEndTransitionFn = function( ev ) {
                    if( support.transitions ) {
                        if( ev.propertyName !== 'visibility' ) return;
                        this.removeEventListener( transEndEventName, onEndTransitionFn );
                    }
                    classie.remove( overlay, 'close' );
                };
                if( support.transitions ) {
                    overlay.addEventListener( transEndEventName, onEndTransitionFn );
                }
                else {
                    onEndTransitionFn();
                }
            }
            else if( !classie.has( overlay, 'close' ) ) {
                classie.add( overlay, 'open' );
            }
        }
        for (x=0;x<triggerBttn.length;x++) {
            triggerBttn[x].addEventListener( 'click', toggleOverlay );
        }
        closeBttn.addEventListener( 'click', toggleOverlay );
    })();

最终,我想要在新闻提要中像 Facebook 上的覆盖一样。我必须编辑的另一件事是在覆盖屏幕可见时无法滚动。

【问题讨论】:

  • 对于您的最后一个问题,只需在单击一个时将overflow:hidden; 放在您的身体上,并确保在删除覆盖层时返回到overflow:auto;。此外,可能更容易搜索的技术词称为“模态”
  • 是的,我明白了,你有带引导程序的模态。也许这比这个更容易使用。我要试试!

标签: javascript jquery html overlay


【解决方案1】:

首先,我建议为此使用 jQuery,因为它会使您的代码更简洁,但如果您想坚持使用纯 Javascript,那么我会使用属性,因为对于您的问题比 ids 更具有语义意义。这是更新的小提琴:http://jsfiddle.net/52osrbcu/1/。这是修改后的代码:

在 HTML 文件中:

<div class="trigger-overlay" pagename="1">

在 Javascript 文件中:

function toggleOverlay() {
      console.log(this.getAttribute("pagename"));

我刚刚将 pagename 属性打印到控制台,但您可以在 if 语句中使用它来选择要显示的正确文本。

【讨论】:

  • 你推荐 jQuery 来处理整个事情?问题是我是初学者,所以这也是我正在编辑的另一个来源的代码。但是你对那个 if 语句说了什么,它看起来怎么样? if(this.getAttribute("pagename") === 1) { //显示文本 } 然后是每个数字?因为最后,我必须制作大约 40-50 个叠加层,所以我将文本放入 HTML 文件中
  • 我的意思是,你现在只用 Javascript 就可以了,但是在 Jquery 中你可以做得更干净。我会说在 Javascript 中做这部分,但你可能应该为未来的项目学习 Jquery。 Codecademy 有一堂很棒的 Jquery 课,我就是从那里学的
  • 对于您的其他问题,为什么不创建一个数组,然后使用 parseInt(this.getAttribute("pagename")) 解析 pagename 属性,然后说出类似 var text = somearray[parseInt(this.getAttribute("pagename"))] 的内容
猜你喜欢
  • 2018-07-22
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多