CSS3 фоновое изображение перехода - PullRequest
100 голосов
/ 28 февраля 2012

Я пытаюсь создать эффект постепенного исчезновения с помощью CSS-перехода.Но я не могу заставить это работать с фоновым изображением ...

CSS:

.title a {
    display: block;
    width: 340px;
    height: 338px;
    color: black;
    background: transparent;
    /* TRANSITION */
    -webkit-transition: background 1s;
    -moz-transition: background 1s;
    -o-transition: background 1s;
    transition: background 1s;
}

.title a:hover {
    background: transparent;
    background: url(https://lh3.googleusercontent.com/-p1nr1fkWKUo/T0zUp5CLO3I/AAAAAAAAAWg/jDiQ0cUBuKA/s800/red-pattern.png) repeat;
    /* TRANSITION */
    -webkit-transition: background 1s;
    -moz-transition: background 1s;
    -o-transition: background 1s;
    transition: background 1s;
}​

Взгляните: http://jsfiddle.net/AK3La/

Ответы [ 11 ]

94 голосов
/ 18 мая 2013

Вы можете перейти background-image.Используйте CSS ниже для элемента img:

-webkit-transition: background-image 0.2s ease-in-out;
transition: background-image 0.2s ease-in-out;

Это изначально поддерживается Chrome, Opera и Safari.Firefox еще не реализовал это ( bugzil.la ).Не уверен насчет IE.

36 голосов
/ 23 октября 2012

Решение (которое я нашел сам) - это трюк ниндзя, я могу предложить вам два способа:

сначала вам нужно создать «контейнер» для <img>, он будет содержать Обычные и одновременно состояния:

<div class="images-container">
    <img src="http://lorempixel.com/400/200/animals/9/">
    <img src="http://lorempixel.com/400/200/animals/10/">
</div>
  • с CSS3 селекторами http://jsfiddle.net/eD2zL/1/ (если вы используете это, «нормальное» состояние будет первым потомком вашего контейнера или изменится nth-child() заказ)

  • CSS2 решение http://jsfiddle.net/eD2zL/2/ (различия между ними всего лишь несколько селекторов)

По сути, вам нужно скрыть "нормальное" состояние и показать их "зависание", когда вы наводите его

и все, надеюсь, кто-нибудь найдет это полезным.

15 голосов
/ 26 февраля 2013

Я нашел решение, которое сработало для меня ...

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

<li id="facebook"><a href="facebook.com"></a></li>

Сделайте фон "li" изображением вашей кнопки

#facebook {
   width:30px;
   height:30px;
   background:url(images/social) no-repeat 0px 0px;
}

Затем сделайте фоновое изображение ссылки в состоянии наведениякнопки.Также добавьте к этому атрибут opacity и установите его на 0.

#facebook a {
   display:inline-block;
   background:url(images/social) no-repeat 0px -30px;
   opacity:0;
}

Теперь все, что вам нужно, это «opacity» под «a: hover» и установите его на 1.

#facebook a:hover {
   opacity:1;
}

Добавьте атрибуты перехода непрозрачности для каждого браузера в «a» и «a: hover», чтобы конечный CSS выглядел примерно так:

#facebook {
   width:30px;
   height:30px;
   background:url(images/social) no-repeat 0px 0px;
}
#facebook a {
   display:inline-block;
   background:url(images/social) no-repeat 0px -30px;
   opacity:0;
   -webkit-transition: opacity 200ms linear;
   -moz-transition: opacity 200ms linear;
   -o-transition: opacity 200ms linear;
   -ms-transition: opacity 200ms linear;
   transition: opacity 200ms linear;
}
#facebook a:hover {
   opacity:1;
   -webkit-transition: opacity 200ms linear;
   -moz-transition: opacity 200ms linear;
   -o-transition: opacity 200ms linear;
   -ms-transition: opacity 200ms linear;
   transition: opacity 200ms linear;
}

Если я правильно объяснил, это должно позволить вам иметькнопка затухания фона изображения, надеюсь, это поможет по крайней мере!

11 голосов
/ 28 февраля 2012

К сожалению, вы не можете использовать переход на background-image, см. Список w3c анимируемых свойств .

Возможно, вы захотите сделать несколько трюков с background-position.

10 голосов
/ 20 ноября 2014

Вы можете использовать псевдоэлемент, чтобы получить желаемый эффект, как я делал в этом Fiddle .

CSS:

.title a {
    display: block;
    width: 340px;
    height: 338px;
    color: black;
    position: relative;
}
.title a:after {
    background: url(https://lh3.googleusercontent.com/-p1nr1fkWKUo/T0zUp5CLO3I/AAAAAAAAAWg/jDiQ0cUBuKA/s800/red-pattern.png) repeat;
    content: "";
    opacity: 0;
    width: inherit;
    height: inherit;
    position: absolute;
    top: 0;
    left: 0;
    /* TRANSISITION */
    transition: opacity 1s ease-in-out;
    -webkit-transition: opacity 1s ease-in-out;
    -moz-transition: opacity 1s ease-in-out;
    -o-transition: opacity 1s ease-in-out;
}
.title a:hover:after{   
    opacity: 1;
}

HTML:

<div class="title">
    <a href="#">HYPERLINK</a>
</div>
9 голосов
/ 30 июля 2013

Если вы можете использовать jQuery, вы можете попробовать BgSwitcher плагин для переключения фонового изображения с эффектами, он очень прост в использовании.

Например:

$('.bgSwitch').bgswitcher({
        images: ["style/img/bg0.jpg","style/img/bg1.jpg","style/img/bg2.jpg"],
        effect: "fade",
        interval: 10000
});

И добавьте свой собственный эффект, см. Добавление типов эффектов

3 голосов
/ 02 июня 2015

Если анимация opacity не доступна, вы также можете анимировать background-size.

Например, я использовал этот CSS для установки backgound-image с задержкой.

.before {
  background-size: 0;
}

.after {
  transition: background 0.1s step-end;
  background-image: $path-to-image;
  background-size: 20px 20px;
}
2 голосов
/ 13 февраля 2017

Салам, этот ответ работает только в Chrome, потому что IE и FF поддерживают цветовой переход.

Нет необходимости делать ваши элементы HTML opacity:0, потому что иногда они содержат текст, и нет необходимости удваивать ваши элементы!.

Вопрос со ссылкой на пример в jsfiddle потребовал небольшого изменения, то есть поместить пустое изображение в .title a как background:url(link to an empty image); так же, как вы положили его в .title a:hover, но сделать его пустым изображением и кодом будет работать.

.title a {
display: block;
width: 340px;
height: 338px;
color: black;
background: url(https://upload.wikimedia.org/wikipedia/commons/5/59/Empty.png) repeat;
/* TRANSISITION */
transition: background 1s;
-webkit-transition: background 1s;
-moz-transition: background 1s;
-o-transition: background 1s;
  }
  .title a:hover{   background: transparent;
   background: url(https://lh3.googleusercontent.com/-p1nr1fkWKUo/T0zUp5CLO3I/AAAAAAAAAWg/jDiQ0cUBuKA/s800/red-pattern.png) repeat;
/* TRANSISITION */
transition: background 1s;
-webkit-transition: background 1s;
-moz-transition: background 1s;
-o-transition: background 1s;
}

Проверьте это https://jsfiddle.net/Tobasi/vv8q9hum/

1 голос
/ 18 мая 2018

Учитывая, что фоновые изображения нельзя анимировать, я создал небольшой микшер SCSS, позволяющий переходить между 2 различными фоновыми изображениями с помощью псевдоселекторов до и после .Они находятся на разных слоях z-index.Тот, что впереди, начинается с непрозрачности 0 и становится видимым при наведении.

Этот же подход можно использовать и для создания анимаций с линейными градиентами.

scss

@mixin bkg-img-transition( $bkg1, $bkg2, $transTime:0.5s ){  
  position: relative;  
  z-index: 100; 
  &:before, &:after {
    background-size: cover;  
    content: '';    
    display: block;
    height: 100%;
    position: absolute;
    top: 0; left: 0;    
    width: 100%;    
    transition: opacity $transTime;
  }
  &:before {    
    z-index: -101;
    background-image: url("#{$bkg1}");    
  }
  &:after {    
    z-index: -100;
    opacity: 0;
    background-image: url("#{$bkg2}");    
  }
  &:hover {
     &:after{
       opacity: 1; 
     }
  }  
}

Теперь вы можете просто использовать его с

@include bkg-img-transition("https://picsum.photos/300/300/?random","https://picsum.photos/g/300/300");

Вы можете проверить это здесь: https://jsfiddle.net/pablosgpacheco/01rmg0qL/

1 голос
/ 20 апреля 2017

Попробуйте, фоновая анимация будет работать в Интернете, но гибридное мобильное приложение не работает

@-webkit-keyframes breath {
 0%   {  background-size: 110% auto; }
 50%  {  background-size: 140% auto; }
 100% {  background-size: 110% auto; }      
}
body {
   -webkit-animation: breath 15s linear infinite;
   background-image: url(images/login.png);
    background-size: cover;
}
...