CSS3 переход фонового изображения

122

Я пытаюсь создать эффект постепенного появления и исчезновения с помощью перехода 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/

Ник Зани
источник

Ответы:

104

Вы можете перейти 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.

Hengjie
источник
106
background-imageне является анимируемым свойством ( w3.org/TR/css3-transitions/#animatable-properties ), поэтому ваше решение не соответствует стандарту.
TLindig
12
Это не решение - FF и IE не поддерживают его, и, как указано выше, это свойство не должно поддерживаться в спецификации.
Sentinel
См. Также текущие разработки в Fx: bugzilla.mozilla.org/show_bug.cgi?id=546052
Волкер Э.
2
@TLindig Это должно быть свойство, допускающее анимацию.
3
Свойство animatable есть background, и это то, что следует использовать (у меня оно работает в Chrome). Возможно, спецификация (или имп) изменилась с тех пор, как был опубликован вопрос
fps
37

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

сначала вам нужно сделать "контейнер" для <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/ (различия между ними - всего несколько селекторов)

В принципе, вам нужно скрыть «нормальное» состояние и показать их «наведение» при наведении на него

и все, надеюсь, кому-нибудь это пригодится.

Руффо
источник
Хорошее решение. Экспериментируя с первым образцом, я заметил, что если вы увеличите длительность перехода до 4 секунд, вы можете увидеть очень заметный скачок, когда z-index переключается в середине перехода. По крайней мере, в Chrome 35 вы можете сместить время переключения z-index и очистить переход, изменив значение свойства на «all 4s easy , z-index 1ms» ( jsfiddle.net/eD2zL/330 ).
Нил Штублен 01
2
@NealS. ты прав. Этому ответу 2 года, я бы удалил z-index, это кажется ненужным. Изображения просто должны быть в порядке.
Ruffo
Большое спасибо. Ваше решение мне очень помогло.
Slam
Возможна ли "ленивая загрузка" при использовании этого решения?
Daniel
16

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

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

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

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

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

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

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

Теперь все, что вам нужно, это «непрозрачность» в «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;
}

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

Остин Пэрриш Томас
источник
3
Я также сделал его видеоурок. youtube.com/watch?v=6ieR5ApVpr0
Остин Пэрриш Томас
Вам не нужно, AFAIK, указывать переходы в псевдоклассе зависания; определение перехода для типа тега привязки будет перенесено в поведение при наведении, все, что вам нужно изменить, - это прозрачность. Имейте в виду, что этот пример работает хорошо, потому что стили применяются непосредственно к типам идентификаторов / тегов; если вы делаете это с классами, вы должны убедиться, что вы не добавляете и не удаляете класс с определенным переходом.
KeithS
13

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

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>
MaxCloutier
источник
2
Это прекрасно работает, но вы можете столкнуться с 2 проблемы: 1) если вы не видите :afterэлемент, попробуйте установить widthи , heightкак 100%вместо того , чтобы inherit, 2) , если background-imageфактически отображаются на переднем плане , использование отрицательного индекса для :afterэлемента:z-index: -1;
Радек Пече
9

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

Например :

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

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

MaxDhn
источник
Спасибо, я решил проблему с анимацией смены фона таблицы с помощью этого плагина.
userlond
4

Попробуйте это, заставит анимированный фон работать в Интернете, но гибридное мобильное приложение не работает

@-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;
}
Хешам Насер
источник
4

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

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

СКС

@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/

Пабло С.Г. Пачеко
источник
Очень красивое решение! Дали мне лучшее понимание того, как эффективно использовать состояния элементов ': before' и ': after' в качестве бонуса :-)
joronimo
3

Если анимация 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;
}
shock_one
источник
Если вам нужен эффект постепенного исчезновения из .afterв .beforeдля фонового изображения, вы должны установить фоновое изображение в .before. В противном случае он просто исчезнет без анимации.
Радек Печ
2

Салам, этот ответ работает только в 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/

Мухаммед Сулейман
источник
Все еще не работает на fire fox или IE :(, но отлично смотрится в хроме
Мухаммед Сулейман
1

С вдохновляющим постом Криса здесь:

https://css-tricks.com/different-transitions-for-hover-on-hover-off/

Мне удалось вот что придумать:

#banner
{
    display:block;
    width:100%;
    background-repeat:no-repeat;
    background-position:center bottom;
    background-image:url(../images/image1.jpg);
    /* HOVER OFF */
    @include transition(background-image 0.5s ease-in-out); 

    &:hover
    {
        background-image:url(../images/image2.jpg);
        /* HOVER ON */
        @include transition(background-image 0.5s ease-in-out); 
    }
}
Кэрол МакКей
источник
0

Этого можно достичь с большей кросс-браузерной поддержкой, чем принятый ответ, используя псевдоэлементы, как показано в этом ответе: https://stackoverflow.com/a/19818268/2602816

vaer-к
источник
0

Я немного боролся с этим, сначала я использовал стопку изображений друг над другом, и каждые три секунды я пытался анимировать следующее изображение в стеке и бросать текущее изображение в конец стека. В то же время я использовал анимацию, как показано выше. Я не мог заставить его работать всю жизнь.

Вы можете использовать эту библиотеку, которая позволяет ** динамически изменять размер фонового изображения с поддержкой слайд-шоу ** с помощью jquery-backstretch.

https://github.com/jquery-backstretch/jquery-backstretch

Ахил Ханна
источник