Подтвердить что ты не робот

Переход CSS на прозрачные изображения

У меня есть три изображения (прозрачные png)

Изображение 1

Изображение 2

Изображение 3

которые складываются с использованием следующего html/css

<div style="position: relative; left: 0; top: 0;">
    <img src="img/main.png" style="position: absolute; top: 0; left: 0;" />
    <img src="img/middle.png" style="position: absolute; top: 0; left: 0;"/>
    <img src="img/center.png" style="position: absolute; top: 0; left: 0;"/>
</div>

чтобы получить следующее:

Изображение 4

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

Обычный CSS для увеличения при наведении будет:

img {
    -webkit-transition: all 1s ease; /* Safari and Chrome */
    -moz-transition: all 1s ease; /* Firefox */
    -ms-transition: all 1s ease; /* IE 9 */
    -o-transition: all 1s ease; /* Opera */
    transition: all 1s ease;
}

img:hover {
    -webkit-transform:scale(1.25); /* Safari and Chrome */
    -moz-transform:scale(1.25); /* Firefox */
    -ms-transform:scale(1.25); /* IE 9 */
    -o-transform:scale(1.25); /* Opera */
     transform:scale(1.25);
}

который не работает в этом случае, потому что эффект зависания применяется ко всему изображению не только к части изображения (изображения имеют прозрачный фон).

Мой вопрос: возможно ли создавать прозрачные изображения с CSS, которые имеют неправильную форму?

jsfiddle здесь: http://jsfiddle.net/h4mxysw5/

Изменить:

Кажется, есть путаница. Я не хочу одновременно масштабировать все три изображения.

Например - когда наведите курсор на центральное изображение, я хочу, чтобы только центральное изображение увеличивало (не все).

Обновлен jsfiddle с рамкой: http://jsfiddle.net/h4mxysw5/4/

4b9b3361

Ответ 1

Две вещи, которые вам нужно сделать.

  • Обрезайте изображения, чтобы они соответствовали только требуемому пространству, а не всему размеру контейнера, чтобы они не перекрывали друг друга.
  • Удалите :hover из div и добавьте поведение :hover к каждому изображению с помощью селектора img.

Вот пример:

div {
    margin: 50px; /* Just for demo purposes */
}

img {
    -webkit-transition: all 1s ease; /* Safari and Chrome */
    -moz-transition: all 1s ease; /* Firefox */
    -ms-transition: all 1s ease; /* IE 9 */
    -o-transition: all 1s ease; /* Opera */
    transition: all 1s ease;
}

img:hover {
    -webkit-transform:scale(1.25); /* Safari and Chrome */
    -moz-transform:scale(1.25); /* Firefox */
    -ms-transform:scale(1.25); /* IE 9 */
    -o-transform:scale(1.25); /* Opera */
     transform:scale(1.25);
}
<div style="position: relative; left: 0; top: 0;">
    <img class="one" src="http://i.stack.imgur.com/bFfbC.png" style="position: absolute; top: 0; left: 0;" />
    <img class="two" src="http://i.imgur.com/iEwbExs.png" style="position: absolute; top: 76px; left: 72px;"/>
    <img class="three" src="http://i.imgur.com/hdwFlUv.png" style="position: absolute; top: 102px; left: 100px;"/>
</div>

Ответ 2

Основная проблема здесь в том, что все изображения, которые вы использовали, имеют одинаковую размерность. Поэтому, поскольку они сидят друг над другом, вы всегда будете парить над верхней. Просто потому, что изображение прозрачно, оно все равно срабатывает: наведите указатель мыши, когда вы наведите указатель мыши на любую часть изображения. Чтобы продемонстрировать использование собственного CSS, вы можете сделать это без изображений:

div > div {
-webkit-transition: all 1s ease; /* Safari and Chrome */
-moz-transition: all 1s ease; /* Firefox */
-ms-transition: all 1s ease; /* IE 9 */
-o-transition: all 1s ease; /* Opera */
transition: all 1s ease;
border:10px solid #f00;
border-radius:50%;
position: absolute; 
 }

.outer {
width:200px;
height:200px;
    top: 25px; 
left: 25px;
border:30px solid #f00;
}
.middle {
width:150px;
height:150px;
    top: 60px; 
left: 60px;
border:20px solid #f00;
}
.inner {
width:100px;
height:100px;
top: 95px; 
left: 95px;
border:10px solid #f00;
}

div > div:hover {
-webkit-transform:scale(1.25); /* Safari and Chrome */
-moz-transform:scale(1.25); /* Firefox */
-ms-transform:scale(1.25); /* IE 9 */
-o-transform:scale(1.25); /* Opera */
 transform:scale(1.25);
}
<div style="position: relative; left: 0; top: 0;">
    <div class="outer"></div><div class="middle"></div><div class="inner"></div>
</div>

Ответ 3

Из явного любопытства, если это можно было сделать, мне просто нужно было создать версию только CSS. Хотя он не использует изображения в качестве требуемого OP, я по-прежнему думаю, что в качестве альтернативы img и/или JS результат стоит опубликовать.

В этом фрагменте вы увидите как незашифрованную, так и затененную версию. Пожалуйста, сделайте свои комментарии...

(btw: проверено в FF DE 44+, Chrome 46+ и IE11 + на W7)

html, body      { box-sizing: border-box; 
                  height: 100%; width: 100%; background-color: #f9f7f1;
                  margin: 0px; padding: 0px; border: 0px;
                  cursor: default }
*, *:before, 
*:after         { box-sizing: inherit }

.donut-button   { position: relative;
                  width:  280px;
                  height: 280px; 
                  margin: 100px auto;
                  cursor: pointer }

.r-outer        { width: 100%; height: 100%; border-width: 55px; top:  0.0%; left:  0.0% }
.r-middle       { width:  50%; height:  50%; border-width: 15px; top: 25.0%; left: 25.0% }
.r-center       { width:  25%; height:  25%; border-width: 20px; top: 37.5%; left: 37.5% }

.ring           { position: absolute;
                  border-color : hsl(205, 69%, 58%);
                  border-style : solid;
                  border-radius: 50%;
                  transition: all 50ms }

.ring:hover     { transform: scale(1.10) }
.ring:active    { transform: scale(0.95) }


/* demo extras, shadow and color manipulation during hover */
[btn]           { box-shadow: inset    0    0    1px hsla(205, 69%,48%, 1),  /* hide white overflow (quirk) */
                              inset   10px 10px 10px hsla(205, 69%, 8%,.3),  /* inset shadow */
                                       0    0    1px hsla(205, 69%,58%, 1),  /* hide white overflow (ditto) */
                                      20px 20px 10px hsla(205, 69%, 8%,.4),  /* inner outside shadow */
                                       0    0    1px hsla(205, 69%, 8%,.3) } /* outer outside shadow */

[btn]:hover     { border-color: hsl(205, 69%, 62%);
                  box-shadow: inset 10px 10px 10px hsla(205, 69%, 8%,.4),
                                    20px 20px 10px hsla(205, 69%, 8%,.3) }

[btn]:active    { border-color: hsl(205, 69%, 54%);
                  box-shadow: inset  8px  8px  8px hsla(205, 69%, 8%,.5),
                                    10px 10px 10px hsla(205, 69%, 8%,.4) }
    <div id="donut-1" class="donut-button">
        <div class="ring r-outer"></div>
        <div class="ring r-middle"></div>
        <div class="ring r-center"></div>
    </div>

    <div id="donut-2" class="donut-button">
        <div btn class="ring r-outer"></div>
        <div btn class="ring r-middle"></div>
        <div btn class="ring r-center"></div>
    </div>

Ответ 4

С помощью JavaScript вы можете жестко закодировать области зависания следующим образом:

JavaScript

function animateCircles(obj) {
    var x = window.event.x - obj.offsetLeft;
    var y = window.event.y - obj.offsetTop;
    var img1 = document.getElementById('1');
    var img2 = document.getElementById('2');
    var img3 = document.getElementById('3');

    var centerR = 45;
    var middleR = 75;
    if (x >= img3.offsetLeft + (img3.offsetWidth / 2 - centerR) && 
        x <= img3.offsetLeft + (img3.offsetWidth / 2 + centerR) && 
        y >= img3.offsetTop + (img3.offsetHeight / 2 - centerR) && 
        y <= img3.offsetTop + (img3.offsetHeight / 2 + centerR))
        img3.className += " onhover";
    else
        img3.className = "normal";

    if (x >= img2.offsetLeft + (img2.offsetWidth / 2 - middleR) && 
        x <= img2.offsetLeft + (img2.offsetWidth / 2 + middleR) && 
        y >= img2.offsetTop + (img2.offsetHeight / 2 - middleR) && 
        y <= img2.offsetTop + (img2.offsetHeight / 2 + middleR))
        img2.className += " onhover";
    else
        img2.className = "normal";

    if (x >= img1.offsetLeft && 
        x <= img1.offsetLeft + img1.offsetWidth && 
        y >= img1.offsetTop && 
        y <= img1.offsetTop + img1.offsetHeight)
        img1.className += " onhover";
    else
        img1.className = "normal";
}

Здесь вы указываете размер "квадратов" наведения (в центре изображений, с которых должно происходить зависание) с переменными centerR и middleR. Обратите внимание, что вы также можете улучшить этот код, чтобы увеличить область зависания, так как изображения растут, так что изображения только уменьшаются, когда вы нависаете за пределами увеличенного изображения. Обратите внимание, что я специально кодировал все ширины и высоты изображений: это обеспечивает большую гибкость, если вы когда-либо решаете изменить изображения.

В следующем HTML:

<div style="position: relative; left: 0; top: 0;">
    <img id="1" src="http://i.stack.imgur.com/bFfbC.png" style="position: absolute; top: 0; left: 0;" onmousemove="animateCircles(this)" />
    <img id="2" src="http://i.stack.imgur.com/Eewcq.png" style="position: absolute; top: 0; left: 0;" onmousemove="animateCircles(this)" />
    <img id="3" src="http://i.stack.imgur.com/VXk7A.png" style="position: absolute; top: 0; left: 0;" onmousemove="animateCircles(this)" />
</div>

и CSS:

.normal {
    -webkit-transition: all 1s ease;
    -moz-transition: all 1s ease;
    -ms-transition: all 1s ease;
    -o-transition: all 1s ease;
    transition: all 1s ease;
}
.onhover {
    -webkit-transform:scale(1.25);
    -moz-transform:scale(1.25);
    -ms-transform:scale(1.25);
    -o-transform:scale(1.25);
    transform:scale(1.25);
}

Это дает следующий результат:

demo

> DEMO

Ответ 5

Попробуйте Pixel Selection: библиотека JQuery, которая может обрабатывать прозрачность при зависании.

$(function() {
  $('img').Pixelselect({
    over: function(e, obj, hit) {
      if (hit) {
        obj.addClass('hover');
      } else {
        obj.removeClass('hover');
      }
      e.preventDefault();
    },
    out: function(e, obj) {
      obj.removeClass('hover');
      e.preventDefault();
    },
    sublayers: true
  })
})
img {
  -webkit-transition: all 1s ease;
  /* Safari and Chrome */
  -moz-transition: all 1s ease;
  /* Firefox */
  -ms-transition: all 1s ease;
  /* IE 9 */
  -o-transition: all 1s ease;
  /* Opera */
  transition: all 1s ease;
  opacity: 1;
}
img.hover {
  opacity: 0.5;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div style="position: relative; left: 0; top: 0;">
  <img src="http://i.stack.imgur.com/80Jxj.png" style="position: absolute; top: 0; left: 0;" />
  <img src="http://i.stack.imgur.com/Eewcq.png" style="position: absolute; top: 0; left: 0;" />
  <img src="http://i.stack.imgur.com/VXk7A.png" style="position: absolute; top: 0; left: 0;" />
</div>

Ответ 6

Демо
Я использовал z-index для трех div, и каждый div имеет background-image

  • /*Largest Circle*/ Div1 = z-index: 1
  • /*second Circle*/ Div1 = z-index: 2
  • /*Middle Small Circle*/ Div1 = z-index: 3

    Stack

z-index в основном используется для его укладки, поэтому средний круг находится сверху, второй круг находится между самым большим кругом и средним небольшим кругом, самый большой круг - это, наконец, не влияет на наведение мыши на другой круг, поскольку весь круг больше, чем кружок сверху (в z-index), чтобы они были видимыми и зависящими друг от друга. Div id allImg используется для установки align, size, так как все дочерние div для allImg имеют ширину, высоту в процентах, они будут автоматически изменять размер

/*Outer Div use for alignment and to set size*/
		#allImg{
			width: 200px;
			height: 200px;
			margin: 0 auto;
			position: relative;
			 top:100px;
		}
		/*Styling appling to all desendant div inside allImg*/
		#allImg > div{
			position:absolute;
			padding: 0px;
			-webkit-transition: all 1s ease;/* Safari and Chrome */
		    -moz-transition: all 1s ease;/* Firefox */
		    -o-transition: all 1s ease; /* IE 9 */
		    -ms-transition: all 1s ease;/* Opera */
		    transition: all 1s ease;
		    position: absolute;
			padding: 0px;
			transition: all 1s ease 0s;
			border: 1px solid #000;
			border-radius: 100px;
		}
		/*Div with smallest z-index i.e outer circle*/
		#img1{
			background-image: url('http://i.stack.imgur.com/GWShR.png');
			background-size: 100% 100%;
			width: 100%;
			height: 100%; 
			z-index: 1;

		}

		#img1:hover{
			-moz-transform: scale(1.25);/* Firefox */
			-webkit-transform:scale(1.25); /* Safari and Chrome */
		    -ms-transform:scale(1.25); /* IE 9 */
		    -o-transform:scale(1.25); /* Opera */
		     transform:scale(1.25);
		}
		/*Div with greater z-index  then Outer circle i.e 2nd circle*/
		#img2{
			background-image: url("http://i.stack.imgur.com/eWisy.png");
			background-size: 100% 100%;
			width: 50%;
			height: 50%;
			left: 25%;
			top: 25%;
			z-index:2;

		}
		#img2:hover{
			-moz-transform: scale(1.16);/* Firefox */
			-webkit-transform:scale(1.16); /* Safari and Chrome */
		    -ms-transform:scale(1.16); /* IE 9 */
		    -o-transform:scale(1.16); /* Opera */
		     transform:scale(1.16);
		}
		/*Div with greatest z-index i.e middle circle*/
		#img3{
			background-image: url("http://i.stack.imgur.com/VjygS.png");
			background-size: 100% 100%;
			width: 30%;
			height: 30%;
			left: 35%;
			top: 35%;
			z-index:3;
		}
		#img3:hover{
			-moz-transform: scale(1.13);/* Firefox */
			-webkit-transform:scale(1.13); /* Safari and Chrome */
		    -ms-transform:scale(1.13); /* IE 9 */
		    -o-transform:scale(1.13); /* Opera */
		     transform:scale(1.13);
		}
<div id="allImg">
  <div id="img1"></div>
  <div id="img2"></div>
  <div id="img3"></div>
</div>

Ответ 7

Думаю, вам нужно = > JSFiddle demo:)

    div:hover > img {
    -webkit-transform:scale(1.25); /* Safari and Chrome */
    -moz-transform:scale(1.25); /* Firefox */
    -ms-transform:scale(1.25); /* IE 9 */
    -o-transform:scale(1.25); /* Opera */
     transform:scale(1.25);
}

Ответ 8

Возможно одно из возможных решений:
(используя Элемент HTML-карты)

var vi = function(el) {
  
  var imgEl  = document.getElementById(el.getAttribute('data-img'));
  if(imgEl) imgEl.classList.add('effectOn');
}

var vo = function(el) {
  
  var imgEl  = document.getElementById(el.getAttribute('data-img'));
  if(imgEl) imgEl.classList.remove('effectOn');
  

}
img {
    -webkit-transition: all 1s ease; /* Safari and Chrome */
    -moz-transition: all 1s ease; /* Firefox */
    -ms-transition: all 1s ease; /* IE 9 */
    -o-transition: all 1s ease; /* Opera */
    transition: all 1s ease;
}

img.effectOn {
    -webkit-transform:scale(1.25); /* Safari and Chrome */
    -moz-transform:scale(1.25); /* Firefox */
    -ms-transform:scale(1.25); /* IE 9 */
    -o-transform:scale(1.25); /* Opera */
     transform:scale(1.25);
}
<div style="position: relative; left: 0; top: 0;">
  
  <img id='main' src="http://i.stack.imgur.com/80Jxj.png" style="position: absolute; top: 0; left: 0;" usemap='#main' />
  <img id='middle' src="http://i.stack.imgur.com/Eewcq.png" style="position: absolute; top: 0; left: 0;" usemap='#main'/>
  <img id='center' src="http://i.stack.imgur.com/VXk7A.png" style="position: absolute; top: 0; left: 0;" usemap='#main'/>

  <map id="main">

    <area shape="circle" onmouseover='vi(this)' onmouseout='vo(this)' data-img='center' coords="147,147,58" />
    <area shape="circle" onmouseover='vi(this)' onmouseout='vo(this)' data-img='middle' coords="147,147,90" />
    <area shape="circle" onmouseover='vi(this)' onmouseout='vo(this)' data-img='main' coords="147,147,147" />

  </map>

</div>

Ответ 9

Как сказано в комментарии только одно изображение, а другое 2 только с html/css. Здесь скрипка, надеюсь, что эффект вам нужен:)

https://jsfiddle.net/keypaul/8dr25184/

HTML

<div id="wrap">
    <div></div>
    <div></div>
    <img src="http://i.stack.imgur.com/bFfbC.png" alt="" />
</div>

CSS

    #wrap {
    position:relative;
    width:280px;
    height:280px;
}

#wrap img{
    position:relative;
    max-width:100%;
    height:auto;
    top:0;
    left:0;
    z-index:1;
    transform: scale(1);
    transition: 0.4s;
}

#wrap img:hover {
     transform:scale(1.25);
}

#wrap div:nth-child(1){
    background: transparent;
    border: 15px solid red;
    border-radius: 100px;
    height: 99px;
    left: 75px;
    overflow: hidden;
    position: absolute;
    top: 77px;
    width: 99px;
    z-index: 2;
    transform: scale(1);
    transition: 0.4s;
}

#wrap div:hover:nth-child(1){
    transform: scale(1.5);
}

#wrap div:nth-child(2){
    background: transparent;
    border: 20px solid red;
    border-radius: 40px;
    height: 34px;
    left: 103px;
    overflow: hidden;
    position: absolute;
    top: 105px;
    width: 34px;
    z-index: 3;
    transform: scale(1);
    transition: 0.4s;
}

#wrap div:hover:nth-child(2){
    transform: scale(1.5);
}

Вам нужно только удалить внутренний маленький круг из большого png, изменить цвет внутренних пончиков и добавить префикс поставщика в css.