代码之家  ›  专栏  ›  技术社区  ›  kadina

当列表中的项目数超过屏幕高度时,不会从第一个开始显示列表项目

  •  0
  • kadina  · 技术社区  · 7 年前

    我们需要播放视频,当用户按下“M”键时,我们需要将屏幕垂直分成两半。一半应该只显示一个文本“dvr”,另一半应该显示一个列表和30个列表项(这个数字只是为了测试的目的)。最初,我们将从服务器获取号码)。每个列表项都将包含一个图像和一些文本。当我们显示菜单时,总是列表项应该从第一项可见,第一项应该有焦点。当我们按下键时,焦点应该转移到第二项…下面是代码。

    HTML:

    <!DOCTYPE html>
    <html>
        <head>
            <title>VOD</title>
            <script src='lib/hls.js'></script>
            <script src='js/index.js'></script>
            <style>
                html, body
                {
                    height:100%;
                    width: 100%;
                    overflow: hidden;
                }
    
                #vid
                {
                    position: fixed;
                    top: 50%;
                    left: 50%;
                    z-index: -1;
                    min-width: 100%;
                    min-height: 100%;
                    width: auto;
                    height: auto;
                    transform: translate(-50%, -50%);
                }
    
                #mid {
                    display: flex;
                    width: 100%;
                    height: 100%;
                    justify-content: stretch;
                    flex-flow: row nowrap;
                    z-index: 2;
                }
    
                #mid.hidden {
                    display: none;
                }
    
                #mid1, #mid2 {
                    display: flex;
                    flex: 1;
                    align-items: center;
                }
    
                #mid1 {
                    justify-content: center;
                    background-color: rgba(255, 255, 255, 0.5);
                }
    
                #mid2 {
                    background-color: rgba(255, 255, 255, 0.6);
                }
    
                #ulid {
                    list-style-type: none;
                    width: 100%;
                    margin: 0;
                    border: 0;
                    padding: 0;
                }
    
                .list-item {
                    width: 100%;
                    height: 150px;
                    border-style: solid;
                    border-width: 1px;
                    display:flex;
                    align-items: center;
                    justify-content: flex-start;
                }
    
                li:focus {
                    background-color: lightslategray;
                }
            </style>
        </head>
        <body>
            <video id='vid' src='textMotion.mp4' autoplay loop></video>
            <div id='mid' class='hidden'>
                <div id="mid1">
                    <h1>DVR</h1>
                </div>
                <div id="mid2">
                    <ol id='ulid'></ol>
                </div>
            </div>
        </body>
    </html>
    

    javascript代码:

    var foc_list_index = 0;
    
    function processListEvent(event) {
        console.log('list Event : ' + event.keyCode + 'focused li ' + foc_list_index);
    
        let keyCode = event.keyCode;
    
        // Down
        if(keyCode == 40) {
            foc_list_index ++;
            document.getElementById('li' + foc_list_index).focus();
        }
    
        // Up
        if(keyCode == 38) {
            if(foc_list_index == 0) {
                console.log('Ignoring key up as we are already at first list index');
                return;
            }
    
            foc_list_index --;
            document.getElementById('li' + foc_list_index).focus();
        }
    }
    
    function displayMenu() {
    
        let mid = document.getElementById('mid');
    
        // If already menu is visible, hide it
        if(mid.classList.contains('hidden') == false) {
            mid.classList.toggle('hidden');
            let ulid = document.getElementById('ulid');
            while(ulid.firstChild) {
                ulid.removeChild(ulid.firstChild);
            }
            return;
        }
    
        let ulid = document.getElementById('ulid');
    
        for(let index = 0; index < 30; index ++) {
            let lItem = document.createElement('li');
            lItem.classList.add('list-item');
            lItem.setAttribute('id', 'li' + index);
            lItem.setAttribute('tabindex', index);
            lItem.addEventListener('keydown', processListEvent, false);
    
            let img = document.createElement("img");
            img.src = 'img/TNT.png';
    
            lItem.appendChild(img);
    
            lItem.appendChild(document.createTextNode('Showing ID : ' + index));
            ulid.appendChild(lItem);
        }
    
        mid.classList.toggle("hidden");
        document.getElementById('li0').focus();
        foc_list_index = 0;
    }
    
    function processKeyPress(e) {
        console.log('received keyEvent : ' + e.keyCode);
        let keyCode = e.keyCode;
    
        let mid = document.getElementById('mid');
    
        // Menu button or key 'm'
        if((keyCode == 77) || (keyCode == 462)) {
            displayMenu();
        }
    }
    
    document.addEventListener('keydown', processKeyPress);
    

    除以下问题外,此代码运行正常。

    1)当用户按下“M”时,显示菜单,从列表项12显示下半部分。即使从0到29的列表项存在,它也从列表项12显示。但它应该从列表项0中显示。我找到了这个问题的原因。这是因为我为mid1和mid2保留了“align items:center;”,以使文本保持在第一个屏幕上,并使列表保持在第二个屏幕上,因此应该垂直居中。如果我删除mid2的“align items:center;”,则列表将正确显示,但当列表中只有很少的3项(而不是30项)时,列表将不会垂直居中显示。不知道如何解决这个问题。

    2)当我按下键时,一旦焦点穿过可见列表项,屏幕的左半部分也会移动,这不应该移动。

    第一期的屏幕截图(当用户选择“m”时,列表项应从0开始显示)

    enter image description here

    如果删除mid2的“align items:center;”,并且列表中有3个项(而不是30个),则显示此问题的屏幕截图。列表应垂直居中。

    enter image description here

    第二期的屏幕截图(屏幕的左半部分被移动,当焦点通过按下键越过可见列表项时不应移动)

    enter image description here

    有谁能帮我解决这些问题吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Rachel Gallen    7 年前

    我想如果你用 justify-content:flex-start (或) baseline )这将解决数字问题(参见 this fiddle )如果包含 img ,这将比第一把小提琴更清楚地显示项目(请参见 this one ,但会影响宽度。左手的视频不会在这些提琴中移动,只有h1。我不清楚这件事。你可以把它放在录像带里吗?(但也许你想把它作为一个覆盖物?..)

    不管怎样,这是个开始。希望这有帮助…

    推荐文章