Стоп плавающий div от привязки при удалении другого элемента - PullRequest
2 голосов
/ 24 января 2011

Я очень новичок в JavaScript, поэтому извиняюсь, если это глупый вопрос.

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

Он работает, имея div, шириной 710px, по центру экрана, который я назову Viewport.Внутри этого div находится еще один, гораздо более широкий, с sub div все плавающие влево.Когда пользователь нажимает следующую кнопку, я устанавливаю для свойства css left значение -710px для текущего просматриваемого и следующего элемента, используя mootools для удобного перемещения по ним.Итак:

  • Левая позиция: невидимый, старый слайд, на который пользователь посмотрел и щелкнул следующий
  • Центральная позиция: что отображается на экране в данный момент
  • Правая позиция: невидимый, следующий слайд для пользователя

Пользователь видит, как старый элемент выдвигается, а новый -. Все это прекрасно работает.

Однако на следующемнажмите, я хотел бы удалить старый слайд, который пользователь уже видел (но в данный момент он невидим).Я посмотрел, как это сделать в JavaScript, и он отлично работает.Но в тот момент, когда я его удаляю, текущий центральный элемент смещается влево (вместо скольжения), потому что он получил left: -710px, чтобы привести его в центр, и имеет float: left!

, который я могу исправитьэто путем установки left: 0px после удаления, которое помещает его обратно в центр, где оно принадлежит, но я беспокоюсь, что в медленном браузере пользователи увидят мерцание элемента, щелкающего влево, а затем снова появится, когда яисправьте это.

Я надеюсь, что это имело смысл - если нет, я могу загрузить код куда-нибудь.

Есть ли способ, которым я могу удалить старый, самый левый элемент и предотвратить другойэлементы от перемещения?Например, как я могу сказать браузеру: «Не перерисовывай, пожалуйста»?Или я задаю глупый вопрос, и время между удалением и исправлением будет слишком коротким, чтобы пользователь мог заметить мерцание?Или есть более разумный способ размещения элементов?

Спасибо!

Редактировать: Пример этого здесь: jsfiddle.net/Az5Lg

1 Ответ

2 голосов
/ 24 января 2011

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

Если вы хотите избежать этого, вам придется вместо этого выполнить некоторые виды постепенных изменений.Я не знаю, что mootools делает с точки зрения анимации (http://mootools.net/docs/core/Fx/Fx.Tween выглядит так, как вы хотите, но я не использую mootools - я предполагаю, что вы используете это или подобное, чтобы уже делать анимацию), но если бы вы могли его получитьанимировать ширину удаляемого элемента div до 0 вместо того, чтобы сдвигать весь лот вдоль (так что слева остается 0, но когда вы уменьшаете размер текущего видимого элемента, новый слайд отображается в виде). ​​

You 'Я должен убедиться, что вы правильно выполнили переполнение «слайдов», чтобы убедиться, что контент не сдавливается и не отображается неправильно, когда он исчезает, но это должно сработать (если это возможно с mootools, что, я думаю, будет).

Тогда, разумеется, когда это элемент нулевой ширины, вы сможете удалить его, не влияя на внешний вид страницы.

Редактировать, чтобы добавить пример рабочего задания перехода ширины:

http://jsfiddle.net/A7YaW/ - это jsfiddle, основанное на странице, на которую вы ссылались с помощью различных операций.Код максимально похож на ваш, чтобы убедиться, что вы видите, что он делает.

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

Причина прыжка связана с вашим положением.Примерно связано с вашим позиционированием.Вы позиционируете вещи относительно, что означает, что их позиция соотносится со стандартной позицией, которой это должно быть.Когда вы удаляете элементы, вы балуетесь с этой базовой позицией и, таким образом, манипулируете вещами таким образом, который меня немного смущает.

Преимущество использования перехода по ширине состоит в том, что он изменяет только один элемент и значительнопроще.Также вы, вероятно, можете извлечь элемент из момента завершения перехода (я не смотрел, как делать что-то по завершении перехода), что кажется предпочтительнее, чем удалить его на следующей итерации.

Правкас объяснением того, почему оригинал не работал

Так как меня беспокоило то, что я не был уверен, почему оригинал прыгал, я сидел и решал все события, и так как я сделал этоЯ думал, что мог бы также поделиться.И поскольку он был самым простым, я включил диаграммы ascii art, чтобы показать, как движутся различные слайды в примере.Надеюсь, все это имеет смысл.:) Ключевым моментом является то, как работает position: relative, поэтому сначала посмотрите, если нужно.:)

  -----------------------------------------
  | Pos A | Pos B | Pos C | Pos D | Pos E |
  -----------------------------------------
-710      0      710     1420

В приведенном выше положении B отображается видимое окно просмотра.

При первом просмотре страницы четыре слайда (с 1 по 4) находятся в положениях B, C, D иE соответственно.

При первом переходе вы устанавливаете левое положение первых двух слайдов на -710.Это перемещает их (и только их) влево на столько.

Ваши слайды теперь находятся в позициях:

1 = A
2 = B
3 = D
4 = E

при следующем запуске, когда вы удаляете первое, что делаетеудалить слайд 1. На этом этапе «естественный» макет страницы (т. е. перед любым стилем перемещения) имеет слайды 2–4 в позициях от B до D. Однако слайд 2 имеет позиционирование на нем, чтобы сделать его относительно -710 пикселей относительноперемещая его немедленно в положение A, в то время как 3 и 4 остаются в положениях C и D. Затем вы применяете эффект перехода к слайду 2 и 3. Он не влияет на слайд 2 (потому что у него уже есть этот стиль), и слайды 3 показываются на экране.как и ожидалось.Затем он повторяется ...

, так схематично

Start:
  ----------------------------------------------
  |        | Slide1 | Slide2 | Slide3 | Slide4 |
  ----------------------------------------------

Click 1 - After transition
  ----------------------------------------------
  | slide1 | Slide2 |        | Slide3 | Slide4 |
  ----------------------------------------------


Click 2 - After delete
  ----------------------------------------------
  | slide2 |        | Slide3 | Slide4 |        |
  ----------------------------------------------

Click 2 - After transition
  ----------------------------------------------
  | slide2 | Slide3 |        | Slide4 |        |
  ----------------------------------------------


Click 3 - After Delete
  ----------------------------------------------
  | slide3 |        | Slide4 |        |        |
  ----------------------------------------------

Click 3 - After transition
  ----------------------------------------------
  | slide3 | Slide4 |        |        |        |
  ----------------------------------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...