Анимировать сверху не работает с отрицательным значением? - PullRequest
0 голосов
/ 22 октября 2018

РЕДАКТИРОВАТЬ

Решено.См. Сообщение ниже.

/ ОКОНЧАНИЕ РЕДАКТИРОВАНИЯ

РЕДАКТИРОВАНИЕ

НЕ связано с предложенной выше темой и не решаетсявместо vh в качестве измерения верхнего значения вместо этого, как показано в этой скрипке (как предложено в первых комментариях здесь): http://jsfiddle.net/wm02ovx8/3/. Div по-прежнему не анимируется, а всплывает в мгновение окаглаз.

/ ОКОНЧАНИЕ РЕДАКТИРОВАНИЯ

Я пытаюсь анимировать выдвижной ящик сверху и в поле зрения.Анимация работает нормально до тех пор, пока она находится в поле зрения (значение свойства "top" css больше -1), но поскольку у меня есть отрицательное значение, равное calc(-100% + 30px) для свойства top, оно просто "выскакивает"вверх "вместо.Что мне здесь не хватает?

[Скрипка] (Чтобы открыть меню, нажмите индексное слово справа)

HTML:

<div id="closeIndexLayer"></div>
<div id="alignLinks">
    <div id="anchorLinks"></div>
</div>

<div id="indexMenu">Index</div>

CSS:

div#alignLinks {
    position: fixed;
    display: flex;
    align-items: baseline;
    justify-content: flex-start;
    flex-flow: wrap;
    left: 30px;
    top: calc(-100% + 30px);
    background: rgba(255,0,0,.60);
    /* transform: translateX(-50%); */
    height: calc(100% - 30px);
    border-bottom-left-radius: 30px;
    border-bottom-right-radius: 30px;
    z-index: 250 !important;
    min-width: 425px;
    max-width: 425px;
    box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22);
}

div#anchorLinks {
    display: flex;
    /* position: fixed; */
    flex-flow: wrap;
    height: auto;
    /* position: absolute; */
    /* background: rgba(0,0,0,.5); */
    top: 0px;
    right: 0px;
    z-index: 250;
}

div#closeIndexLayer {
    position: fixed;
    display:none;
    top: 0;
    left: 0;
    box-sizing: border-box;
    width: 100%;
    height: 100%;
    background: green;
    z-index: 250;
}

a.anchorLink {
    width: auto;
    background: hsla(210, 11%, 8%, 1);
    border-radius: 3px;
    text-decoration: none;
    font-size: 2rem;
    margin-top: 16px;
    margin-bottom: 2px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
    -webkit-transition: all 140ms ease-in-out;
    -moz-transition: all 140ms ease-in-out;
    -ms-transition: all 140ms ease-in-out;
    -o-transition: all 140ms ease-in-out;
    transition: all 140ms ease-in-out;
}

#indexMenu {
        position: fixed;
        display: block;
        z-index: 249;
        top: 50%;
        height: 18px;
        right: -18px;
        padding: 0px 6px 0px 6px;
        transform: translateY(-50%) rotate(270deg);
        background: rgba(255,255,255,.15);
        border-radius: 5px 5px 0px 0px;
        font-family: 'Nunito Sans', sans-serif;
        font-size: 10px;
        box-shadow: 0px 1px 2px rgba(255,255,255,.12), 0px 2px 3px rgba(255,255,255,.24);
    cursor: pointer;
    }

Javascript:

function showIndex() {
    var elem = document.getElementById("alignLinks");
    thestyle = window.getComputedStyle(elem),
    thetop = thestyle.getPropertyValue('top');

    var pos = 0;
    var id = setInterval(frame, 5);
    function frame() {
        if (pos <= 0) {
            pos++;
            elem.style.top = pos + 'px';
        } else {
            clearInterval(id);
        }
    }
}

function hideIndex() {
    var elem = document.getElementById("alignLinks");
    thestyle = window.getComputedStyle(elem),
        thetop = thestyle.getPropertyValue('top');

    var pos = 0;
    var id = setInterval(frame, 5);
    function frame() {
        if (pos >= 0) {
            pos--;
            elem.style.top = pos + 'px';
        } else {
            clearInterval(id);
        }
    }
}

document.getElementById("indexMenu").addEventListener("click", function(){
    var closeIndexLayer = document.getElementById("closeIndexLayer");

    closeIndexLayer.style.display = "block";
    showIndex();
});

document.getElementById("closeIndexLayer").addEventListener("click", function(){
    var closeIndexLayer = document.getElementById("closeIndexLayer");

    closeIndexLayer.style.display = "none";
    hideIndex();
});
//</editor-fold>

1 Ответ

0 голосов
/ 22 октября 2018

Вместо этого я решил это по-другому, и в некотором смысле, я более знаком с.То, как я обнаружил, что это работает для меня, добавляет класс к элементу, и у этого класса есть свойства анимации.Затем, если вы хотите анимировать, просто добавьте свойства анимации к анимируемому элементу (в данном случае это id #alignLinks).

[Fiddle]

Javascript:

let drawer = document.getElementById("alignLinks");


document.getElementById('indexMenu').onclick = function() {
  if(this.innerHTML === 'Index') 
  { 
    this.innerHTML = 'Close';
    drawer.classList.add('topAnimDown');
  } else {
    this.innerHTML = 'Index';
        var computedStyle = window.getComputedStyle(drawer),
    topProp = computedStyle.getPropertyValue('top');
    drawer.style.topProp = topProp;
    drawer.classList.remove('topAnimDown');
  }  
}

HTML

<div id="closeIndexLayer"></div>
<div id="alignLinks">
    <div id="anchorLinks"></div>
</div>

<div id="indexMenu">Index</div>

CSS

body {
  background: hotpink;
}

div#alignLinks {
    position: fixed;
    display: flex;
    align-items: baseline;
    justify-content: flex-start;
    flex-flow: wrap;
    left: 30px;
    top: calc(-100% + 30px);
    background: rgba(255,0,0,.60);
    /* transform: translateX(-50%); */
    height: calc(100% - 30px);
    border-bottom-left-radius: 30px;
    border-bottom-right-radius: 30px;
    z-index: 250 !important;
    min-width: 425px;
    max-width: 425px;
    box-shadow: 0 19px 38px rgba(0,0,0,0.30), 0 15px 12px rgba(0,0,0,0.22);
    -webkit-transition: 3s ease-in-out;
  -moz-transition: 3s ease-in-out;
  -ms-transition: 3s ease-in-out;
  -o-transition: 3s ease-in-out;
  transition: 3s ease-in-out;
}

.topAnimDown {
  -webkit-transition: 3s ease-in-out;
  -moz-transition: 3s ease-in-out;
  -ms-transition: 3s ease-in-out;
  -o-transition: 3s ease-in-out;
  transition: 3s ease-in-out;
  top: 0 !important;
}

div#anchorLinks {
    display: flex;
    /* position: fixed; */
    flex-flow: wrap;
    height: auto;
    /* position: absolute; */
    /* background: rgba(0,0,0,.5); */
    top: 0px;
    right: 0px;
    z-index: 250;
}

div#closeIndexLayer {
    position: fixed;
    display:none;
    top: 0;
    left: 0;
    box-sizing: border-box;
    width: 100%;
    height: 100%;
    background: green;
    z-index: 250;
}

a.anchorLink {
    width: auto;
    background: hsla(210, 11%, 8%, 1);
    border-radius: 3px;
    text-decoration: none;
    font-size: 2rem;
    margin-top: 16px;
    margin-bottom: 2px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
    -webkit-transition: all 140ms ease-in-out;
    -moz-transition: all 140ms ease-in-out;
    -ms-transition: all 140ms ease-in-out;
    -o-transition: all 140ms ease-in-out;
    transition: all 140ms ease-in-out;
}

#indexMenu {
        position: fixed;
        display: block;
        z-index: 249;
        top: 50%;
        height: 18px;
        right: -18px;
        padding: 0px 6px 0px 6px;
        transform: translateY(-50%) rotate(270deg);
        background: rgba(255,255,255,.15);
        border-radius: 5px 5px 0px 0px;
        font-family: 'Nunito Sans', sans-serif;
        font-size: 24px;
        box-shadow: 0px 1px 2px rgba(255,255,255,.12), 0px 2px 3px rgba(255,255,255,.24);
    cursor: pointer;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...