28172 sujets

CSS et mise en forme, CSS3

Bonjour !

J'aimerais savoir comment on peut créer une page "responsive" et qui soit découpée en diagonale, avec une vidéo d'un côté de la découpe et autre chose de l'autre côté… Genre ceci : http://lafilledo.com

J'ai essayé de lire le code mais je n'ai pas vraiment trouvé LE truc dans le html ni le css.

Merci à vous pour votre aide et vos conseils !!

Trucmuche
salut,
faut croire que la vidéo peut distraire ^^. Restons sérieux quand même. C'est relativement simple à faire mais il faut s'accrocher et ne pas perdre le fil.
Il faut déjà savoir que ça me paraît assez dur à réaliser sans passer par JS. Pour arriver donc au résultat que tu souhaites, l'idée est de prendre un élément qui engloberait ta vidéo, de lui faire subir une rotation puis d'appliquer une rotation inverse à la vidéo pour annuler celle de son parent. Il suffirait ensuite de masquer ce qui dépasse et le tour est joué.

upload/49848-1.png upload/49848-2.png upload/49848-3.png upload/49848-4.png upload/49848-5.png

---------------------------------------------------------------------------------------------------------------------------

upload/49848-2-b.png upload/49848-2-c.png upload/49848-2-d.png upload/49848-3-b.png

La première problématique qui se pose est de trouver les bonnes dimensions de l'élément qui engloberait ta vidéo, de telle sorte à ce qu'il couvre toujours toute la surface de son parent (comme sur l'image 2). En sachant qu'on partira sur une rotation de 45deg de cet élément, en décomposant la figure formée (toujours dans l'image 2), on retrouvera à chaque fois des triangles isocèles rectangles qui déborderont du conteneur parent. En voyant aussi (sur l'image 2-b) que l'un des côtés du triangle (1) est la hauteur que l'on recherche et que l'un des côtés du triangle (2) additionné à l'un des côtés du triangle (1) est la largeur, on peut facilement retrouver nos dimensions.
J'ai choisi de décaler cet élément à droite de 12% de la largeur de son conteneur (right:12%), le reste qui vaut donc 88% de la largeur est l’hypoténuse du triangle (1). La hauteur du PARENT de l'élément est donc l’hypoténuse du triangle (2). Les formules qui en découlent sont alors faciles :

hauteur = racine[(0.88 * largeurParent)² / 2]
largeur = racine(hauteurParent² / 2) + hauteur

Maintenant qu'on a nos dimensions, il faut savoir bien les utiliser en procédant à la rotation à partir du bon endroit (image 2-d) ("transform-origin:100% 100%") dans le sens antihoraire (-45deg). On remonte ensuite cet élément de 100% de sa hauteur et c'est fait.


Reste l'élément enfant de ce dernier qui a aussi subit la rotation de son parent à ajuster. Il faut dans un premier temps lui faire subir une rotation inverse (+45deg) mais à partir du point d'origine 0 0 ("transform-origin:0 0"), puis le décaler à gauche d'une distance que l'on a déjà calculé (image 3-b). On lui donne ensuite une largeur de 88% pour qu'il ait les dimensions correctes auxquelles on s'attendait (image 3) et pouf ça fait des chocapics !


Le premier élément à qui on a fait subir la rotation sera en position absolue avec un z-index supérieur à ce qu'on appellera "contenu" pour qu'il puisse le recouvrir. On ajoute un "overflow:hidden" pour masquer tout ce qui dépasse et obtient ce que l'on souhaite.


Il faut ensuite ajuster à chaque redimensionnement la vidéo pour qu'elle ne laisse pas de vide et on arrive à ton résultat.


Voici grosso modo un exemple (qui bug un peu en ligne mais il suffit de le copier) qui ne marchera cependant pas sur IE8 même s'il est possible de le faire fonctionner (ça sera juste très long franchement chiant).
Si le lien ne se déclenche pas, il faut redimensionner la fenêtre (c'est juste en ligne je ne sais pas pourquoi ça fait ça).
waw waw waw waw waw !! Ben dis donc… je n'y serais jamais arrivé tout seul, cela me paraît assez évident ! Mais tes explications sont hyperclaires et j'ai appris plein de choses !
Je vais un peu mettre cela en pratique et voir si je ne rencontre pas de souci particulier Smiley smile

En tout cas, grand grand merci pour ta réponse et le temps que tu as mis à m'aider, c'est vraiment super gentil !
Je t'en prie. Si tu as des questions tu dis. J'ai laissé un lien pour un truc "tout fait". Tu devrais cependant le copier directement sur ton pc et l'enregistrer dans un fichier pour mieux voir la chose.
Zelalsan a écrit :
Je t'en prie. Si tu as des questions tu dis. J'ai laissé un lien pour un truc "tout fait". Tu devrais cependant le copier directement sur ton pc et l'enregistrer dans un fichier pour mieux voir la chose.


Bonjour et merci également pour l'aide que tu as apporté car je suis également intéressé par cette manip pour refaire une home page de portfolio avec écran splités en diagonale, mais pas forcement avec de la vidéo pour l'instant juste des moitiés d'écran cliquable !

Du coup, galérant comme pas permis sur cet effet, j'ai voulu essayer le code que tu as donné, mais il semblerait qu'il ne fonctionne pas ( ou plus )....

J'entend bien la musique de la vidéo, vidéo qui fonctionne si on l'ouvre via l'url, le background s'adapte en responsive, mais par contre la vidéo ne s'affiche pas ni dans un triangle ni sur la page est-ce normal ?

merci d'avance !
salut eter,
comme j'ai expliqué, le lien semble buger en ligne,il suffit juste de redimensionner la fenêtre pour que ça marche.
Le mieux encore serait de copier le code et de l'enregistrer sur ton pc.
Zelalsan a écrit :
salut eter,
comme j'ai expliqué, le lien semble buger en ligne,il suffit juste de redimensionner la fenêtre pour que ça marche.
Le mieux encore serait de copier le code et de l'enregistrer sur ton pc.


c'est ce que j'ai fait, j'ai copié manuellement chaque partie de code html,css et js dans un fichier html 5 de deamweaver mais j'ai le même résultat que sur la preview du site :s
Je ne vais pas te mentir je n'utilise pas Dreamweaver et je ne sais donc pas ce que ça donnerait mais quand je parlais de fichier c'était plus dans ce genre.
Si tu copies/colles ce code, ça marchera.

<!DOCTYPE html> 
<!-- saved from url=(0014)about:internet -->
<html lang="fr-FR">
	<head>
		<meta charset="utf-8" />
		<title>Titre de la page</title>
		<style type="text/css">
			html, body {height:100%;margin:0;background:#000;}
			#wrapper {overflow:hidden;position:relative;height:100%;}
			#videoContainer {overflow:hidden;position:absolute;right:12%;background:#000;box-shadow:0 0 25px 5px #000;z-index:10;}
			#videoContainer {-moz-transform-origin:100% 100%;-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;-o-transform-origin:100% 100%;transform-origin:100% 100%;}
			#videoContainer {-moz-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);}
			#videoContainer div {position:absolute;}
			#videoContainer div {-moz-transform-origin:0 0;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;-o-transform-origin:0 0;transform-origin:0 0;}
			#videoContainer div {-moz-transform:rotate(45deg);-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);}
			#videoContainer video {}

			#content {position:absolute;width:100%;height:100%;top:0;left:0;}
			#content {background:url(http://www.clipart-fr.com/data/wallpaper/Serie_001/fond_ecran_wallpaper_serie_00027.jpg) no-repeat;background-size:100% 100%;}
		</style>
	</head>	
	<body>
		<div id="wrapper">
			<div id="videoContainer">
				<div>
					<video src="http://lafilledo.com/media/newhomepage/video/movie2.webm" autoplay loop></video>
				</div>
			</div>
			<div id="content">
			</div>
		</div>
		<script type="text/javascript">
			function racine(x){return Math.sqrt(x);}
			function carre(x){return Math.pow(x, 2);}
			
			var videoCont = document.getElementById("videoContainer"),
				videoWrap = document.querySelector("#videoContainer div"),
				video = document.querySelector("#videoContainer video"),
				content = document.getElementById("content");
			
			
			var	videoRatio,
				trueBgWidth = 1600,
				trueBgHeight = 1200,
				bgRatio = trueBgHeight / trueBgWidth;
			
			function videoDatas() {
				videoRatio = video.videoHeight / video.videoWidth;
			}
			
			function setSizes(){
				var parentWidth = videoCont.parentNode.offsetWidth,
					parentHeight = videoCont.parentNode.offsetHeight,
					rest = racine(carre(parentHeight) / 2),
					wrapHeight = racine(carre(.88 * parentWidth) / 2),
					wrapWidth = rest + wrapHeight;
			
				videoCont.style.width = wrapWidth + "px";
				videoCont.style.height = wrapHeight + "px";
				videoCont.style.top = "-" + wrapHeight +"px";
				
				videoWrap.style.width = (.88 * parentWidth) + "px";
				videoWrap.style.height = parentHeight + "px";
				videoWrap.style.left = rest + "px";
				
				video.style.height = parentHeight + "px";
				video.style.left = "-" + (.88 * parentWidth) + "px";
				
				if (video.offsetWidth < parentWidth) {
					video.style.height = (parentWidth * videoRatio) + "px";
				}
				
				content.style.backgroundSize = "auto " + parentHeight + "px";
				
				if (parentHeight / bgRatio < parentWidth) {
					content.style.backgroundSize = "auto " + (parentWidth * bgRatio) + "px";
				}
			}
			
			
			video.addEventListener("loadeddata", videoDatas, false);
			window.addEventListener("resize", setSizes, false);
			window.addEventListener("load", setSizes, false);		
		</script>
	</body>
</html>
Oh ! Super ! là ça fonctionne à merveille !!!

Merci infiniment Zelalsan ! Smiley prie
Modifié par eter (17 Nov 2013 - 16:32)