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)

рони 03.01.2015 06:01

плагин для создания эффекта затемнения всей страницы кроме выбранного элемента DOM
 
Плагин для jquery ... идея взята тут https://github.com/zzarcon/focusable
жмите на посмотреть чтоб увидеть возможности плагина, потом можно покликать то что выделено красным контуром ... замечания пожелания приветствутся ... :write:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>elementOverlay</title>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
  <style>
  body{text-align:center;padding:30px}
  ul{padding:0px}
  li{list-style:none;border:1px solid #ccc;margin:5px}
  img{margin-top:10px;height:150px;border:1px solid #ccc}
  .example{float:left;width:70%}
  .options{float:right;width:30%;background:#ccc;border-radius:5px}
  .options ul{text-align:left;margin-left:10px}
  input{text-align:center}
  #test{width:150px}
  .focusable{border:rgb(0,51,255) 2px solid}
  .focusable-column{margin:0;padding:0}
  </style>
<script>
$.fn.elementOverlay = function(g) {
    var def = {
        speed: 1500, //скорость анимации, отключение анимации 0
        elem: null, //селектор или элемент для выделенияя
        activeClass: "focusable", //класс для элемента на время выделения
        columnClass: "focusable-column",  //класс для затемнения
        esc: true, //выход по Esc
        init: true, //начало анимации от периметра страницы или предыдущего элемента выделения
        hideCallback: null, //функция после скрытия затемнения
        showCallback: null  // функция после анимации выделения
    };
    var h = jQuery.extend({}, def, g);

    function hide(event) {
        var elem = $(getActiveElement());
        getActiveElement(' ');
        var data = elem.data("overlay");
        var speed = data.speed;
        var fn = data.hideCallback;
        var n = 0;
        $("." + h.columnClass).stop(true, true).fadeOut(speed, function() {
            n++;
            if (n == 4) {
                elem.removeClass(data.activeClass);
                fn && fn()
            }
        });

    }

    function keyupHandler(event) {
        $(getActiveElement()).data("overlay").esc && event.keyCode === 27 && hide()
    }

    function getActiveElement() {
        var temp;
        return function(el) {
            if (el) temp = el;
            return temp
        }
    }

    function resizeHandler(event, speed) {
        var column = $("." + h.columnClass);
        var $element = $(getActiveElement());
        if (!$element.length) return;
        var data = $element.data("overlay"),
            offset = $element.offset(),
            tp = Math.round(offset.top),
            lf = Math.round(offset.left),
            width = $(document).width(),
            height = $(document).height(),
            heightEl = Math.round($element.outerHeight()),
            widthEl = Math.ceil($element.outerWidth());
        data.init && init();
        var arr = [{
            "width": width,
            "height": tp,
            "top": 0,
            "left": 0
        }, {
            "width": lf,
            "height": heightEl,
            "top": tp,
            "left": 0
        }, {
            "width": width - (lf + widthEl),
            "height": heightEl,
            "top": tp,
            "left": lf + widthEl
        }, {
            "width": width,
            "height": height - (tp + heightEl),
            "top":  tp + heightEl,
            "left": 0
        }];
        var n = 0;
        var fn = data.showCallback;
        $.each(arr, function(indx, el) {
            var opt = $.extend({
                opacity: 1
            }, el);
            column.eq(indx).stop(true, true).css({
                "display": "",
                "opacity": data.init ? 0 : 1
            }).animate(opt, {
                duration: speed || 0,
                easing : "swing",
                complete: function() {
                    n++;
                    if (n == 4) fn && fn()
                }
            })
        })
    }

    function init() {
        var column = $("." + h.columnClass);
        var width = $(document).width(),
            height = $(document).height(),
            from = [{
                "width": width,
                "height": 0,
                "top": 0,
                "left": 0
            }, {
                "width": 0,
                "height": height,
                "top": 0,
                "left": 0
            }, {
                "width": 0,
                "height": height,
                "top": 0,
                "left": width
            }, {
                "width": width,
                "height": 0,
                "top": height,
                "left": 0
            }];
        $.each(from, function(indx, el) {
            var opt = $.extend({
                "position": "absolute",
                "z-index": 9999,
                "background": "rgba(0,0,0,0.8)",
                "display": "none"
            }, el);
            if (!column.length) $("<div/>", {
                "css": opt,
                "class": h.columnClass,
                "on": {
                    "click": hide
                }
            }).appendTo("body");
            else column.eq(indx).css(opt)
        })
    }

    function clickHandler() {
        var elem = $(getActiveElement());
        if (elem.length) {
            var data = elem.data("overlay");
            elem.removeClass(data.activeClass)
        }
        elem = $(getActiveElement(this));
        data = elem.data("overlay");
        elem.addClass(data.activeClass);
        $(window).trigger("resize", [data.speed])
    }
    var column = $("." + h.columnClass);
    if (!column.length) {
        getActiveElement = getActiveElement();
        init();
        $.elementOverlay = function(g) {
            if (g == "hide") {hide(); return}
            var h = jQuery.extend({}, def, g);
            var elem = $(h.elem);
            elem.data({
                "overlay": h
            });
            clickHandler.call(elem)
        };
        $(window).on({
            "resize": resizeHandler,
            "keyup": keyupHandler
        })
    }
    return this.each(function(i, elem) {
        var el = h.elem || $(elem).data("selector") || $(elem);
        var hh = jQuery.extend({}, h, {
            elem: el
        });
        $(elem).on({
            "click": function(event) {
                event.preventDefault();
                event.stopPropagation();
                $.elementOverlay(hh)
            }
        })
    })
};

$(window).load(function() {
    $(".show").elementOverlay({
        speed: 2E3
    }).css({
        "border": "1px solid rgb(255, 0, 51)"
    });
    $("#x, .options").elementOverlay({
        speed: 0,
        hideCallback: function() {
            alert("hideCallback")
        }
    }).css({
        "border": "5px solid rgb(255, 0, 51)"
    });
    var sel = ["li:eq(1)", "li:eq(2)", "li:eq(3)", "img:eq(0)", "img:eq(1)", "img:eq(2)", "img:eq(1)", "img:eq(0)"];
    ! function go() {
        var el = sel.shift();
        if (el) $.elementOverlay({
            elem: el,
            speed: 1E3,
            activeClass: "red",
            init: false,
            showCallback: function() {
                window.setTimeout(go, 2E3)
            }
        });
        else $.elementOverlay("hide")
    }()
});


  </script>

</head>
<body>
  <div class="example">
    <header> <button type="button" id="x"  >Test no animate</button>
      <button class="show" data-selector="header" id="test2">Focus header</button>
      <button class="show" data-selector="ul">Focus list</button>
      <button class="show" data-selector="li:first">Focus first item</button>
      <button class="show" data-selector="img:eq(1)">Focus image</button>
    </header>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
      <li>7</li>
      <li>8</li>
      <li>9</li>
      <li>10</li>
    </ul>
    <img src="http://elitefon.ru/download.php?file=201211/800x600/elitefon.ru-27151.jpg">
    <img src="http://awabe.com/uploads/posts/2011-03/1300452670_sbtsag9elqjyvqf.jpeg">
    <img src="http://img0.liveinternet.ru/images/attach/c/4/79/125/79125894_large_ff6f52c9a9848aab63958b7766780446.jpg">
  </div>
  <div class="options">
    <h2>Options:</h2>

  </div>
</body>
</html>

Deff 03.01.2015 14:21

Cимпот, в Опере 12.16 ниже освещенного прямоугольника, в процессе быстрого перемещения освещённости,
бежит какая -то линия в ширину экрана: http://sf.uploads.ru/VqDp1.jpg
(Ощущение, что подгон затемнённого низа запаздывает к перемещению боковушек)
Проверил на всех кнопках теста. При медленных перемещениях подобного нет.

Иногда по кликам на кнопки и картинки выскакивает такое: http://sf.uploads.ru/JoSWf.jpg

Deff 03.01.2015 14:54

Ксать как идея: можно использовать такую картинку с дыркой нужной прозрачностью и типоразмером по х - y c позицией fixed http://sf.uploads.ru/obfRz.png

рони 03.01.2015 14:59

Цитата:

Сообщение от Deff
выскакивает такое

Callback на кнопку Test no animate и div class=options или этот Callback лезет по иным элементам?
Цитата:

Сообщение от Deff
бежит какая -то линия

это есть -- как согласовать анимацию на быстрых скоростях ... думаю )))

Deff 03.01.2015 15:08

Цитата:

Сообщение от рони (Сообщение 349340)
Callback на кнопку Test no animate и div class=options или этот Callback лезет по иным элементам?
Не присматривался, просто потыкал
это есть -- как согласовать анимацию на быстрых скоростях ... думаю )))

ну лучше на больших скоростях делать анимацию с наползанием(более тёмное менее заметно), или идея про картинку, она изначально два экрана по ширине и по высоте, дырка в центре думаю 5х5px (меньше наверно элементов не будет)
(объём картинки маленький - менее 10кб)
Ксать мон наверно и канвас приспособить

Deff 03.01.2015 17:30

Во еще идея, более интересная , чем картинка
DIV c полупрозрачными бордерами, которые высотой в экран(верхний - нижний)
и шириной в экран(левый - правый) (его вставить в неподвижный div c overflow:hidden по размеру экрана)
Тогда проблемы со скорость. отпадут, посколь перемещаем лишь единственный элемент и задание ширины высоты элемента(DIV ) много проще

рони 03.01.2015 18:38

Deff,
перекрывают доступ к элементу :(

Safort 03.01.2015 18:55

У меня 2 скромных предложения:
1. Переписать на ES6
2. Выложить на Гитхаб/Битбакет

bes 03.01.2015 19:01

Цитата:

Сообщение от рони
Deff,
перекрывают доступ к элементу

сильно не вникал
http://javascript.ru/forum/dom-windo...tml#post263176

рони 03.01.2015 20:06

Цитата:

Сообщение от Safort
У меня 2 скромных предложения:
1. Переписать на ES6
2. Выложить на Гитхаб/Битбакет

для меня это из разряда фантастики ... :cray:

Safort 03.01.2015 20:35

рони,
это почему? На ES5, значит, написал, а на ES6 совсем никак?)
Давай-ка выйди из своей зоны комфорта, уже 2015 год на дворе)
Ну а Гитхаб даже я осиливаю.

kobezzza 03.01.2015 20:50

Цитата:

Ну а Гитхаб даже я осиливаю.
Ну гитхаб прост как 3 копейки, а знаний гита хватит для начала на уровне: закомитить / создать бранч.

Я в этом году поставил цель нормально освоить сам Git, т.е. разобраться со всякими cherry-pick, pull --rebase и т.д., а то не солидно уже как то :)

Safort 03.01.2015 21:04

kobezzza,
помню когда-то давно случайно сделал несколько форков крутых фреймворков :D

рони 03.01.2015 21:06

kobezzza,
Safort,
судя по вашим сообщениям я незнаю и десятой части, того что вы осилили :)

Deff 03.01.2015 21:17

Цитата:

Сообщение от рони (Сообщение 349350)
Deff,
перекрывают доступ к элементу :(

Как только фигнюшка станет ровно над элементом временно поднимаем элемент через z-index и position:relative
Запоминая предыдущую position и z-index(если есть). Ксать если position не static, её не трогаем, только крутим z-index

Safort 03.01.2015 21:25

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

Если говорить о ES6, то там в основном всё довольно легко.
Сам посмотри, как такое может быть сложным для человека более-менее знающего ES5?

var numb = 100500;

var es5String = 'numb = ' + numb;
var es6String = `numb = ${numb}`;
//или так
let es6String = `numb = ${numb}`;

//---------------------------------

window.onclick = function(e) {
  //ES5
};
window.onclick = (e) => {
  //ES6
};

//---------------------------------

setTimeout(function() {
  //ES5
}, 1000);

setTimeout(() => {
  //ES6
}, 1000);

//---------------------------------

var name = 'Name';
var mess = 'Mess';


var es5Data = {
  name: name,
  mess: mess
};

var es6Data = {name, mess};


Если тебе не хочется развиваться как js-программисту(решил сменить специальность, надоел JS или ещё что-то), то единственное, что может мешать - это лень)

рони 03.01.2015 21:37

Цитата:

Сообщение от Safort
Если тебе не хочется развиваться как js-программисту(решил сменить специальность, надоел JS или ещё что-то), то единственное, что может мешать - это лень)

Цитата:

В 1776 году Жан-Жак Руссо описал историю, случившуюся за 25 лет до этого, в которой «великая принцесса» (имя неизвестно) ответила на сообщение о том, что у народа нет хлеба для питания: «Тогда пусть едят пирожные» .
:thanks:

рони 03.01.2015 21:40

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

Safort 03.01.2015 21:41

рони,
я что-то не понял к чему эта цитата. Разонравилось программирование?

Rise 03.01.2015 21:47

Safort, что-то запутанный какой-то ES6 получается, от function одни скобки и ищи их потом в коде :D а этот знак ` ваще имхо бред какой-то, читать код не возможно будет с этими малозаметными символами.

Deff 03.01.2015 21:50

Safort,
К примеру , есть вариант иного кредо, не спеша заниматься тем чем нравится, по мере углубления практики, возникает и необходимость в освоении нового, менее быстро, но в итоге большое понимание текущего объема и прыжки на новое, лишь при подходе к границам возможного. Иначе часто наблюдаются сверхсложные решения при наличии более простых

Safort 03.01.2015 21:56

Rise,
нет, просто я говнокодер Это просто с непривычки. Пишу уже какое-то время на ES6 и всё ощутимо удобнее, чем на ES5.
Цитата:

а этот знак ` ваще имхо брел какой-то
Опять же, с непривычки)

Safort 03.01.2015 21:58

рони,
Цитата:

может есть решение на ксс чтоб нижний блок сам подстраивался и занимал всё пустое пространство снизу
flexbox?
//обсуждение не читал

Safort 03.01.2015 22:01

Deff,
Цитата:

Иначе часто наблюдаются сверхсложные решения при наличии более простых
Но только не на ES6 :)
А так, в общем, согласен.

Rise 03.01.2015 22:08

Safort, лучше бы var убрали ;)

bes 03.01.2015 22:11

Цитата:

Сообщение от Safort
Если тебе не хочется развиваться как js-программисту(решил сменить специальность, надоел JS или ещё что-то), то единственное, что может мешать - это лень)

рони почему-то ассоциируется у меня с молодым devote, умнее тут всех, но почему-то скромничает :)

Deff 03.01.2015 22:13

Цитата:

Сообщение от рони
может есть решение на ксс чтоб нижний блок сам подстраивался и занимал всё пустое пространство снизу

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

рони 03.01.2015 22:14

Цитата:

Сообщение от Safort
я что-то не понял к чему эта цитата. Разонравилось программирование?

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

Safort 03.01.2015 22:17

Rise,
Цитата:

Safort, лучше бы var убрали
И большую часть сайтов заодно)

bes 03.01.2015 22:19

Цитата:

Сообщение от рони
странный вы какой-то - я пробовал к вам обращаться - но вы непонимаите, что другие могут чего-то просто незнать что что-то есть,что знаите вы, не понимать что понимаите вы.

всё знать невозможно, что не знаешь, берёшь и читаешь, странно, что это приходится говорить рони

Safort 03.01.2015 22:24

bes,
Цитата:

рони почему-то ассоциируется у меня с молодым devote, умнее тут всех, но почему-то скромничает
Скромники 80 лвл)

рони,
Цитата:

но вы непонимаите, что другие могут чего-то просто незнать что что-то есть,что знаите вы, не понимать что понимаите вы.
Так речь не о текущих знаниях, а о желании/возможности приобрести новые.

Пожалуй, я закончу оффтопить, а то как-то не хорошо получается.

bes 03.01.2015 22:28

на самом деле, понимаю, переработал наш рони, в новогодние праздники вообще грешно работать :yes:

ruslan_mart 04.01.2015 08:58

Прикольно, но лучше на чистом JS + CSS3 сделать. :)

рони 04.01.2015 10:06

Ruslan_xDD,
по CSS3 не уточнишь какие части сделать и чтобы ты применил.

bes 04.01.2015 10:09

Цитата:

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

jquery обречена :D

Deff 04.01.2015 13:13

Интересно потестить длинное перемещение по ширине экрана.
Т.е переход от мелкого объекта слево, к мелкому объекту справо на экране в 1400 - 1900 пиксел шириной

рони 04.01.2015 14:18

Deff,
:-? http://learn.javascript.ru/play/vmjRfb

Deff 04.01.2015 14:35

рони,
Боковых отслоений на большой скорости нет.

<pre>Ксать если сейчас обрамление такого вида,
 <img src=http://sf.uploads.ru/0RBab.png>
и  боковых отслоений на большой скорости -нет,

то возможно переход к такому обрамлению
 <img src=http://sf.uploads.ru/fDvuy.png>
возможно решит вопрос об отслоении на высоких скоростях снизу

Или к такому:
 <img src=http://sf.uploads.ru/vJnVG.png>
</pre>

рони 04.01.2015 15:00

Deff,
:thanks: :write:
непомогло ... дефект сверху перешёл вправо
http://learn.javascript.ru/play/GIIoF

Deff 04.01.2015 15:01

рони,
Тест на клик<br><br><br><br><br>
<a href="#" style="position:relative;z-index:20;margin-left:70px;" onclick=alert('a')>asdasda</a><br>
<span style="position:relative;z-index:20;margin-left:70px;"onclick=alert('span')>Тест2</span>

<div class="wrap" style="position:fixed;z-index:10;top:0;left:0;width:100%;height:100%;overflow:hidden;">
<div style="border:solid 1200px rgba(0,0,0,0.7);/*Смещаем на border*/margin-top:-1200px;margin-left:-1200px;position:absolute; width:150px;height:60px;/*Устанавливаем позицию окна*/top:90px;left:30px;"></div>
</div>


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