Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   плагин для создания эффекта затемнения всей страницы кроме выбранного элемента DOM (https://javascript.ru/forum/project/52722-plagin-dlya-sozdaniya-ehffekta-zatemneniya-vsejj-stranicy-krome-vybrannogo-ehlementa-dom.html)

Deff 04.01.2015 15:40

Цитата:

Сообщение от Ruslan_xDD
Прикольно, но лучше на чистом JS + CSS3 сделать.

В принципе идея интересная, тут даже наверно css с параметрами анимации мон сделать чисто статическим, а вторым cоздаваемым и закидываемым на body элементом <style> лишь давать новые координаты обрамления. После отключения затемнения, последний <style> изымаем. Есть нюансы в задании анимации, чтобы элементы передвигались состыкованно.
И да, тогда реализация пофег на чём(js/jQ), ибо скорость и вариация анимации задаётся css
Думаю анимация через вектор, пример transform: translate(400px,-200px) ; http://habrahabr.ru/post/135816/

devote 04.01.2015 16:27

а чем CSS3 анимация не канает? http://learn.javascript.ru/play/4Ydgx

Deff 04.01.2015 16:40

devote,
Чот у мну во всех браузерах по разному (ХР)
Хорошо работает лишь в Хроме. В опере 12.16 - глючит. В Мозилле глючит на таблице
Про скролл - хорошо, ток оч лениво подгоняет(уравновешиваетс как лабораторные весы на микрограммах), раза в два побыстрей ба

ruslan_mart 04.01.2015 17:27

рони, я бы на твоём месте сделал все анимации на transition. Т.е., чтобы просто можно было менять свойства стилей и анимация сама происходила.

<!DOCTYPE HTML>
<html>
  
  <head>
    <style type="text/css">
      .transition {
        -moz-transition: all 2s;
        -ms--moz-transition: all 2s;
        -o-moz-transition: all 2s;
        -webkit-moz-transition: all 2s;
        transition: all 2s;
      }
    </style>
  </head>
  
  <body>
    <div id="test" style="border: 3px solid #000; left: 10px; height: 30px; position: fixed; top: 10px; width: 100px;"></div>
    
    <script type="text/javascript">
      var test = document.getElementById('test');
      test.classList.add('transition');
      test.clientHeight;
      test.style.left = '200px';
      test.style.top = '400px';
      test.style.width = '200px';
    </script>
  </body>

</html>

ruslan_mart 04.01.2015 17:34

devote, класс! :)

рони 04.01.2015 17:44

devote,
:victory:

devote 04.01.2015 17:54

Цитата:

Сообщение от Deff
Чот у мну во всех браузерах по разному (ХР)

ну дык понятно жешь, ведь сделано на коленях за 20 минут... Чего ты хотел) Естественно где-то нужно учесть префиксы, где-то события иные, например в сафари вместо события transitionend нужно слушать webkitTransitionEnd ну и т.д.

devote 04.01.2015 17:57

Цитата:

Сообщение от Deff
Про скролл - хорошо, ток оч лениво подгоняет(уравновешиваетс � как лабораторные весы на микрограммах), раза в два побыстрей ба

подкрути))) Помимо скролла кстати нужно еще и ресайз окна слушать)

Deff 04.01.2015 18:02

devote,
По опыту во вьетнаме лучше скролл(overflow:hidden) запрещать на время затемнений,
На счёт ресайза - возможно... Хотя редкий факт, когда при деяниях с отслеживанием эффекта - юзер будет ресайзить...

ruslan_mart 05.01.2015 05:50

devote, слушай, я вот только благодаря твоему примеру узнал о событии transitionend. :) До этого использовал setTimeout. Интересно узнать, не будет ли двойных срабатывания событий в каких-нибудь браузерах?
Например, если я так сделаю в своём коде:

node.eventAdd('transition|webkitTransitionEnd', function() {
    //
});


Есть вероятность, что он сработает два раза? Мало ли, вдруг в каких-нибудь новых вебкитах есть поддержка и просто transition, и webkitTransition.

P.S.: через ontransition вешать это событие можно? А то не хочется сейчас тестировать. :)

рони 05.01.2015 06:31

Ruslan_xDD,
а проверить что поддерживается
http://snippetrepo.com/snippets/cros...css-transition
if('ontransitionend' in window) {
  // Firefox
  transition = 'transitionend';
} else if('onwebkittransitionend' in window) {
  // Chrome/Saf (+ Mobile Saf)/Android
  transition = 'webkitTransitionEnd';
} else if('onotransitionend' in myDiv || navigator.appName == 'Opera') {
  // Opera
  // As of Opera 10.61, there is no "onotransitionend" property added to DOM elements,
  // so it will always use the navigator.appName fallback
  transition = 'oTransitionEnd';
} else {
  // IE - not implemented (even in IE9) :(
  transition = false;
}

https://developer.mozilla.org/en-US/.../transitionend

ruslan_mart 05.01.2015 11:44

рони, это то понятно, спасибо. Но а если навешать одинаковых событий с префиксами и без, не будет ли двойных срабатываний?

Safort 05.01.2015 14:21

Ruslan_xDD,
думаю вполне могут быть. Тут, скорее всего от браузера зависит.

ruslan_mart 05.01.2015 15:13

Safort, ясно, думаю тогда лучше setTimeout оставить.

Safort 05.01.2015 15:59

Ruslan_xDD,
но зачем, если можно сделать так, как показал рони в примере выше?

Octane 05.01.2015 18:27

http://blog.gospodarets.com/highligh...h_page_fading/

рони 05.01.2015 18:38

Octane,
:thanks:

ruslan_mart 05.01.2015 19:29

Цитата:

else if('onotransitionend' in myDiv || navigator.appName == 'Opera') {
// Opera
// As of Opera 10.61, there is no "onotransitionend" property added to DOM elements,
// so it will always use the navigator.appName fallback
transition = 'oTransitionEnd';
Немного странное условие. Т.е., если браузер опера, условие все-равно сработает, не зависимо от поддержки transition.


Часовой пояс GMT +3, время: 13:24.