Pages :
Bonjours à toutes et tous

Voilà un sujet qui a fait couler beaucoup d’encre parce qu’il est coriace: les fameux coins arrondis. J’ai essayé je crois toutes les solutions possibles, les div imbriquées, des bidouilles avec les différentes balises, et le niftycube. Mais aucune jusque là ne m’a convaincu, les div imbriqués, si les cadres sont extensibles, ça fait quand même 3div de plus par block et c’est super lourd à maintenir, il suffit d'en effacer une et tout votre site par en vrille. moz-radius pour firefox + NiftyCube pour IE, c’est pas mal mais il y a toujours un moment ou NiftyCube à des comportements étranges.

Un beau jour enfin je suis tombé sur cet article:
http://www.sitepoint.com/article/rounded-corners-css-javascript de Simon Willison (qui écrit d’ailleurs de supers articles pour ceux qui veulent utiliser javascript intelligemment) et là ce fut la lumière. En fait c’est un petit script qui crée 4 div imbriquées pour le prix d’une, chacune avec ça class, du coup il suffit de mettre un petit gif rond pour chacun de coins et le tour et joué.

Le javascript:


function roundedCorners() {
var divs = document.getElementsByTagName('div');

var rounded = [];

for (var ii = 0; ii < divs.length; ii++) {
if (/\brounded\b/.exec(divs[ii].className)) {
rounded[rounded.length] = divs[ii];}}

for (var ii = 0; ii < rounded.length; ii++) {
var original = rounded[ii];
original.className = original.className.replace('rounded', 'corners_bl');
var tr = document.createElement('div');
tr.className = ' corners_tr';
original.parentNode.replaceChild(tr, original);
var tl = document.createElement('div');
tl.className = 'corners_tl';
var br = document.createElement('div');
br.className = ' corners_br';
tr.appendChild(tl);
tl.appendChild(br);
br.appendChild(original);}
}


le css:



.rounded, .corners_tr {#color};

.corners_tr {background-image: url(corner/tr.gif);
background-repeat:no-repeat;
background-position: top right;}
.corners_bl {background: url(corner/bl.gif) no-repeat bottom left;}
.corners_tl {background: url(corner/tl.gif) no-repeat top left;}
.corners_br {background: url(corner/br.gif) no-repeat bottom right;}



Et le plus beau le html:



<div class="rounded">content</div>



Il y trois points qui me plaisent beaucoup dans cette solution:

le premier c’est que il y a rien à rajouter dans le code html

le deuxieme c’est que sachant que dans le futur on aurat des proprietées css3 background-image-left qui permettrons de mettre des images dans chaque coins, ça reprend la même logique, du coup on peut faire autres chose que des coins arrondis, par exemple des coins dégradés, bisotés ou avec des fleurs et arabesques, c'est un peu comme une avant-premiére.

le dernier point c’est que l’on peut ecrire la feuille de style de tel maniére que sans le javascript ça soit juste carré sans autre probléme particulier. Bref comme je trouve ça génial je voudrais savoir si d’autres partagent mon emerveillement ou si depuis le temps que je me prend la tête avec les coins arrondis, je suis passé à coté d’un solution encore plus simple.

Si vous voulez voir un exemple vous pouvez voir sur cette page
http://www.floreslibres.org/-Quienes-somos-.html

Pour ce site en question ce n’est pas forcement justifier car le design n’est pas flexible pour l’instant, comme avant j’utiliser des divs imbriqués je m’était simplifier la vie. Avec la sortie de tout ces merveilleux nouveaux écrans de 1400px, je trouve que faire des designs flexibles reprend tout son sens, donc je crois que je vais abuser de cette solution (à moins que l’un d’entre vous me décourage definitivement).
Merci d’avoir eu la patience de lire jusque là et de vos avis éclairés

Note:si vous copier le javascript il faut enlever les * des [i*] (bbcode Smiley langue )

EDIT par Felipe: plus la peine, j'ai remplacé i par ii
Modifié par Felipe (09 Nov 2006 - 10:54)
Salut MatMat,
Merci pour ce script merveileux qui, si il marche, pourrai me faciliter la life.
Ya-t-il autre chose que les * à modifier pour que le script fonctionne?
J'ai mes 4 coins tr, br, bl et tl dans un dossier corner mai rien ne se passe?
Peux-tu m'éclairer encore un peu?
merci Smiley cligne
Bonjour.
fanouchka a écrit :
Salut MatMat,
Ya-t-il autre chose que les * à modifier pour que le script fonctionne?
Smiley cligne


Il ne faut pas oublier de lancer la fonction au chargement de la page (body onload, par exemple...)
Salut,

Je ne saisis pas vraiment l'intérêt d'un tel script, qui n'a à mon sens d'autres réalités que d'alourdir la page inutilement.
Les méthodes évoquées dans les liens proposés dans les précédentes réponses me semblent bien plus adaptées et permettent tout autant de fantaisie graphique.
De plus, les utilisateurs comme moi qui n'ont que de maigres connaissances en javascript, préfèreront sans douter utiliser quelque chose de plus accesible, donc maîtrisable et modifiable à souhait.
Modifié par Mikachu (09 Nov 2006 - 12:02)
Salut,
le désavantage du truc, à mon sens:

JS activé -> Beau
JS desactivé -> Pas Beau

Pour au final, un JS qui va faire exactement la même chose que ce qu'on peut coder directement, en dur, un poids supplémentaire (toute une page de script, c'est plus lourd que quelque div en plus), et si le visiteur à un PC un peu mollasson, ou qui tourne à bloc, l'effet d'"apparition du design", des plus pourraves (pur avis perso)

Vive l'imbrication ultime!!
a écrit :
ça c'est le html natif, si on regarde le html généré par js ça reste une fichue imbrication de div complètement inutiles

Personne ne le voit le js, donc ça pose pas de probléme comme quand les divs sont dans le html. Tes solutions sont super dans certains cas mais dans d'autre elles ne s'adaptent pas, par exemple si tu n'as pas de titre sur ton menu, ou si tu utilise un cms donc que tu ne peux pas mettre une class au dernier paragraphe de ton texte.

a écrit :
Je ne saisis pas vraiment l'intérêt d'un tel script, qui n'a à mon sens d'autres réalités que d'alourdir la page inutilement.

Je ne crois pas que ça alourdisse la page, dans un cas tu as trois div en plus par block et dans l'autre cas tu as un script pour tout les blocks. C'est donc une question de mesure, si tu as un seul block dans ta page, je suis d'accord qu'il vaut mieux le faire avec des balises, mais si tu en as plein il me semble celon les tests que j'ai fait que c'est plus rapide comme ça. Dans l'exemple que je donne c'est pas completement justifier, mais j'en ai d'autres en preparation ou je doit avoir au total 20 div en plus sur ma page à cause de ces fichus coins arrondis.
Enfin une autre chose je ne sais pas pourquoi mais quand il y a plein de balise dans une page, les naviguateur galére plus pour afficher les sites qu'un javascript. Le javascript crée les divs plus rapidement que le html

a écrit :

et si le visiteur à un PC un peu mollasson, ou qui tourne à bloc, l'effet d'"apparition du design", des plus pourraves (pur avis perso)

ça c'est une bonne question, faire un bon design ok, mais comment il apparait ça joue aussi dans l'effet final, tout à fait d'accord. Par contre je trouve ça plus pourave le naviguateur qui peine à afficher les divs avec leur background ou "un coup un coin par ci un coup un coin par là", là ça arrondi tout à la fin d'un coup. Par contre effectivement pour un meilleur effet il faut bien régler la class du style initial et celle des styles créé par le javascript pour qu'il n'y est pas de sauts ( sur l'exemple ya un petit saut )

a écrit :
JS activé -> Beau
JS desactivé -> Pas Beau

Aujourd'hui de toute façon quand tu as js desactivé c'est vraiment pas le plus gros probléme que tu as quand tu navigues, en plus je sais pas si tu as essayé de desactiver js sur la page mais c'est pas moche, c'est juste carré.

Je vois que ma solution ne fait pas fureur, c'est vrai que c'est une question de mesure, si c'est juste pour un menu qui a un titre, c'est mieux de le concevoir avec les balises hn et les div (je connaissais ces exemples) mais si c'est pour un design géneral je crois que la solution reste pas mal. Si vous regardez les boutons du haut ( la taille de police et les langues ) ce sont des coins arrondis avec des listes et juste une span en plus, dans ce cas là c'est sur il y pas besoin de js.

En tout cas merci de vos reponses
Modifié par matmat (09 Nov 2006 - 16:49)
fanouchka effectivement il faut lancer la fonction dans le script il faut ajouter:

window.onload = roundedCorners; 


Ce n'est pas un script comme genre plugandplay comme NiftyCube, il faut connaitre un peu le DOM pour pouvoir faire des modifs celon les cas, je préfére te prevenir avant que tu te prennnes la tête sans resultat. Par contre à ta disposition pour t'aider si tu veux persévérer avec cette solution.
Salut,


a écrit :
Enfin une autre chose je ne sais pas pourquoi mais quand il y a plein de balise dans une page, les naviguateur galére plus pour afficher les sites qu'un javascript. Le javascript crée les divs plus rapidement que le html

Enfin tu ne me feras pas croire que rajouter une ou deux balises (si elles sont nécessaire, ce qui ne sera pas forcément le cas) pèse moins lourd que ton javascript. Pour la même opération tu rajoute l'étape de lecture du javascript pour créer des balises inutiles...

Je ne fais qu'exposer mon avis, mais ta solution me semble lourde pour ce qu'elle est censée produire, les moyens d'alourdir une page sont toujours pléthore, mais ceux pour les réduire sont simples et jamais appliqués... et au final c'est l'internaute -le principal intéressé- qui attend devant son navigateur.
Perso je continuerai à penser mes designs pour essayer d'éviter de l'alourdir avec du code quand il y'a moyen de faire plus simple, et de préserver le graphisme de mon site que le javascript soit activé ou non !
Ma reflexion sur le poid par du calcul suivant, si tu as au total 20 divs de plus sur ta page pour des coins arrondis ( ce qui peut arrivé ) c'est plus lourd à charger que le js. Dans un cas le navigateur lit vite la page puis il rajoute l'effet en question à la fin, dans l'autre il affiche péniblement les divs une à une. C'est toujours un question de mesure et c'est a voir au cas par cas. Regarde par exemple cette page ( je voulais pas mettre cet exemple parceque c'est en construction mais tant pis, j'actualiserai aprés) :
http://www.smart-com.com.mx/sinuscenter/spip.php?lang=es, c'est que des divs imbriquées, plein de div, dans ce cas par exemple je crois que ce serat trés utile. J'ai en plus la contrainte que c'est construit avec un cms donc c'est toujours plus pratique de garder un code clair. Ce qui est sur c'est que la meilleur solution c'est de ne jamais envoyer à ces clients des supers designs fait avec illustrator avec plein de coins arrondis...
Modifié par matmat (09 Nov 2006 - 17:35)
matmat a écrit :
ça c'est le html natif, si on regarde le html généré par js ça reste une fichue imbrication de div complètement inutiles

Personne ne le voit le js, donc ça pose pas de probléme comme quand les divs sont dans le html.

Ah bon ?

Eh bien prouve le et dis nous exactement en quoi !!!

matmat a écrit :
Tes solutions sont super dans certains cas mais dans d'autre elles ne s'adaptent pas, par exemple si tu n'as pas de titre sur ton menu, ou si tu utilise un cms donc que tu ne peux pas mettre une class au dernier paragraphe de ton texte.


La question de savoir comment les css peuvent s'appuyer sur une source html pré existante nécessite un travail pour comprendre comment le document html lui même est / peut être / doit être organisé. Evidemment c'est un travail et cela demande donc un effort !

concernant les titres sur menu j'en dis un mot ici :
http://www.clb56.fr/test_css/test_4bordures/
Moi même a écrit :

Du point de vue de la forme de la structuration html (oui je sais, c'est de la provo... Smiley smile ...), la question n'est pas de savoir si on a ce type de forme dans notre code source mais bien de savoir dans quelle perception du document on peut bien être enfermé pour que cette forme ne soit pas présente.

<edit>
Ah et en plus pas de chance, si pour le malheur de ta structuration html il n'y a pas de titre annonçant ta section de menu alors c'est très très très simple !!! On met une class="first_element" au 1er item dudit menu !!!

comme quoi ya de la ressource...

Je l'ai déjà dit quelque part et je le répète : la divite est avant tout un oubli, quand ce n'est pas une négation complète, du document html réel.
</edit>

La question du contenu généré est sérieuse, mais cela reste une question... Donc quelque chose qui a peut être une réponse pour autant qu'on se donne le mal de la chercher. Mais évidemment là aussi c'est un travail et cela demande encore un effort !

Il est tellement plus facile de s'embarquer dans une profusion d'imbrications de div ou d'éléments vides. Là on ne risque pas de faire d'effort, de chercher et bien sur de trouver non plus.

PS :
Dans un contexte très différent certes de contenu généré il se trouve que j'ai pour ma part réussi à produire cette class="last_element". C'est à voir ici :
http://www.clb56.fr/test_php_js/playlist_dewplayer/ (c'est en fin de document)
et toc Smiley langue
Modifié par clb56 (09 Nov 2006 - 18:16)
coccimaster a écrit :
Salut,
le désavantage du truc, à mon sens:

JS activé -> Beau
JS desactivé -> Pas Beau



Cet argument n'a strictement aucune valeur !

La question de l'inactivité de javascript est celle de l'accès au contenu et rien d'autre.
Je crois que tu es un peu dur avec moi quand tu dis que je choisis la facilité, sincérement le DOM c'est pas toujours de la tarte! Quand tu fais un site tu as plein de paramétre qui rentre en jeu un de ces paramétres c'est aussi la santé mentale du webmaster, c'est a dire que quand je revient trois mois aprés sur un site et il faut que je me souvienne de la fonction php qui génere la class de mon dernier paragraphe (ce qui est tout à fait possible, comme tu l'as prouvé) pour moi c'est trop. Ce que je veux dire c'est que de plus en plus j'aime bien la simplicité d'un code, mais aussi la simplicité de conception et de maintenance. Dans un cas, j'ai une class "rounded" et je sais qu'elle arrondi et voilà, dans l'autre j'ai un block avec un bout d'image, un titre avec un bout d'image, deux div en bas avec d'autre bout d'image, et je fini par m'y perdre. Regarde le deuxiéme exemple qui est sans doute simplifiable bien sur avec tes solutions, mais je crois quand même que ce serat plus simple avec js.
Modifié par matmat (09 Nov 2006 - 17:54)
matmat a écrit :
Je crois que tu es un peu dur avec moi quand tu dis que je choisis la facilité


Je ne parlais pas de toi mais de la démarche des imbrications de div qui s'appuie sur des arguments peu fondés pour schunter des démarches plus exigeantes et plus fines.
Modifié par clb56 (09 Nov 2006 - 18:08)
clb56 a écrit :


Cet argument n'a strictement aucune valeur !

La question de l'inactivité de javascript est celle de l'accès au contenu et rien d'autre.


Pour celui qui peut y acceder, le graphisme est une sorte de contenu. Si on peut le préserver sans JS, je ne voit pas l'interet de passer par JS....
Pages :