28172 sujets

CSS et mise en forme, CSS3

Bonjour!

Une merveilleuse année à tous!

Ne faites pas trop d'ordi et faites en en bonne ergonomie! Faites des pauses et ayez une vie sociale et sportive!

Voici la question qui m'amène sur le forum:

- J'ai un conteneur div (le main d'un site wordpress) width:100% (dépend donc des résolutions user)
- à l'intérieur j'affiche des divs ( liens de profils de membres contenant 1 photo et 3 lignes de texte). Ces divs doivent faire un minimum de pixels pour afficher le contenu correctement.

Mon objectif est que ces divs forment une grille qui:
- remplisse à 100% la largeur du main div
- respecte le min-width des divs

Pour l'instant j'ai:

profilsdivs {
	min-width : 350px;
	width:33%;
	height: 250px;
	float:left; }


Du coup j'ai 3 profilsdivs obligatoire par ligne via width:33%; . ça me permet de remplir le main à 100% mais ce n'est pas flexible! L'idéal serait qu'il puisse y avoir 4 ou 5 profilsdivs si la résolution user le permet.

il faudrait que la largeur des profilsdivs soit comprise entre un min-width et un max-width ce qui permettrait de calculer un nombre de profilsdivs par ligne dans le maindiv en fonction de la résolution user. Ou bien utiliser des marges qui s'adaptent entre les divs (j'ai essayé des margin auto, ça ne marche pas que les divs soient float ou bien inline-block)

Peut on faire cela sans utiliser javascript (que je ne connais pas du tout!). Est ce que cette propriété "flex" présentée dans les news pourrait le faire?

edit : je pense qu'il pfaut que j'essai un flex comme ceci:


.container {
    display: flex;
    flex-flow: row wrap;
justify-content:space-between;
}

.divsprofil {
flex: 1;
min-width:350px /*ou flex-basis:350px ?*/
}



Merci de votre aide!

Thomas
Modifié par thomascz (01 Jan 2015 - 12:19)
Salut,

J'ai honte mais je ne me suis pas encore penché sur flexbox mais effectivement, il me semble que cela pourrait résoudre ton problème.

Sinon une autre solution :
Si tes div font 33% du conteneur et que tu met un min-width à 350px ça veut dire que quand le conteneur fera 350*3 (+les marges) alors tes div auront atteins leur largeur minimal. Du coup, tu peux via media queries spécifier une autre largeur pour tes div (genre 50% et min-width: 500px (par exemple)).

PS : quand tu dis "J'ai un conteneur div (le main d'un site wordpress) width:100% (dépend donc des résolutions user)" sache qu'un div occupera toujours la largeur maximal de son parent donc un width:100% ne sert à rien, et pire peut devenir problématique si tu ne passe pas par du box-sizing)

Merveilleuse année à toi.
Merci Gili pour la réponse et l'astuce pour les cas de largeur inférieur à 3 fois 350 px! (et pour l'info sur le width:100% du conteneur!

Alors voici quelques essai avec flex si ça peut aider qqun:

avec un flex-grow:1:

http://jsfiddle.net/thomascz/2cLajqb8/2/

C'est pas mal mais les item de la dernière ligne n'ont pas la même largeur selon leur nombre.

sans flex grow et avec justify-content: space-between;
http://jsfiddle.net/thomascz/eby76ybn/4/

C'est pas mal du tout ! sauf peut être les items de la dernière ligne qui ne float pas à gauche mais se répartissent. En tout cas ça ressemble à ce que je voulais, une sorte de float gauche avec des marges automatique pour remplir harmonieusement un container!

Si qqun propose mieux en css, merci de poster!
Modifié par thomascz (01 Jan 2015 - 12:56)
Gili a écrit :
As-tu jeté un oeil sur ce site ? http://jackintheflexbox.tumblr.com/ . Il me semble que l'article "Du Responsive design sans Media Queries" réponde à ta problématique non ?


Oula, ça c'est du niveau! je vais m'y pencher! merci pour le lien

a priori j'arrive pas à faire augmenter/diminuer le nombre de cellule/item par ligne ne modifiant la résolution. ça zoom/dezoom.
Modifié par thomascz (01 Jan 2015 - 13:04)
thomascz a écrit :
a priori j'arrive pas à faire augmenter/diminuer le nombre de cellule/item par ligne ne modifiant la résolution. ça zoom/dezoom.

Qu'est-ce qui zoom/dézoom ? l'interface ? quand tu testes ici http://codepen.io/raphaelgoetter/pen/GgZLKq?editors=110 ce n'est pas exactement le comportement que tu souhaites ? Car ici je ne vois pas de zoom/dézoom.

Sinon si tu maitrises pas flexbox tu peux passer par la solution que je t'ai spécifiée plus haut Smiley smile
ah ok j'avais pas regardé au bon endroit, merci pour le lien!

c'est une solution sympa, même si la dernière ligne d'item peut avoir des tailles et alignement non souhaitables. c'est la même que j'avais faites ici : http://jsfiddle.net/thomascz/2cLajqb8/2/

je vais essayer de jouer un peu avec les options pour trouver le meilleur
Administrateur
Bonsoir Thomas,

Ton JSfiddle regroupe bien toutes les contraintes que tu t'es données ;
- les éléments peuvent s'agrandir (flex: 1)
- les éléments ne peuvent pas se réduire sous 100px (flex-basis ou min-min seront équivalent ici)

Il ne me semble malheureusement pas possible de cibler la dernière ligne d'éléments pour leur indiquer un comportement contraire. Smiley decu
@Raphael et Gili

Merci pour les infos,

Au final je suis passé par un media query car je ne voulais pas que les derniers div (dernière ligne) ne possède pas la même largeur. Merci pour la suggestion des media query.