28172 sujets

CSS et mise en forme, CSS3

Bonjour

Je n'arrive pas à me dépêtrer du problème suivant.
Un cours schéma étant plus explicite qu'un long discours, voici
http://jeanpierre.moularde.free.fr/www/images/marge-image.png
- en haut: où j'en suis
- en bas: ce que j'aimerais obtenir
Impératif: on doit pouvoir cliquer sur l'image qui est dans la marge (donc ce n'est pas simplement un background-image dans la cellule;

Comment c'est fait actuellement: ma cellule comporte deux div display=inline-block; une avec l'image l'autre avec le texte. Comme on le voit, ça marche bien si tout tient sur une ligne, mais si ce n'est pas le cas la 2ème div part au dessous. J'ai essayé avec des <span> sans succès.

Question: comment styler tout ça pour obtenir le résultat souhaité?

Merci de votre aide
Modifié par PapyJP (24 Feb 2015 - 15:02)
Comme ça arrive souvent, en expliquant le problème j'ai trouvé une solution: mettre la cellule avec un padding-left important et un text-indent négatif, et le texte dans un span
Modifié par PapyJP (24 Feb 2015 - 15:11)
Administrateur
Bonjour,

3 éléments de même hauteur qui ne passent jamais à la ligne et dont le contenu de chacun peut occuper plusieurs lignes : display: table(-*) me semble un bon candidat.
Et flexbox sur IE9+ mais la mise en place est plus avancée qu'un "simple" :
"display: table; sur le conteneur et display: table-cell sur les enfants" (avec table-layout: fixed; et width: 100% sur le conteneur et j'allais oublier vertical-align: top plutôt que middle ou baseline par défaut, cf. ce que l'on utilise dans KNACSS)
Modifié par Felipe (24 Feb 2015 - 16:09)
@Felipe
Pour une raison que je n'ai jamais comprise, depuis la naissance du CSS il est considéré comme acquis que "table" est une infâme grossièreté que seuls de vieux c... de mon genre (qui sont nés avec) continuent à utiliser.
Dans la mesure où j'ai du temps libre (incroyable comme les retraités peuvent être occupés!) j'ai vainement essayé de comprendre dans quelle mesure les table-* pouvaient effectivement suppléer à l'utilisation des bonnes tables HTML de ma jeunesse (j'exagère, j'avais déjà près de 50 ans à la naissance du HTML).
Tout ce que j'ai compris en lisant les divers documents à ce sujet, c'est que dans le cas où on a vraiment besoin de tables, contourner le problème (quel problème du reste?) avec des table-* était horriblement compliqué et n'apportait rien. Mais bien entendu, je ne prétends pas avoir tout compris.

Il m'arrive bien d'utiliser les table-*, mais justement pas dans les cas où il s'agit de "vraies tables" mais des cas où je voudrais qu'un élément se comporte "comme si" c'était un élément de table.

Dans le cas particulier que je traite, il est effectivement question d'une table contenant des articles regroupés par catégorie.

Le bouton http://nathalie.esthetic.free.fr/images/expand.gif permet de lister tous les articles d'une catégorie, il est remplacé par http://nathalie.esthetic.free.fr/images/reduce.gif qui permet de cacher les lignes de détail quand elles ne sont pas désirées. C'est un mécanisme classique en accordéon qui repose sur un changement de classe dans la ligne de titre de la catégorie qui entraine en cascade par CSS le changement d'image et l'affichage ou non des lignes de détail.

Voici le squelette de mon code HTML

<table>
    <tbody class="category">
        <tr class="category-headline">
            <td class="cat-title">
                <div class="expand-button">&nbsp;</div>
                <span class="cat-title-text">Le texte correspondant</span>
            </td>
            <td class="cat-title-comment>Le commentaire correspondant</td>
        </tr>
        <tr class="article-row">
            <td>.... description de l'article 1  champ 1...</td>
            <td>.... description de l'article 1 champ 2...</td>
            <td>.... description de l'article 1 champ 3...</td>
        </tr>
        <tr class="article-row">
            <td>.... description de l'article 2  champ 1...</td>
            <td>.... description de l'article 2 champ 2...</td>
            <td>.... description de l'article 2 champ 3...</td>
        </tr>
        .....................................................
        .....................................................
        .....................................................
    </tbody>
    <tbody...>
    .....................................................
    .....................................................
    .....................................................
    </tbody>

</table>

Bien entendu, tout cela est généré par un programme qui part de la structure de la base d'articles.

Le mécanisme expand/reduce est basé sur le changement de classe du tbody correspondant, grâce à quelques lignes jQuery appelées lorsqu'on clique sur "expand-button".
C'est parce que je suis en train de revoir mon code pour tirer partie des possibilités de jQuery que j'ai repris ce truc qui marchait très bien depuis longtemps. J'ai voulu profiter de l'occasion pour améliorer la présentation, d'où ma question... et ma réponse.

A part cela, je suis toujours intéressé de voir quelqu'un proposer quelque chose d'autre pour traiter ce petit problème. Il y a toujours à apprendre d'une telle proposition.
Modifié par PapyJP (24 Feb 2015 - 17:35)
kustolovic a écrit :
Je ne crois pas que les tables étaient le problème, mais plutôt la puce d'extension (+)

PapyJP: Au cas où je vois au moins deux autres méthodes : http://codepen.io/anon/pen/gbzjax
1) positionnement absolu
2) marge négative

Merci Kusto, c'est effectivement ça.

Peux tu me dire ce qu'on gagne à appeler "div", puis en les stylant, des choses qui sont effectivement des table-rows et des table-cells plutôt que les appeler stupidement "tr" et "td" (ou "th")?
Ça fait près de 20 ans que je me pose (parfois) cette question, je n'ai toujours pas vu l'avantage...

Concernant le positionnement absolu, il doit être relatif à un élément "relative" si je ne m'abuse.
Je n'ai pas vu de "position:relative" dans le code que tu m'as communiqué. Est-ce que j'ai raté un épisode de la série?
Modifié par PapyJP (24 Feb 2015 - 17:49)
Modérateur
a écrit :
Concernant le positionnement absolu, il doit être relatif à un élément "relative" si je ne m'abuse.
Je n'ai pas vu de "position:relative" dans le code que tu m'as communiqué. Est-ce que j'ai raté un épisode de la série?


j'ai présenté deux cas:
.
row-1 .cell:first-child {
  padding-left: 2.5em;
  position: relative;
}
.row-1 .cell:first-child .icon {
  top: 1em;
  left: 0.75em;
  position: absolute;
}

J'ai bien mis un positionnement relative. À noter qu'un position relative sur une cellule de tableau(td ou table-cell) peut poser des problèmes de compatibilité (notamment sur des versions pas si vieilles de Firefox). Ajouter une div pour cette solution est plus sûr.


.row-2 .cell:first-child {
  padding-left: 2.5em;
}
.row-2 .icon {
  margin-left: -1.75em;
  float: left;
}

Ici j'ai mis float:left pour que l'icone sorte du flux, et qu'ainsi elle n'influe plus sur le texte.

PapyJP a écrit :

Il m'arrive bien d'utiliser les table-*, mais justement pas dans les cas où il s'agit de "vraies tables" mais des cas où je voudrais qu'un élément se comporte "comme si" c'était un élément de table.
[…]
Peux tu me dire ce qu'on gagne à appeler "div", puis en les stylant, des choses qui sont effectivement des table-rows et des table-cells plutôt que les appeler stupidement "tr" et "td" (ou "th")?

Loin de moi l'idée de faire la chasse intégriste aux tableaux. N'ayant aucune notion du contexte j'ai choisi l'un plutôt que l'autre grâce à l'art avisé du pifomètre.
Dans le cas que tu présentes c'est en quelques sorte des données tabulaires, donc non ça ne me choque pas d'utiliser table. Ce forum ne présente pas des données tabulaires mais utilise un tableau. Je n'en fait pas de l'urticaire pour autant.

Les grands avantages du mode tabulaire en CSS sont une très grande souplesse, qui permet de faire de nombreuses choses, sans toucher à la structure, par exemple voici ce quelques exemples à partir d'une simple liste: http://codepen.io/anon/pen/YPLREQ (pas mal d'autres exemples par ici: http://www.alsacreations.com/tuto/lire/1522-le-modele-tabulaire-en-css.html)
En utilisant la création d'éléments anonymes, (table-row/table-cell), et en alternant les blocks/table-cell etc. Si on y rajoute la création d'élément par :before et :after cela devient vraiment très souple. Cette souplesse permet de rendre la structure agnostique de la présentation. Cela à de nombreux avantages: réutilisation d'un même code dans différents contextes (différentes pages, voir sites), mais aussi aujourd'hui dans le cas des media-queries.
Si c'est juste pour ajouter deux couches de divs pour styler un tableau en CSS, c'est relativement peu pertinent, et c'est malheureusement ce que trop de monde a cru comprendre de ce mode de faire. Le but serait plutôt de ne rien rajouter, de ne pas remplacer par des div des td/tr juste pour faire genre, mais plutôt de réfléchir à sa structure de donnée logique en premier lieu, en choisissant de balises et des classes qui ont du sens. Bien sûr c'est un vœu pieu et pas toujours entièrement réalisable, c'est là qu'il faut savoir faire preuve de pragmatisme plutôt que d'intégrisme.
À l'opposé, lorsque l'on juge cette présentation nécessaire à la compréhension, alors la table est plus adaptée, vu que justement elle va s'afficher juste par défaut quel que soit le contexte, et qu'il faudra volontairement «casser» la présentation par table si nécessaire (display: block) dans des cas particulier.

Pour moi ce dernier point est un élément crucial: quel est le cas particulier? La présentation en tableau ou la présentation en flux vertical? Est-ce que je fait un flux vertical sur mobile parce que je n'ai pas d'autres choix mais que je juge cela pas exceptionnel. Ou est-ce que je fait une présentation tabulaire quand j'ai pas mal de place pour profiter de la largeur (mais que ça n'apporte rien à la visualisation de l'information). C'est une définition un peu plus souple souple que celle de ceux qui martèlent le : des tableaux pour des données tabulaires sinon NIET.

Pour conclure il y a des cas particuliers, comme par exemple l'utilisation de colsapn / rowspan où on peut se brosser avec du CSS. Ou juste la flemme/temps disponible parfois (un tableau dans l'éditeur d'un CMS plutôt que de devoir redéployer le code du site Smiley langue .
Merci Kusto je suis 100% d'accord avec ce point de vue.

Il se trouve que dans beaucoup des pages que je gère il y a des tableaux, en particulier le calendrier des activités de l'association, la liste des œuvres au programme du prochain concert, la liste des membres, ...

Pour le reste, que ce soit ou non à l'intérieur de tableaux, j'ai pris l'habitude de donner un nom de style a chaque "objet", ça fait pas mal de "div" en cascade, ce qui ne facilite pas la lecture du HTML, mais qui lit le HTML, sinon le navigateur ? Comme il est généré par du PHP à partir d'une structure objet, je n'ai pas non plus à m'occuper de l'écrire.

Depuis la généralisation du HTML5, je me demande néanmoins si on ne pourrait pas remplacer les <div class="object-type"> par des balises privées du genre <object-type>, ce qui serait effectivement des "balises syntaxiques". Si les navigateurs sont conformes aux standard, ça devrait marcher.
Je vais faire des essais dans ce sens et ouvrir un nouveau sujet de discussion si ça donne quelque chose.