(CSS) faites défiler l'image de fond plus lentement que tout le reste

voici mon code CSS pour le corps:

body {
  padding: 0;
  margin: 0;
  background-image: url("../images/background.jpg");
  background-repeat: no-repeat;
  background-color: grey; 
  background-size: 100%;
}

ce que je veux faire est de faire en sorte que l'image défile plus lentement que tout le reste sur la page pour faire un simple effet de parallaxe. J'ai regardé en ligne et tous les exemples que j'ai vus sont beaucoup plus compliqués que ce que je veux.

20
demandé sur sdgfsdh 2015-03-24 21:19:01

6 réponses

je suis tombé sur cette recherche de plus de flexibilité dans ma vitesse de parallaxe que j'ai créé avec CSS pur et je veux juste souligner que tous ces gens ont tort et il est possible avec CSS pur il est également possible de mieux contrôler la hauteur de votre élément.

vous devrez probablement éditer un peu votre DOM / HTML pour avoir quelques éléments de conteneur, dans votre cas vous appliquez l'arrière-plan au corps qui vous restreindra beaucoup et ne semble pas être une bonne idée.

http://keithclark.co.uk/articles/pure-css-parallax-websites /

Voici comment vous contrôlez la hauteur avec Viewport - pourcentage de longueurs basé sur la taille de l'écran:

https://stanhub.com/how-to-make-div-element-100-height-of-browser-window-using-css-only /

  .forefront-element {
    -webkit-transform: translateZ(999px) scale(.7);
    transform: translateZ(999px) scale(.7);
    z-index: 1;
  }

  .base-element {
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
    z-index: 4;
  }

  .background-element {
    -webkit-transform: translateZ(-999px) scale(2);
    transform: translateZ(-999px) scale(2);
    z-index: 3;
  }

la vitesse de couche est contrôlée par un combinaison de la perspective et des valeurs de traduction de Z. Les éléments avec des valeurs négatives de Z se dérouleront plus lentement que ceux avec une valeur positive. Plus la valeur est à partir de 0, plus l'effet de parallaxe (c.-à-d. translateZ (- 10px) sera prononcé plus lentement que translateZ (- 1px)).

Voici une démo que j'ai trouvé avec une recherche google parce que je sais qu'Il ya beaucoup de non-croyants là-bas, Ne jamais dire impossible:

http://keithclark.co.uk/articles/pure-css-parallax-websites/demo3 /

45
répondu Neo 2016-06-10 12:31:42

vous pouvez utiliser quelque chose de simple comme ici: HTML:

Mouvement

css:

body {

  min-height:4000px;
  background-image: url("http://www.socialgalleryplugin.com/wp-content/uploads/2012/12/social-gallery-example-source-unknown-025.jpg");
}

h1 {margin-top:300px;}

js:

(function(){

  var parallax = document.querySelectorAll("body"),
      speed = 0.5;

  window.onscroll = function(){
    [].slice.call(parallax).forEach(function(el,i){

      var windowYOffset = window.pageYOffset,
          elBackgrounPos = "50% " + (windowYOffset * speed) + "px";

      el.style.backgroundPosition = elBackgrounPos;

    });
  };

})();

Voici jsfiddle

3
répondu Piotr Ciszewski 2017-10-08 21:12:12

conviennent que ce n'est pas possible seulement avec css, parce que vous devez calculer le rapport hauteur d'image et de document. J'aime aussi cet effet, c'est pourquoi j'ai créé une fonction simple qui fait exactement cela. Voici fonction et son appel sur l'événement de défilement:

$(window).on('scroll', function() {
	smoothBackgroundScroll("relative/image/url");
});

function smoothBackgroundScroll(imgsrc) {
	function loadImageHeight(url, width) {
		var img = new Image();
		img.src = url;
		if (width) {
			img.width = width;
		}
		return img.height;
	}

	var dh, wh, ih, st, posy, backh, backw;
	if (!this._smoothBackgroundScroll) {
		var bcksize = $(document.body).css('background-size');
		var bmatch = /(\w+)\s*(\w+)/.exec(bcksize);
		if (!bmatch || bmatch.length < 3) {
			backh = loadImageHeight(imgsrc)
		} else {
			backh = parseInt(bmatch[2]);
			if (isNaN(backh)) {
				backw = parseInt(bmatch[1]);
				backh = loadImageHeight(imgsrc, parseInt(backw));
			}
		}
		this._smoothBackgroundScroll = {
			dh: $(document).height()
			, wh: $(window).height()
			, ih: backh
		}
	}
	dh = this._smoothBackgroundScroll.dh;
	wh = this._smoothBackgroundScroll.wh
	ih = this._smoothBackgroundScroll.ih;
	st = $(document).scrollTop();
	posy = (dh - ih) * st / (dh - wh);
	document.body.style.backgroundPosition = 'center ' + posy + 'px';
}

vous pouvez le trouver ici avec l'exemple et l'explication visuelle ce qui se passe vraiment avec l'image et le document:

Lisse image d'arrière-plan défilement

2
répondu Vuk Djapic 2015-07-19 17:37:23

si vous voulez appliquer une image de fond haute, utilisez ce JS:

(function () {
        var body = document.body,
                e = document.documentElement,
                scrollPercent;
        $(window).unbind("scroll").scroll(function () {
            scrollPercent = 100 * $(window).scrollTop() / ($(document).height() - $(window).height());
            body.style.backgroundPosition = "0px " + scrollPercent + "%";
        });
})();
2
répondu Valentin Seehausen 2016-04-06 19:23:20

je me rends compte que c'est une vieille question, cependant, je suis récemment tombé sur ce problème moi-même et a passé beaucoup de temps à essayer de trouver le meilleur code de travail. Tout ce que j'ai trouvé était soit trop compliqué ou ne fonctionnait pas sans beaucoup de retard, surtout dans le Chrome. Comme d'autres l'ont souligné, le problème ne peut pas être résolu par CSS pur, mais j'ai fait ma propre directive AngularJS simple pour résoudre le problème:

app.directive("paraBack", ['$window', function ($window) {
  return function(scope, element, attrs) {
    element.css("background-image", "url("+attrs.paraBack+")"); // Apply the background image with CSS
    element.css("background-attachment", "fixed"); // Disable background scrolling

    var max = Infinity;

    var image = new Image(); // Create a JavaScript image so that the code below can be run when the background is loaded
    image.src = attrs.paraBack;
    image.onload = function () {
      max = image.height - window.innerHeight; // Stop scrolling after the bottom of the picture is reached
      var xOffset = -(image.width/2-window.innerWidth/2);
      element.css("background-position-x", xOffset+'px'); // Horizontally align the background
    }

    var scrollHandler = function () {
      var offset = Math.floor(this.pageYOffset*0.1); // Set background to scroll at 10% of scrolling speed
      if (offset<max) {
        element.css('background-position-y', '-'+offset+'px'); // If not the bottom of the image is reached, move the background (scroll)
      }
    };

    angular.element($window).on('scroll', scrollHandler); // Set the defined scrollHandler function to be ran when user scroll

    scope.$on('$destroy', function () {
      angular.element($window).off('scroll', scrollHandler); // Unbind the function when the scope is destroyed
    });
  };
}]);

il peut être utilisé dans le html comme ceci:

<body para-back="url/to/image">

si vous voulez voir un exemple de ce qu'il ressemble, vous pouvez visiter cette page .

1
répondu tjespe 2016-06-13 17:12:37