28112 sujets

CSS et mise en forme, CSS3

Bonjour à vous tous,

Je suis sur un projet à rendre à la fin de ma formation, fin novembre. Ce projet est basé sur des sites web que j'apprécie dans leur manière de présenter l'information comme, par exemple :
https://www.pinterest.fr/
https://imgur.com/gallery
https://www.designspiration.com/
https://photosdestars.com/star-213-Alice-Bela%C3%AFdi-page-1

Ces sites ont tous un point commun, ils affichent les informations sous forme de mosaïque de cartouches empilés.

Voici l'avancée de mon projet :

upload/1662138115-62242-capture0.jpg

Vous devez imaginer que les grosses lettres ne figureront pas dans le projet final et seront remplacées par des photos et des textes. La hauteur des photos variera tout comme la quantité de textes. C'est pour cette raison que les cartouches ont des hauteurs variables cependant ils auront tous la même largeur fixe.

Sur écran d'ordinateur de bureau, 4 colonnes s'affichent (voir capture écran au dessus). Sur un écran de smartphone, une seule colonne prendra toute la largeur de l'écran en mode portrait.

upload/1662139848-62242-capture3.jpg

Dans la capture écran d'ordinateur de bureau, vous remarquez que les cartouches sont alignés de gauche à droite et de haut en bas, c'est-à-dire :
A B C D
E F G H
I J K L
M N O P

J'ai choisi cet ordre et j'ai structuré ma page HTML, et mis en forme en CSS, en utilisant le display: grid; et les autres propriétés associées, de sorte que cela s'affiche de cette manière.

Cependant, sur un écran de smartphone, l'affichage est désordonné. C'est-à-dire qu'il suit l'ordre suivant :
A
E
I
M
B
F
J
N
etc.

upload/1662139564-62242-capture7.jpg
Ce que je voudrais obtenir comme affichage sur un écran de smartphone c'est l'ordre logique :
A
B
C
D
E
F
G
H
etc.

C'est un peu normal que je n'obtiennes pas un ordonne alphabétique normal sur un écran de smartphone parce que j'ai utilisé la propriété display: grid; 4 colonnes dans le conteneur <section> et la même propriété mais sur 1 colonne pour les enfants <article>. J'ai procédé ainsi pour pouvoir caler les cartouches les uns en dessous des autres, sans avoir un gros espace blanc en dessous des cartouches parce que ce n'est pas esthétique.

Donc, ma question est la suivante, est-ce que quelqu'un parmi vous sait s'il existe un moyen d'ordonner par ordre alphabétique normal les cartouches quand ils s'affichent sur un écran de smartphone ?

Merci pour votre sollicitude.

Voici le HTML :
<!DOCTYPE html>
<html lang="fr">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<meta name="viewport" content="width=500, initial-scale=1">
	<link href="styles.css" type="text/css" rel="stylesheet">
	<title>Display grid</title>
</head>
<body>
	<section class="colonnes4">
		<div class="colonne1">
			<article class="largeur_fixe hauteur1 couleur_de_fond"><h1>A</h1></article>
			<article class="largeur_fixe hauteur2 couleur_de_fond"><h1>E</h1></article>
			<article class="largeur_fixe hauteur3 couleur_de_fond"><h1>I</h1></article>
			<article class="largeur_fixe hauteur4 couleur_de_fond"><h1>M</h1></article>
		</div>
		<div class="colonne1">
			<article class="largeur_fixe hauteur5 couleur_de_fond"><h1>B</h1></article>
			<article class="largeur_fixe hauteur6 couleur_de_fond"><h1>F</h1></article>
			<article class="largeur_fixe hauteur7 couleur_de_fond"><h1>J</h1></article>
			<article class="largeur_fixe hauteur8 couleur_de_fond"><h1>N</h1></article>
		</div>
		<div class="colonne1">
			<article class="largeur_fixe hauteur3 couleur_de_fond"><h1>C</h1></article>
			<article class="largeur_fixe hauteur1 couleur_de_fond"><h1>G</h1></article>
			<article class="largeur_fixe hauteur5 couleur_de_fond"><h1>K</h1></article>
			<article class="largeur_fixe hauteur2 couleur_de_fond"><h1>O</h1></article>
		</div>
		<div class="colonne1">
			<article class="largeur_fixe hauteur4 couleur_de_fond"><h1>D</h1></article>
			<article class="largeur_fixe hauteur7 couleur_de_fond"><h1>H</h1></article>
			<article class="largeur_fixe hauteur5 couleur_de_fond"><h1>L</h1></article>
			<article class="largeur_fixe hauteur1 couleur_de_fond"><h1>P</h1></article>
		</div>
	</section>
</body>
</html>


Voici le CSS :
*{
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

body{
	background-color: #bfcccf;
	margin: 50px;
}

article{
	position: relative;
}

h1{
	position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}

.colonnes4{
	display: grid;
	grid-template-columns: 414px 414px 414px 414px;
	gap: 30px;
	justify-content: space-between;
}

.colonne1{
	display: grid;
	grid-template-columns: repeat(1, 1fr);
	gap: 30px;
	align-content: start;
}

h1{
	text-align: center;
	width: 50px;
	color: white;
	padding: 3px;
	background-color: #396373;
	font-size: 2em;
	margin: 0 auto;
	border-radius: 50px;
}

.largeur_fixe{max-width: 414px;}
.couleur_de_fond{background-color: #acbdc4;}
.hauteur1{height: 500px;}
.hauteur2{height: 200px;}
.hauteur3{height: 100px;}
.hauteur4{height: 300px;}
.hauteur5{height: 400px;}
.hauteur6{height: 250px;}
.hauteur7{height: 350px;}
.hauteur8{height: 450px;}

@media only screen and (min-device-width : 320px) and (max-device-width : 480px) {

}

@media only screen and (max-width: 700px) {
	.colonnes4{
		grid-template-columns: 100%;
		}
	.largeur_fixe{
		max-width: 100%;
		}
	body{
		margin: 0;
		}
}

@media only screen and (min-device-width : 820px) and (max-device-width : 1180px) and (orientation : landscape) {
	.colonnes4{
		grid-template-columns: 414px 414px 414px;
		}
	body{
		margin: 0;
		}
}

Modifié par ObiJuanKenobi (02 Sep 2022 - 19:35)
Salut. Le problème est mal posé : tu devrais d'abord partir du smartphone, puis surcharger tes règles pour obtenir une version desktop. On appelle cela le mobile first.

Pour ta problématique, l'effet recherché s'appelle "masonry", on ne peut pas le faire en CSS pur, il faut du JS, mais on peut quand-même le faire en CSS si l'on accepte un compromis. Je donne donc ici la solution en CSS pur avec le compromis de voir les images distribuées dans un ordre vertical et non horizontal. Il faut un seul conteneur parent, ensuite on passe les items en 1, 2, 3 ou 4 colonnes selon les définitions d'écran.

Voir ici : Responsive "pseudo" Masonry with CSS columns (CodePen).

J'utilise cette technique depuis longtemps, mais je l'aime sans plus car - outre ce que j'ai déjà dit pour la distribution verticale des items - la règle CSS columns, sur laquelle s'appuie cette solution, souffre d'énormes limitations sous Chrome (il s'agit d'effets d'ombres ou de pseudos-éléments rognés, certaines règles CSS, comme drop-shadow, peuvent créer des artfacts...). Dommage du coup, car il n'y a aucune limitation sous Firefox. Après, pour ton projet, normalement ça passe, tu ne devrais pas rencontrer de problème.

Sinon, pour la solution avec JS, je conseille de passer par une lib' : Masonry, Isotope, Packery, MiniMasonry, Macy.js... Certaines d'entre elles font le café, d'autres font le minimum syndical mais sont très légères.
Modifié par Olivier C (02 Sep 2022 - 23:23)
Merci Olivier mais ta solution est compliquée pour moi, je débute dans l'intégration et le développement.

Je ne comprends même pas la syntaxe de ce code HTML :
h1 Responsive "pseudo" Masonry with CSS columns
.intro
  p Browser compatibility, see 
    a(href='http://caniuse.com/#feat=multicolumn' target='_blank') Can I Use
    | .
.wrapper
  .masonry.gap
    - for (let i = 0; i < items.length; i++)
      div
        p= items[i]

pourquoi les balise h1, p et a ne sont pas écrites normalement ?
Et puis, la ligne de code JavaScript est également écrite bizarrement ?

Pour finir, je ne sais pas si ta solution répond à ma question qui est de savoir si on peut afficher les cartouches dans un ordre précis quand on est dans un affichage pour smartphone.
Modifié par ObiJuanKenobi (03 Sep 2022 - 06:59)
Parce que c'est écrit en Pug pour le HTML et en Stylus pour le CSS. Si tu veux le langage interprété, il faut soit utiliser ton inspecteur de navigateur, soit utiliser la petite roue crantée dans le menu du CodePen qui te propose d'interpréter le langage.
Je ne sais pas ce que c'est que le Pug et Stylus. C'est la première fois que j'entends parler des ces deux langages, si se sont des langages. Quel est l'intérêt d'utiliser d'autres langages ?
ObiJuanKenobi a écrit :
Quel est l'intérêt d'utiliser d'autres langages ?

La flemme...

Un codeur se reconnait par sa flemme ; il finit par trouver les outils qui lui conviennent pour coder moins et plus rapidement. Il se monte ainsi une stack d'outils pour lui faciliter la tâche. De toute façon, dans sa carrière, la stack de son équipe de dev' lui sera imposée.

Pug est un moteur de templates, il y en a des tonnes d'autres. Stylus est un préprocesseur CSS, le plus connu est SASS. Ces outils permettent d'écrire moins de code, beaucoup moins (et c'est nettement plus propre), ils permettent l'utilisation de variables, de fonctions, et bien d'autres choses encore. Ils apportent une dimension dynamique au projet. On peut les utiliser même en front.

Un codeur est curieux aussi. Tu t'es inscrit sur le forum depuis 2016, interviens régulièrement depuis deux ans et suis une formation depuis au moins six mois, pour autant, en regard de cette ancienneté, certaines notions courantes t'echappent. Je t'invite à ne surtout pas te contenter de ta formation actuelle. Tu dois creuser en marge de ce que tu apprends. Je ne dis pas qu'il faut tout maîtriser - qui le pourrait ? -, mais faire ce que l'on appelle de la "veille techno", savoir que tel ou tel concept ou type d'outils existent, même si tu ne t'en sers pas.

Et puis aussi : tu n'avais pas posté un sujet avec le même objet en 2020 ? : Comment imbriquer des blocs les uns sous les autres. Et en janvier 2022 ? : CSS3 grid layout. Les solutions que j'ai présenté plus haut étaient déjà présentes dans ces topics, et même plus encore.
Modifié par Olivier C (04 Sep 2022 - 08:03)
En effet, j'avais déjà posté en 2020 sur le sujet de la mosaïque de cartouches mais c'était pour résoudre un problème d'imbrication des cartouches les uns sous les autres. Depuis, j'ai trouvé la solution et pour ce nouveau poste c'est sur un autre problème : choisir l'ordre d'affichage des cartouches sur un écran smartphone, ce n'est pas du tout la même chose.

OK, il y a une foule de langages et d'outils différents mais je n'ai jamais entendu parler de Pug et de Stylus malgré ma veille quotidienne sur tout ce qui tourne autour du web.

Tu me parles de la roue dentelée dans le menu du Code Pen mais ne ne comprends pas comment mettre le HTML et CSS normaux. Tu peux me l'expliquer ?
À côté de la roue cranté pour pug par exemple, il y a une flèche bas, donc :
Flèche bas > View Compiled HTML

Sinon j'ai testé la solution déjà mentionnée par gcyrillus en réponse à ton post d'il y a deux ans sur le même sujet. Je viens de tester son idée avec un script trouvé sur le net, génial : Masonry with CSS Grid Layout & JavaScript.

Testé avec 600 items, le script mouline un peu mais Chrome ne plante pas.
Modifié par Olivier C (04 Sep 2022 - 22:28)
Modérateur
Bonjour/bonsoir à vous ,

Le problème de bug/ limitation de nombre de ligne (en grid) chez chrome avait été réglé il y a quelques temps déjà. Smiley smile

en m'inspirant de : https://codepen.io/gc-nomade/pen/pRYPwK j'ai modifier le pen https://codepen.io/gc-nomade/pen/GRqwwdg afin qu'il s'affiche en remplissant la grille colonnes par colonnes .

Pour le coup, je ne crois pas que cette option d'affichage est prévue dans les spec à venir, si jamais elles arrivent( rien vu ou découvert du coté de chrome non plus ).

la modif principale est sur l'ajout d'un pseudo qui s’étale au travers d'un certain nombre de row/ligne de la grille définie. là je fais en gros le total des lignes/hauteur des items divisé par 3 pour faire en gros 3 colonnes. en absorbant aussi grossièrement le gap de 10px. C'est lui qui détermine la hauteur de la grille minimale, puis elle se remplie. (si trop court, alors des colonnes supplémentaires s'ajoutent).

Cela reste une démo/POC , qui à besoin d'être fignolée sur les calculs , la démo reste approximative a coup de valeur arrondies et arrondies (31 au lieu de 33.33 par exemple) mais démontre bien le fonctionnement de l'affichage colonne par colonne. Le pen dont je me suis inspirer est probablement plus facile à appréhender pour comprendre le fonctionnement (pas de cellules qui [i]spannent plusieurs lignes)[/i]

Comme je le disais il y a deux ans, pour l'instant le script MASONRY reste encore la solution la plus fiable et facile à mettre en œuvre à mon humble avis https://masonry.desandro.com/layout.html

cdt
Modifié par gcyrillus (07 Sep 2022 - 12:15)