Nous considérons souvent les images d'arrière-plan comme une texture ou quelque chose qui offre un contraste pour un contenu lisible - en d'autres termes, pas vraiment du contenu. S'il s'agissait de contenu, vous chercheriez probablement un <img>
de toute façon, l'accessibilité et ainsi de suite.
Mais il y a des moments où le position or escaliers d'une image d'arrière-plan peut se situer quelque part entre les pôles du contenu et de la décoration. Le contexte est roi, non ? Si nous modifions la position de l'image d'arrière-plan, cela peut transmettre un peu plus de contexte ou d'expérience.
Comment? Regardons quelques exemples que j'ai vus flotter.
Au début, je préviens qu'il y a une ligne fine dans ces démos entre les images utilisées pour la décoration et les images utilisées comme contenu. La différence a des implications sur l'accessibilité lorsque les arrière-plans ne sont pas annoncés aux lecteurs d'écran. Si votre image est vraiment une image, alors peut-être envisager un <img>
étiquette avec le bon alt
texte. Et pendant que nous parlons d'accessibilité, c'est une bonne idée de tenir compte des préférences de mouvement d'un utilisateur également.
Montre m'en plus!
Chris Coyier a cette jolie petite démo datant de plusieurs années.
La démo est super pratique à bien des égards car c'est une approche intéressante pour afficher des publicités dans le contenu. Vous avez l'argumentaire de vente et une image alléchante pour le compléter.
La grande limite pour la plupart des publicités, je parierais, est le nombre limité de biens immobiliers. Je ne sais pas si vous avez déjà dû déposer une annonce sur une page, mais j'ai et je demande généralement à l'annonceur une image qui respecte les dimensions exactes en pixels, de sorte que l'élément s'adapte à l'espace.
Mais la démo de Chris atténue le problème d'espace. Survolez l'image et regardez-la bouger et se mettre à l'échelle. L'utilisateur obtient en fait PLUS contexte pour le produit qu'ils auraient lorsque l'image était dans sa position d'origine. C'est un gagnant-gagnant, non? L'annonceur peut créer une image accrocheuse sans compromettre le contexte. Pendant ce temps, l'utilisateur obtient une petite valeur supplémentaire des parties nouvellement révélées de l'image.
Si vous jetez un coup d'œil au balisage de la démo, vous remarquerez que c'est à peu près ce à quoi vous vous attendez. Voici une version abrégée :
<div class="ad-container"> <a href="#" target="_blank" rel="noopener"> <!-- Background image container --> <div class="ad-image"></div> </a> <div class="ad-content"> <!-- Content --> </div>
</div>
Nous pourrions probablement ergoter un peu sur la sémantique, mais ce n'est pas le sujet. Nous avons un conteneur avec un lien <div>
pour l'image de fond et une autre <div>
pour retenir le contenu.
En ce qui concerne le style, les pièces importantes sont ici :
.container { background-image: url("/path/to/some/image.png"); background-repeat: no-repeat; background-position: 0 0; height: 400px; width: 350px;
}
Pas mal, non ? Nous donnons au conteneur des dimensions et y définissons une image d'arrière-plan qui ne se répète pas et est positionnée par son bord inférieur gauche.
Le vrai truc est avec JavaScript. Nous allons l'utiliser pour obtenir la position de la souris et le décalage du conteneur, puis convertir cette valeur à une échelle appropriée pour définir le background-position
. D'abord, écoutons les mouvements de la souris sur le .container
élément:
let container = document.querySelector(".container");
container.addEventListener("mousemove", function(e) { // Our function }
);
De là, nous pouvons utiliser le conteneur offsetX
ainsi que offsetY
propriétés. Mais nous n'utiliserons pas ces valeurs directement, car la valeur de la coordonnée X est plus petite que ce dont nous avons besoin et la coordonnée Y est plus grande. Nous devrons jouer un peu pour trouver une constante que nous pouvons utiliser comme multiplicateur.
C'est un peu tactile, mais j'ai trouvé que 1.32
ainsi que 0.455
fonctionnent parfaitement pour les coordonnées X et Y, respectivement. Nous multiplions les décalages par ces valeurs, ajoutons un px
l'unité sur le résultat, puis l'appliquer à la background-position
valeurs.
let container = document.querySelector(".container");
container.addEventListener("mousemove", function(e) { container.style.backgroundPositionX = -e.offsetX * 1.32 + "px"; container.style.backgroundPositionY = -e.offsetY * 0.455 + "px"; }
);
Enfin, nous pouvons également réinitialiser les positions d'arrière-plan à l'original si l'utilisateur quitte le conteneur d'images.
container.addEventListener("mouseleave", function() { container.style.backgroundPosition = "0px 0px"; }
);
Puisque nous sommes sur CSS-Tricks, je proposerai que nous aurions pu en faire une version beaucoup moins chère avec une petite transition de survol en CSS vanille :
Peindre une image plus grande
Vous êtes sans aucun doute allé dans un magasin de vêtements en ligne ou autre et avez rencontré l'ancienne fonction de zoom en survol.
Ce modèle existe depuis ce qui semble être une éternité (Dylan Winn-Brown a partagé son approche retour à 2016), mais ce n'est qu'un témoignage (j'espère) de son utilité. L'utilisateur obtient plus de contexte lorsqu'il zoome et a une meilleure idée de la couture d'un pull ou de ce que vous avez.
Il y a deux éléments à cela : le récipient et par loupe. Le conteneur est la seule chose dont nous avons besoin dans le balisage, car nous injecterons l'élément loupe lors de l'interaction de l'utilisateur. Alors, voici notre HTML !
<div class="container"></div>
Dans le CSS, nous allons créer width
ainsi que height
variables pour stocker les dimensions du verre de la loupe elle-même. Alors nous donnerons ça .container
une forme et un background-image
:
:root {
--magnifer-width: 85;
--magnifer-height: 85;
} .container { width: 500px; height: 400px; background-size: cover; background-image: url("/path/to/image.png"); background-repeat: no-repeat; position: relative;
}
Il y a certaines choses que nous savons déjà sur la loupe avant même de la voir, et nous pouvons définir ces styles à l'avance, en particulier les variables précédemment définies pour le .maginifier
's width
ainsi que height
:
.magnifier { position: absolute; width: calc(var(--magnifer-width) * 1px);
height: calc(var(--magnifer-height) * 1px);
border: 3px solid #000;
cursor: none;
background-image: url("/path/to/image.png");
background-repeat: no-repeat;
}
C'est un petit carré absolument positionné qui utilise le même fichier d'image d'arrière-plan en tant que .container
. Notez que la fonction calc est uniquement utilisée ici pour convertir la valeur sans unité de la variable en pixels. N'hésitez pas à organiser cela comme bon vous semble pour éliminer les répétitions dans votre code.
Passons maintenant au JavaScript qui rassemble tout cela. Nous devons d'abord accéder à la variable CSS définie précédemment. Nous l'utiliserons à plusieurs endroits plus tard. Ensuite, nous devons obtenir la position de la souris dans le conteneur car c'est la valeur que nous utiliserons pour la position d'arrière-plan de la loupe.
// Get the css variables
let root = window.getComputedStyle(document.documentElement);
let magnifier_width = root.getPropertyValue("--magnifer-width");
let magnifier_height = root.getPropertyValue("--magnifer-height"); let container = document.querySelector(".container");
let rect = container.getBoundingClientRect();
let x = (e.pageX - rect.left);
let y = (e.pageY - rect.top); // Take page scrolling into account
x = x - window.pageXOffset;
y = y - window.pageYOffset;
Ce dont nous avons besoin, c'est essentiellement d'un mousemove
écouteur d'événement sur le .container
. Ensuite, nous utiliserons le event.pageX
or event.pageY
propriété pour obtenir la coordonnée X ou Y de la souris. Mais pour obtenir le exacte position relative de la souris sur un élément, nous devons soustraire la position de l'élément parent de la position de la souris que nous obtenons du JavaScript ci-dessus. Une façon "simple" de le faire est d'utiliser getBoundingClientRect()
, qui renvoie la taille d'un élément et sa position par rapport à la fenêtre.
Remarquez comment je prends en compte le défilement. S'il y a débordement, soustraire la fenêtre pageX
ainsi que pageY
les décalages garantiront que l'effet s'exécute comme prévu.
Nous allons d'abord créer la loupe div. Ensuite, nous allons créer un mousemove
fonction et ajoutez-la au conteneur d'image. Dans cette fonction, nous donnerons à la loupe un attribut de classe. Nous calculerons également la position de la souris et donnerons à la loupe les valeurs de gauche et du haut que nous avons calculées précédemment.
Allons de l'avant et construisons le magnifier
quand on entend un mousemove
événement sur le .container
:
// create the magnifier
let magnifier = document.createElement("div");
container.append(magnifier);
Nous devons maintenant nous assurer qu'il a un nom de classe que nous pouvons étendre au CSS :
// run the function on `mousemove`
container.addEventListener("mousemove", (e) => { magnifier.setAttribute("class", "magnifier");
}
L'exemple vidéo que j'ai montré précédemment positionne la loupe à l'extérieur du conteneur. Nous allons garder cela simple et le superposer au-dessus du conteneur à la place lorsque la souris se déplace. Nous utiliserons if
pour définir la position de la loupe uniquement si les valeurs X et Y sont plus grand or égal à zéro, et moins que la largeur ou la hauteur du conteneur. Cela devrait le maintenir dans les limites. Assurez-vous simplement de soustraire la largeur et la hauteur de la loupe des valeurs X et Y.
// Run the function on mouse move.
container.addEventListener("mousemove", (e) => { magnifier.setAttribute("class", "magnifier"); // Get mouse position let rect = container.getBoundingClientRect(); let x = (e.pageX - rect.left); let y = (e.pageY - rect.top); // Take page scrolling into account x = x - window.pageXOffset; y = y - window.pageYOffset; // Prevent magnifier from exiting the container // Then set top and left values of magnifier if (x >= 0 && x <= container.clientWidth - magnifier_width) { magnifier.style.left = x + "px"; } if (y >= 0 && y <= container.clientHeight - magnifier_height) { magnifier.style.top = y + "px"; }
});
Dernier point, mais non des moindres… nous devons jouer un peu avec l'image d'arrière-plan de la loupe. L'intérêt est que l'utilisateur obtient une vue PLUS GRANDE de l'image d'arrière-plan en fonction de l'endroit où le survol a lieu. Alors, définissons une loupe que nous pouvons utiliser pour agrandir les choses. Ensuite, nous définirons des variables pour la largeur et la hauteur de l'image d'arrière-plan afin d'avoir une base sur laquelle baser cette échelle, et définirons toutes ces valeurs sur le .magnifier
modes:
// Magnifier image configurations
let magnify = 2;
let imgWidth = 500;
let imgHeight = 400; magnifier.style.backgroundSize = imgWidth * magnify + "px " + imgHeight * magnify + "px";
Prenons les coordonnées X et Y de l'image de la loupe et appliquons-les à la .magnifier
l'élément background-position
. Comme précédemment avec la position de la loupe, nous devons soustraire la largeur et la hauteur de la loupe des valeurs X et Y à l'aide des variables CSS.
// the x and y positions of the magnifier image
let magnify_x = x * magnify + 15;
let magnify_y = y * magnify + 15; // set backgroundPosition for magnifier if it is within image
if ( x <= container.clientWidth - magnifier_width && y <= container.clientHeight - magnifier_height
) { magnifier.style.backgroundPosition = -magnify_x + "px " + -magnify_y + "px";
}
Tada!
Rendez-le cinématographique
Avez-vous vu la Effet Ken Burns? C'est une chose classique et intemporelle où une image est plus grande que le conteneur dans lequel elle se trouve, puis glisse et évolue lentement comme une limace. À peu près tous les films documentaires dans le monde semblent l'utiliser pour des images fixes. Si vous avez une Apple TV, vous l'avez certainement vue sur l'économiseur d'écran.
Il y a beaucoup of exemples sur CodePen si tu veux avoir une meilleure idée.
Vous verrez qu'il y a plusieurs façons d'aborder cela. Certains utilisent JavaScript. D'autres sont 100% CSS. Je suis sûr que les approches JavaScript sont bonnes pour certains cas d'utilisation, mais si l'objectif est simplement de redimensionner subtilement l'image, CSS est parfaitement adapté.
Nous pourrions pimenter un peu les choses en utilisant plusieurs arrière-plans plutôt qu'un seul. Ou, mieux encore, si nous étendons les règles pour utiliser des éléments au lieu d'images d'arrière-plan, nous pouvons appliquer la même animation à tous les arrière-plans et utiliser une touche de animation-delay
pour décaler l'effet.
Beaucoup de façons de le faire, bien sûr! Il peut certainement être optimisé avec des variables Sass et/ou CSS. Heck, peut-être que vous pouvez le retirer avec un seul <div>
Si oui, partagez-le dans les commentaires !
Bonus : rendez-le immersif
Je ne sais pas si quelque chose est plus cool que celui de Sarah Drasner Stylo "Joyeux Halloween"… et ça date de 2016 ! C'est un excellent exemple qui superpose les arrière-plans et les déplace à des vitesses variables pour créer une expérience presque cinématographique. Bon sang, c'est cool !
GSAP est le moteur principal, mais j'imagine que nous pourrions créer une version simplifiée qui traduit simplement chaque couche d'arrière-plan de gauche à droite à des vitesses différentes. Pas aussi cool, bien sûr, mais certainement l'expérience de base. Assurez-vous que le début et la fin de chaque image d'arrière-plan sont cohérents afin qu'ils se répètent de manière transparente lorsque l'animation se répète.
C'est tout pour le moment! Assez bien que nous puissions utiliser les arrière-plans pour bien plus que la texture et le contraste. Je suis absolument certain qu'il existe des tonnes d'autres interactions intelligentes que nous pouvons appliquer aux arrière-plans. Temani Afif a fait exactement cela avec un tas d'effets de survol soignés pour les liens. À quoi penses-tu? Partagez-le avec moi dans les commentaires !
- Contenu propulsé par le référencement et distribution de relations publiques. Soyez amplifié aujourd'hui.
- Platoblockchain. Intelligence métaverse Web3. Connaissance Amplifiée. Accéder ici.
- La source: https://css-tricks.com/moving-backgrounds/
- 1
- 11
- 7
- 9
- 98
- a
- A Propos
- au dessus de
- Absolute
- absolument
- accès
- accessibilité
- Compte
- actually
- Ad
- annonces
- devant
- Tous
- déjà
- ainsi que
- animation
- annoncé
- Une autre
- Apple
- Apple TV
- Appliquer
- une approche
- approches
- approprié
- autour
- atout
- RETOUR
- fond
- image de fond
- milieux
- Mal
- base
- basé
- Baseline
- En gros
- car
- before
- Améliorée
- jusqu'à XNUMX fois
- Big
- plus gros
- Bit
- frontière
- construire
- Bouquet
- calculer
- calculé
- cas
- Assurément
- Change
- moins chère
- classe
- classiques
- Vêtements
- code
- compromettre
- les configurations
- Considérer
- cohérent
- constant
- Contenant
- contenu
- contexte
- contraste
- convertir
- Freddi
- coordonner
- pourriez
- cours
- couverture
- engendrent
- CSS
- Tiret
- défini
- Démo
- Démos
- DID
- différence
- différent
- dimensions
- directement
- afficher
- document
- documentaire
- Ne fait pas
- Ne pas
- doute
- driver
- Goutte
- pendant
- chacun
- Plus tôt
- Edge
- effet
- les effets
- éléments
- l'élimination
- assurer
- biens
- Ether (ETH)
- Pourtant, la
- événement
- JAMAIS
- Chaque
- exactement
- exemple
- exemples
- Quitter
- Développer vous
- attendre
- attendu
- d'experience
- supplémentaire
- Accrocheur
- Fonctionnalité
- few
- Déposez votre dernière attestation
- Film
- Trouvez
- fin
- Prénom
- s'adapter
- flottant
- toujours
- trouvé
- gratuitement ici
- De
- fonction
- obtenez
- Donner
- en verre.
- Go
- objectif
- Goes
- Bien
- l'
- la taille
- ici
- appuyez en continu
- d'espérance
- flotter
- Comment
- Cependant
- HTML
- HTTPS
- MAUVAIS
- idée
- image
- satellite
- implications
- important
- in
- Dans d'autres
- plutôt ;
- l'interaction
- interactions
- aide
- IT
- lui-même
- JavaScript
- XNUMX éléments à
- King
- Savoir
- plus importantes
- couche
- poules pondeuses
- limitation
- limité
- Gamme
- peu
- Style
- Entrée
- a prendre une
- En attendant
- Se rencontre
- pourrait
- l'esprit
- PLUS
- (en fait, presque toutes)
- mouvement
- Bougez
- mouvements
- se déplace
- en mouvement
- plusieurs
- plusieurs arrière-plans
- prénom
- Soigné
- Besoin
- next
- nombre
- code
- compenser
- ONE
- en ligne
- optimisé
- original
- Autre
- Autres
- au contrôle
- Patron de Couture
- pièces
- Emplacement
- pixel
- Place
- Des endroits
- Platon
- Intelligence des données Platon
- PlatonDonnées
- Jouez
- Point
- position
- positionnée
- positions
- positif
- Méthode
- assez
- empêcher
- précédemment
- Probablement
- Produit
- correct
- propriétés
- propriété
- fournit
- RÉSERVES
- nous joindre
- lecteurs
- réal
- biens immobiliers
- répéter
- résultat
- Retours
- Révélé
- racine
- Courir
- vente
- même
- Toupet
- Escaliers intérieurs
- Balance
- portée
- pour écran
- lecteurs d'écran
- défilement
- de façon transparente
- semble
- sémantique
- set
- plusieurs
- Forme
- Partager
- commun
- devrait
- étapes
- simplement
- unique
- Taille
- Mules
- lent
- faibles
- So
- solide
- quelques
- quelque chose
- quelque part
- Space
- spécifiquement
- vitesses
- épice
- carré
- Commencer
- j'ai commencé
- déclarations
- Boutique
- Catégorie
- convient
- Super
- complément
- TAG
- Prenez
- prise
- parlant
- testament
- La
- le monde
- chose
- des choses
- Pense
- intemporel
- fois
- à
- ensemble
- tonnes
- top
- transition
- oui
- TOUR
- tv
- typiquement
- unité
- utilisé
- Utilisateur
- Plus-value
- Valeurs
- version
- Vidéo
- Voir
- Montres
- façons
- Quoi
- qui
- tout en
- Wikipédia
- sera
- dans les
- sans
- des mots
- activités principales
- world
- pourra
- X
- années
- Votre
- zéphyrnet
- zéro
- zoom