Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.09.2012, 23:36
Новичок на форуме
Отправить личное сообщение для Glorymirror Посмотреть профиль Найти все сообщения от Glorymirror
 
Регистрация: 27.09.2012
Сообщений: 2

Затемнение участков картинки
Здравствуйте. Хотел узнать, как сделать, так чтобы на картинке, выделялось рамкой определенное место (div'ом конечно), а все остальное затемнялось. Идеи никак не лезут в голову. Максимально додумал что кроме как jquery ничего не поможет
Ответить с цитированием
  #2 (permalink)  
Старый 28.09.2012, 00:56
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

div + box-shadow (CSS)..

но вообще лучше canvas - он для этих целей сделан.
Ответить с цитированием
  #3 (permalink)  
Старый 28.09.2012, 01:00
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Можно и border'ом обойтись.)
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 28.09.2012, 01:01
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

<head>
        <meta endcoding="windows-1751" />
        <style type="text/css">
            body {
                margin:0px;
                padding:0px;
            }
            .sel {
                position:absolute;
                background-color:rgba(0, 30, 150, 0.3);
                border:1px solid rgba(30, 150, 0, 0.4);
            }
        </style>
        <script type="text/javascript">
            var ctx2;
 
            function selection(elem, drags) {
                if ((typeof elem != "object") || (typeof drags != "object") || (((drags + "") != "[object HTMLDivElement]") && ((drags + "") != "[object]"))) {
                    console.log('selection error');
                    return;
                };
                drags.style.display = "none";
                elem.onmousedown = function (e) {
                    drags.style.display = "block";
                    var e = e || window.event;
                    selection.x = e.pageX;
                    selection.y = e.pageY;
                    drags.style.left = selection.x;
                    drags.style.top = selection.y;
                    selection.drags = drags;
                    selection.e = e;
                    elem.onmousemove = function (e) {
                        var e = e || window.event;
                        if (e.pageX - selection.x > 0) {
                            selection.drags.style.left = selection.x;
                            selection.drags.style.width = e.pageX - selection.x;
                        } else {
                            selection.drags.style.left = e.pageX;
                            selection.drags.style.width = selection.x - e.pageX;
                        }
                        if (e.pageY - selection.y > 0) {
                            selection.drags.style.height = e.pageY - selection.y;
                            selection.drags.style.top = selection.y;
                        } else {
                            selection.drags.style.top = e.pageY;
                            selection.drags.style.height = selection.y - e.pageY;
                        }
                    }
                }
                elem.onmouseup = function () {
                    var cnv2 = document.getElementById("cnv2");
                    cnv2.setAttribute('width', drags.offsetWidth);
                    cnv2.setAttribute('height', drags.offsetHeight);
                    ctx2.drawImage(document.getElementById("cnv"), drags.offsetLeft, drags.offsetTop, drags.offsetWidth, drags.offsetHeight, 0, 0, drags.offsetWidth, drags.offsetHeight);
                    drags.style.display = "none";
                    elem.onmousemove = function () {};
                    drags.style.width = 0;
                    drags.style.height = 0;
                };
            };
            window.onload = function () {
                var sel = document.getElementById("sel");
                selection(document, sel);
                var ctx = document.getElementById("cnv").getContext('2d');
                ctx2 = document.getElementById("cnv2").getContext('2d');
                img = new Image();
                img.src = "http://www.parkhotelbrasilia.com/sites/default/files/lavorazione_vetro_murano.jpg";
                img.onload = function () {
                   document.getElementById("cnv").width = img.width;
                   document.getElementById("cnv").height = img.height;
                   ctx.drawImage(img, 0, 0, img.width, img.height);
                }
            }
        </script>
    </head>
     
    <body onselectstart='return false'>
        <canvas id=cnv width=300 height=140 style='border:1px solid black'></canvas>
        <canvas id=cnv2 width=100 height=120 style='border:1px solid black'></canvas>
        <div id="sel" class="sel"></div>
    </body>

как вариант Маленький эффект
P.S. код говнецо, но я не гнался за производительностью
Ответить с цитированием
  #5 (permalink)  
Старый 28.09.2012, 01:01
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Aetae Посмотреть сообщение
Можно и border'ом обойтись.)
а, я проспал момент - я думал нужна градиентная изящная рамка.
Ответить с цитированием
  #6 (permalink)  
Старый 28.09.2012, 07:34
Новичок на форуме
Отправить личное сообщение для Glorymirror Посмотреть профиль Найти все сообщения от Glorymirror
 
Регистрация: 27.09.2012
Сообщений: 2

Нет, не совсем это мне нужно. Я имел ввиду, что есть картинка, и при наведении на нее, появляется окошко, например 20х20 пикс. Остальная же часть картинки затемняется.
Ответить с цитированием
  #7 (permalink)  
Старый 28.09.2012, 17:47
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

если без webkit-mask обойтись, то обложи пустое место, вокруг 4мя чёрными частично прозрачными дивами
Тобиш сверху, снизу, слева и справа, между ними всё будет видно (так как там нечего незагараживает нашу выделенную часть) а вокруг затемнёно (так как там наши тёмные дивы)

к примеру
верхний div по x от 0 во всю ширину затемняемого контенера
по y от 0 до начального y требуемого пустого пространства

и ещё три можно найти так же.

думаю более сложные маски можно сделать при помощи PNG с прозрачностью или SVG
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 28.09.2012 в 18:14.
Ответить с цитированием
  #8 (permalink)  
Старый 28.09.2012, 18:25
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

DjDiablo, самый топорный и убогий вариант.

Есть 2 простых кроссбраузерных варианта использующих !1 див:
1. Выделение div'ом, затемение border'ом, с изменяемой общей opacity.
2. Изменение размера div с overflow:hidden в котором находится картинка, с изменением положения этого div'а и положения картинки в нём. Подложка, т.е. рамка в таком случае может быть любой.

И есть множество вариантов с css3 вообще не требующих дополнительного div: box-shadow: inset, градиенты, множественные background'ы и border'ы итд.

В любом случае геморроя, вёркстки и js кода на порядок меньше, а результат производительнее.
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 28.09.2012, 20:38
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

про бордер ты уже писал в 3ем посте, решение интересное возможно лучшее, я просто предложил альтернативу.

что касается изменения положения картинки в div с hidden, то есть недостаток, во первых изображение вокруг проблематично затемнить частично. Для эфaекта частичного затемнения придётся иметь затемнённую копию картинки на заднем плане, точнее картинку перекрытую оверлеем. По факту код окажется несколько сложнее чем для 4х дивов.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 28.09.2012 в 21:25.
Ответить с цитированием
  #10 (permalink)  
Старый 28.09.2012, 21:21
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Сообщение от DjDiablo Посмотреть сообщение
По факту код окажется несколько сложнее чем для 4х дивов.
2 дива: 1 с картинкой бг, другой внутри него с картинкой внутри.
И код влияющий только на картинку и второй див.

В в случае 4х - придётся проводить расчёты для всех четырёх дивов. Но основная проблема не в этом, а в стилизации затемнения. Если эффект чкть сложнее чем простое затемнение - получим кучу проблем со стыковкой div'ов.
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить не нужные картинки utb jQuery 2 26.10.2011 13:50
Ссылка джаваскриптом с картинки seasick Общие вопросы Javascript 2 05.09.2011 15:48
Как проиндексировать картинки HTML код которых генерируется на JS greatilya Оффтопик 9 22.09.2010 07:42
Получение координат от картинки EmDmAl Events/DOM/Window 4 08.11.2009 14:34
Как изменить размер картинки? Mihail Общие вопросы Javascript 1 25.10.2009 13:42