JQuery анимирует границу без перемещения div

Я хочу анимировать div, сначала сделав его границу толще на 5 пикселей при вводе мыши, а затем уменьшив границу на 5 пикселей при нажатии кнопки мыши, сложная часть заключается в том, что я не хочу, чтобы div выглядел так, как будто он движется (если вы просто анимируете границы , весь div будет выглядеть так, как будто он смещается, а не только граница становится толще/тоньше). Я очень близок, но я застрял на последней части: mouseleave. Что у меня есть до сих пор:

$("#thumbdiv<%=s.id.to_s%>").bind({
            mouseenter: function(){
                $(this).animate({
                    borderRightWidth: "25px",
                    borderTopWidth: "25px",
                    borderLeftWidth: "25px",
                    borderBottomWidth: "25px",

                    margin: "-5px"
                }, 500);
            },
            mouseleave: function(){

                $(this).animate({
                    borderRightWidth: "20px",
                    borderTopWidth: "20px",
                    borderLeftWidth: "20px",
                    borderBottomWidth: "20px",

                    margin: "0px"
                }, 500);
            }
        });

Где-то перед этим я установил границу на 20 пикселей, а поле не установлено, поэтому оно равно 0 пикселей. Div прекрасно анимируется при входе мыши, я могу сделать границу толще без фактического смещения div со своего места, но когда срабатывает mouseleave, div сначала перемещается в положение, как если бы «маржа -5px» никогда не вызывалась , а затем медленно уменьшайте его границу, и кажется, что «magin: '0px'» на самом деле не вызывается.

Я не уверен, что мое описание имеет смысл, я могу создать прототип, если это необходимо.


person vinceh    schedule 11.06.2011    source источник
comment
Я вообще не могу заставить скрипку работать; просто сходит с ума :-(   -  person Pointy    schedule 11.06.2011
comment
Я нашел ответ: мы еще не можем анимировать сокращенные значения в JQuery, поэтому поля должны быть marginTop, marginRight, marginBottom и marginLeft. Опубликую свой собственный ответ, когда смогу.   -  person vinceh    schedule 11.06.2011
comment
Да, это так :-) jsfiddle.net/25EsV   -  person Pointy    schedule 11.06.2011
comment
Скрипт, который я разместил, работает с сокращениями в определении класса.   -  person Nabab    schedule 11.06.2011


Ответы (4)


Я не читал весь код, но я думаю, что есть лучший способ сделать то, что вы хотите.

Это свойство css "контур".

Как сказано в спецификации: "...не влияет на положение или размер окна... ...не вызывает переполнение или переполнение..."

http://www.w3.org/TR/CSS21/ui.html#dynamic-outlines

Код будет примерно таким:

jQuery(#thumbdiv<%=s.id.to_s%>").mouseenter( function() {
jQuery(this).css("outlineStyle", "solid").animate({
    'outlineWidth': '5px'
}, 500);
}).mouseout( function() {
jQuery(this).animate({
    'outlineWidth': '0px'
}, 500).css("outlineStyle", "solid");
});

Примечание:

Хорошо, я отредактировал @Nabab "Fiddle" (я не знал об этом сервисе) и получил следующее: http://jsfiddle.net/EbTms/ ... Я думаю, это работает.

person tiangolo    schedule 11.06.2011
comment
Я бы сказал, что это приемлемо, но это не сработает в 100% случаев. Потому что на самом деле у меня есть круговые div. Если вы анимируете layoutStyle, он делает контур невидимого блока, содержащего div, более толстым, поэтому, если у вас есть радиус границы, это будет выглядеть неправильно, особенно в моем случае, когда мой div представляет собой круг. Хороший ответ, однако! - person vinceh; 11.06.2011

Итак, я наконец нашел свой собственный ответ. Повторюсь, что я хотел:

  1. Круговые разделы
  2. Анимация увеличения ширины границы
  3. Не хотите, чтобы div выглядел «движущимся», движущимися частями должны быть только границы.

Я добился этого, одновременно анимировав ОБА поля и границы, потому что, если вы просто анимируете границу, то весь div сдвинется. Но если вы уменьшите поле одновременно с увеличением границы, вы получите иллюзию неподвижного элемента div.

Просто у нас есть круговой div:

#somediv {
    display: inline-block;
    height: 200px;
    width: 200px;
    border: solid 0px;
    vertical-align: middle;
    border-radius: 2000px;
    background-color: #ccc;
    margin: 0px;
}

И с функцией JQuery, например:

$(function(){
    $("#somediv").mouseover(function(){
    $(this).animate({"borderLeftWidth" : "5px",
                     "borderRightWidth" : "5px", 
                     "borderTopWidth" : "5px", 
                     "borderBottomWidth" : "5px",

                     "marginLeft" : "-5px",
                     "marginTop" : "-5px",
                     "marginRight" : "-5px",
                     "marginBottom" : "-5px"
                    }, 300);
    }).mouseout(function(){
        $(this).animate({"borderLeftWidth" : "0px", 
                         "borderRightWidth" : "0px", 
                         "borderTopWidth" : "0px", 
                         "borderBottomWidth" : "0px",

                         "marginLeft" : "0px",
                         "marginTop" : "0px",
                         "marginRight" : "0px",
                         "marginBottom" : "0px"
                        }, 300);
    });
});

Мы можем достичь того, чего хотим.

Посмотрите на эту скрипту в качестве примера.

Теперь еще один вопрос для обсуждения: мы хотим иметь возможность анимировать границу только тогда, когда мышь на самом деле находится над круглым элементом внутри div, потому что, если вы наведете курсор на углы невидимого блока div, круг будет анимироваться, но это не то, что мы хотим. Я опубликую ссылку на то, как мы можем достичь этого позже.

person vinceh    schedule 16.06.2011

Хорошо, это стало сложной задачей.

Имея в виду, что ваши div круглые:

Используйте обертку (другой div) для каждого из ваших div, большего, чем они, центрируйте свои div в обертках (по вертикали и горизонтали) как «встроенный блок», а затем анимируйте их.

Каждая граница должна быть анимирована независимо, чтобы хорошо работать («borderLeftWidth», «borderRightWidth» и т. д., а не просто «borderWidth»). Это не очень хорошо задокументированная ошибка в jQuery: http://bugs.jquery.com/ticket/7085 (это было трудно обнаружить).

Кажется, работает: http://jsfiddle.net/y4FTf/2/

HTML

<div class="wrapper">
<div class="content">Hello World!
</div>
</div>
<div class="wrapper">
<div class="content">Foo Bar
</div>
</div>

CSS

.wrapper {
width: 210px;
height: 210px;
line-height: 210px;
text-align: center;
padding: 0px;
}
.content {
display: inline-block;
height: 200px;
width: 200px;
border: solid 0px;
vertical-align: middle;
border-radius: 2000px;
background-color: #ccc;
margin: 0px;
}

Javascript

$(function(){
$(".content").mouseover(function(){
    $(this).animate({"borderLeftWidth" : "5px",
                     "borderRightWidth" : "5px",
                     "borderTopWidth" : "5px",
                     "borderBottomWidth" : "5px"
                    }, 300);
}).mouseout(function(){
        $(this).animate({"borderLeftWidth" : "0px",
                         "borderRightWidth" : "0px",
                         "borderTopWidth" : "0px",
                         "borderBottomWidth" : "0px"
                        }, 300);
});
});
person tiangolo    schedule 14.06.2011
comment
Это очень хороший ответ, я не уверен, что это лучший ответ, чем анимация поля. Я бы возражал против этого из-за дополнительных частей и того факта, что div, который оборачивает внутренний div, должен быть как минимум больше, чем вы хотите анимировать границу. Подключить это к полезному приложению может быть сложнее. Сравните это с моим ответом и посмотрите, что вы думаете. - person vinceh; 16.06.2011

Интересная проблема... С переключением классов работает лучше, но все равно не очень гладко:

http://jsfiddle.net/dzTHB/13/

person Nabab    schedule 11.06.2011