CSS непрозрачность производительности. Исчезновение изображения - PullRequest
3 голосов
/ 21 января 2011

Я пытаюсь добавить свое изображение для переключения в галерею фотографий.Все это делается в JavaScript, который просто меняет значение CSS непрозрачности элемента изображения.Это очень медленно (медленно) на некоторых компьютерах - например, мой ноутбук, который не очень мощный, но совершенно новый (Asus Eeepc).

Мне было интересно, смогу ли я решить эту проблему с производительностью.Я видел демонстрации анимации Canvas и HTML5, примененные к изображениям, и они действительно гладкие на моем ноутбуке.Интересно, смогу ли я применить то же самое к своей функции затухания изображения.

Есть идеи?Как бы я это сделал?

Ответы [ 5 ]

3 голосов
/ 21 января 2011

Я быстро составил пример затухания изображения, используя тег canvas в соответствии с запросом: http://jsfiddle.net/6wmrd/12/ (проверено только в Chrome и Firefox)

Я не уверен, что естьЭто хоть какой-то выигрыш в производительности, но вот, по крайней мере, очень простой пример того, как это можно сделать.Следует также отметить, что это было сделано за 5 минут, чтобы код можно было улучшить и оптимизировать.

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

Другими способами повышения производительности могут быть снижение FPS.Если я не ошибаюсь, MooTools имеет 50 FPS в качестве стандарта.Однако снижение FPS может повлиять на воспринимаемую производительность.

2 голосов
/ 08 октября 2011

Вот код, который работает для всех браузеров: добавьте в заголовок:

/*  ****************************
    * updated for all browsers by 
    * Evan Neumann of Orbiting Eden on 
    * October 6, 2011.      
    * www.orbitingeden.com - evan@orbitingeden.com
    * original version only worked for IE
    *****************************/
<!-- Begin
    /*  *****************************
     *  * editable by user
     *  ***************************/
    var slideShowSpeed      = 5000; // Set slideShowSpeed (milliseconds)        shared by IE and other borwsers
    var crossFadeDuration   = 5;    // Duration of crossfade (1/10 second)      shared by IE and other borwsers
    var crossFadeIncrement  = .05;  //crossfade step amount (1 is opaque)   for non-IE browsers

    // Specify the image files
var Pic = new Array();      // do not change this line
// to add more images, just continue the pattern, adding to the array below
Pic[0] = 'images/dare2wear-427ED-e.jpg';        
Pic[1] = 'images/PBW_3238EDSM-e.jpg';           
Pic[2] = 'images/dare2wear-441_2ED-e.jpg';      

/*  ********************************
    * do not change anything below this line
    **********************************/
var f = 0;          //index of the foreground picture
var b = 1;          //index of the background picture
var p = Pic.length; //number of pictures loaded and in queue - this may increase as time goes on depending on number and size of pictures and network speed

//load the picture url's into an image object array
//used to control download of images and for IE shortcut
var preLoad = new Array();
for (i = 0; i < p; i++) { 
    preLoad[i] = new Image();
    preLoad[i].src = Pic[i];
}

function runSlideShow() {//this is trigerred by <body onload="runSlideShow()" > 
    //if IE, use alternate method
    if (document.all) {
        document.images.SlideShow.style.filter="blendTrans(duration=2)";
        document.images.SlideShow.style.filter="blendTrans(duration=crossFadeDuration)";
        document.images.SlideShow.filters.blendTrans.Apply();
    }

    //increment the foreground image source
    document.images.SlideShow.src = preLoad[f].src;

    //if IE, use the shortcut
    if(document.all) {
        document.images.SlideShow.filters.blendTrans.Play();
    }
    //all other browser use opacity cycling
    else    {
        var imageContainer  = document.getElementById('imageContainer');
        var image           = document.images.SlideShow;
        //convert an integer to a textual number for stylesheets
        imageContainer.style.background = "url('"+Pic[b]+"')";
        //set opacity to fully opaque (not transparent)
        image.style.opacity = 1;
        //run fade out function to expose background image
        fadeOut();
    }

    //increment picture index
    f++;
    //if you have reached the last picture, start agin at 0
    if (f > (p - 1)) f = 0;
    //set the background image index (b) to one advanced from foreground image
    b = f+1;
    //if b is greater than the number of pictures, reset to zero
    if(b >= p)  {b = 0;}

    //recursively call this function again ad infinitum
    setTimeout('runSlideShow()', slideShowSpeed);
}

function fadeOut(){
    //convert to element
    var el = document.images.SlideShow;

    //decrement opacity by 1/20th or 5%
    el.style.opacity = el.style.opacity - crossFadeIncrement;
    //if we have gone below 5%, escape out to the next picture
    if(el.style.opacity <= crossFadeIncrement)  {
        return; 
    }
    //wait 50 milliseconds then continue on to decrement another 5%
    setTimeout('fadeOut()', crossFadeDuration*10);
}
//  End -->

и добавьте два элемента в тело.Первый - это элемент фона контейнера.Я использовал div, но td, body и другие тоже должны работать.Второе - изображение на переднем плане.Наконец, в теге <body> добавьте вызов функции onload

  <body onLoad="runSlideShow()">
      <!-- this is the main image background -->
      <div id="imageContainer">
        <!-- this is the main image foreground -->
        <img id="SlideShow" name='SlideShow' width="324" height="486">
      </div>
1 голос
/ 21 января 2011

Производительность в основном связана с эффективностью JavaScript-кода.Используете ли вы какой-либо фреймворк (jQuery, Mootools)?

Между прочим, новый подход CSS3 transition будет подходить для этих сценариев.

На момент написания он поддерживается Gecko 2 (Firefox 4), webkit (Safari и Chrome) и Opera.

Поскольку спецификация переходов CSS все еще находится в черновом варианте, всесвязанные с ними свойства должны иметь собственный префикс:

#example  {
   opacity: 0;

   -o-transition: opacity .3s linear;
   -moz-transition: opacity .3s linear;
   -webkit-transition: opacity .3s linear;
   transition: opacity .3s linear;
}

#example:hover {
   opacity: 1;
}

Как насчет неподдерживаемых браузеров?Хорошим решением может быть нацеливание на них (по сути, Firefox <4 и IE) и отправка им некоторого выделенного кода JavaScript.Для небольшого отдыха всегда есть принцип изящной деградации. </p>

1 голос
/ 21 января 2011

Лука, один из способов сделать это быстрее - использовать аппаратное ускорение и преобразования webkit. Проблема в том, что разные браузеры поддерживают это в разной степени. См

http://mir.aculo.us/2010/06/04/making-an-ipad-html5-app-making-it-really-fast/

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

0 голосов
/ 21 января 2011

Взгляните на первую страницу этого сайта Это 5 изображений, которые постепенно исчезают и вращаются, чистый css2, html4, javascript и кросс-браузерный (насколько я знаю),Javascript немного надломлен - написан некоторое время назад :), но, похоже, он достаточно плавный.Посмотрите, как это на вашей машине.Если оно запаздывает, вы можете попробовать с более медленным обновлением, скажем, 150 или 200 мс вместо 100.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...