28172 sujets

CSS et mise en forme, CSS3

Bonjour
Je cherche à mettre une liste <ul> à côté d'une image.
- dans la page https://tests.osirisnet.net/migration/tests/floating-list.html les <li> "mordent' sur l'image
- dans la page https://tests.osirisnet.net/migration/tests/floating-list.html1 j'obtiens le résultat désiré grâce à
.diapo.left {margin-right:1.5em;}

Seulement je ne veux pas que systématiquement toutes les <figure class="diapo left"> aient une marge à droite de 1.5em, seulement dans le cas où elles sont suivies de <ul>
- dans la page https://tests.osirisnet.net/migration/tests/floating-list2.html avec
.diapo.left + ul  {margin-left:1.5em;}
, le résultat est à peu près le même qu'avec https://tests.osirisnet.net/migration/tests/floating-list.html
Avez vous une solution purement CSS à proposer?
Bonsoir.
PapyJP a écrit :

Avez vous une solution purement CSS à proposer?


Ce que vous avez fait est déjà du pur CSS, si je ne m'abuse… mais :
ul{
list-style-position: inside;
}


Smiley smile
@Zelena : mince, j'avais loupé cette propriété ! Effectivement c'est beaucoup plus propre, même si chez moi les sous-listes ne sont plus discernables : CodePen.

Zelena a écrit :
Ce que vous avez fait est déjà du pur CSS, si je ne m'abuse…

Je pense que Papy voulais parler d'une solution CSS plus propre, répondant à tous les cas de figure.
Modifié par Olivier C (30 Aug 2017 - 04:57)
Modérateur
Olivier C a écrit :
Je pense que Papy voulais parler d'une solution CSS plus propre, répondant à tous les cas de figure.


Oui mais surtout que

PapyJP a écrit :
toutes les <figure class="diapo left"> aient une marge à droite de 1.5em, seulement dans le cas où elles sont suivies de <ul>


Parceque le décalage, qu'il soit fait avec les puces l'intérieur ou à l’extérieur fonctionne bien. Ce que PapyJP cherche c'est un sélecteur d’adjacence mais du frère précédent pour ne donner une marge à l'image que si il y a un UL après... et ça en CSS ça n'existe pas (normalement).
_laurent a écrit :
Ce que PapyJP cherche c'est un sélecteur d’adjacence mais du frère précédent pour ne donner une marge à l'image que si il y a un UL après... et ça en CSS ça n'existe pas (normalement).

C'est même sûr. On ne peut le faire qu'en js.

La question est : pourquoi ne pas prévoir une marge pour tous les éléments quoi qu'il advienne ?
Modérateur
Olivier C a écrit :
La question est : pourquoi ne pas prévoir une marge pour tous les éléments quoi qu'il advienne ?

Parce-que sinon c'est trop facile Smiley lol
Merci de vos réponses
Ayant fait les mêmes raisonnements que vous, je suis arrivé aux mêmes conclusions: j'ai fini par jouer sur la liste des classes de l'élément diapo, c'est à dire qu'il ne suffit pas de mettre la liste après la diapo, il faut dire dans la diapo qu'elle doit avoir une marge de 1.5em.
le problème des éléments flottants, c'est qu'ils sont supposés être à gauche de l'élément qui les contient, et c'est leur contenu qui est "poussé" vers la droite par l'existence de ma diapo, qui elle est cadrée à gauche (et vice-versa si la diapo était cadrée à droite)
On ne peut donc pas jouer sur la marge de l'élément, ou son padding, ça n'a aucune influence, sauf bien entendu à faire un calcul complexe par JS, et encore: il faudrait mette une marge à la valeur de la largeur de la diapo + 1.5em pour que ça colle.
Dans l'exemple https://tests.osirisnet.net/migration/tests/floating-list4.html j'ai bien la liste décalée comme je le veux, mais le <p> qui précède est également décalé, comme il se doit...
Pour obtenir un truc "bien présenté" et responsive, je crains que ce soit sans espoir!
Modifié par PapyJP (30 Aug 2017 - 16:52)
Le truc que je n'ai pas compris c'est les raisons pour lesquelles l'image ne peut avoir de marges ?

Et aussi : pourquoi avoir écarté le ciblage des listes qui font suite à l'image dans un même conteneur et donner une marge à ces dernières, plutôt qu'à l'image elle-même ?
.diapo.left ~ ul  {margin-left:1.5em;}
J'essaie de faire du code qui permette au propriétaire du site, qui n'est pas un technicien, d'utiliser des snippets comme des Lego et que tout s'emboîte de façon harmonieuse et responsive.
Ma solution actuelle est de mettre une marge à l'image, mais ça ne répond pas au principe du Lego: l'utilisateur doit savoir que ce qui suit est une liste.
Dans le code actuel du site, l'utilisateur ne connaît pas le concept de "liste", il fait tout à base de <br>&bull;
Les seules listes à base de <ul><li> de ces pages sont générées par des snippets que je lui ai données, ou bien, comme dans les menus du site, par des scripts que j'ai écrits.
Si je veux l'inciter à utiliser des "vraies" listes, il faut que je lui fasse un snippet qui en génère la structure, et encore il faudra qu'il ne soit pas perturbé par la nécessité de mettre des <li> pour chaque élément de la liste. Pour cela, le simple fait de mettre une liste après une diapo doit être suffisant pour créer l'effet désiré, sans devoir ajouter quelque chose dans la defiude la diapo.

Je n'ai pas fait attention au fait que j'ai laissé ce
.diapo.left ~ il {margin-left:1.5em}
dont je confirme qu'il n'a aucune conséquence visible, car c'est le contenu de <ul> qui est déplacé vers la droite par la présence de la diapo, pas le <ul> lui-même.
En fait il faudrait une marge de compute(100%+1.5em)
Je vais essayer ça, ça devrait répondre à la question.
Modifié par PapyJP (31 Aug 2017 - 09:43)
PapyJP a écrit :

En fait il faudrait une marge de compute(100%+1.5em)
Je vais essayer ça, ça devrait répondre à la question.

Eh non! ça décale TOUTE la liste vers la droite, y compris ce qui est au dessous de la diapo!
Modérateur
PapyJP a écrit :

Eh non! ça décale TOUTE la liste vers la droite, y compris ce qui est au dessous de la diapo!


Bah oui c'est le même soucis qu'avec le +... sauf que le ~ aura un effet sur tout les li de la page après l'image (pas seulement celui juste après)
Une question me taraude depuis le départ. Pourquoi se focaliser sur les listes et pas sur d'autres éléments, comme les paragraphes par exemple ? Il me semble qu'il n'y a pas que les listes qui devrait être désolidarisées de l'image, et si c'était le cas alors c'est bien l'image flottante qui aurait une marge.

C'est toujours super complexe de reprendre de l'existant, mais dans l'idéal il aurait fallut anticiper tous les comportements, comme sur un framework (je l'ai fait et c'est super formateur : (Scriptura, style guide). On définit en amont tous les comportements de base souhaités et non au cas par cas, ce qui a l'avantage de nous faire prendre de la hauteur et d'appréhender une problématique de manière plus globale, nous évitant ainsi d'opter pour une solution qui finira tôt ou tard par se télescoper avec une autre.

On évite ainsi de se prendre la tête avec toute la casuistique CSS par la suite et on se concentre sur le rendu html uniquement.
Cette approche est certainement préférable... quand c'est possible.
Je suis dans un cas tout à fait particulier:
il s'agit de la reprise d'un site qui date du début des années 2000, développé par une personne qui n'a que des connaissances très limitées en HTML, aucune en CSS, PHP, JS, et de plus cette connaissance limitée est celle des années en question.
Quand j'ai voulu migrer le site, j'ai dû par exemple reprendre des milliers d'images encadrées du genre
upload/1504342741-48769-akht1.png

<table border="0" cellpadding="0" cellspacing="0" align="left">
    <tr>
        <td background="/luluborder_tl.gif" width="16" height="12"></td>
        <td background="/luluborder_top.gif" width="210" height="12"></td>
        <td background="/luluborder_tr.gif" width="16" height="12"></td>
    </tr>
    <tr>
        <td background="/luluborder_left.gif"></td>
        <td align="center" class="vuescadrephoto">
            <a href="javascript:PopupImage('ptahhtp_doorway.gif')">
                <img src="photo/ptahhtp_doorwayv.gif" width="210" height="220" border="0">
            </a><br>
            Murs d'entrée Est et ouest<br>
            <span class="geneva2noir">(d'après "Tomb of Ptah-Hetep",<br>
            <i>ERÀ </i>, London, 1896, par Paget et Pirie)</span>
        </td>
        <td background="/luluborder_right.gif"></td>
    </tr>
    <tr>
        <td background="/luluborder_bl.gif" width="16" height="16"></td>
        <td background="/luluborder_bot.gif" height="16"></td>
        <td background="/luluborder_br.gif" width="16" height="16"></td>
    </tr>
</table>

et les transformer en


<figure data-pres="" class="diapo  left width40">
    <img src="photo/ptahhtp_doorwayv.gif" alt="" onclick="PopupImage('ptahhtp_doorway.gif')">
    <figcaption>
        Murs d'entrée Est et ouest<br>(d'après "Tomb of Ptah-Hetep", <br>
        <i>ERÀ, London, 1896, par Paget et Pirie)</i>
    </figcaption>
</figure>

avec le CSS qui va bien pour obtenir une présentation correcte et de plus responsive.

J'ai fait tout cela (et plein d'autres genre du même tonneau) avec des programmes en PHP qui analysaient le DOM des fichiers HTML et créaient de nouvelles pages gardant la sémantique mais avec un style plus à la mode.

Mais de plus il n'était pas question que le propriétaire du site soit obligé d'apprendre à faire cela par lui-même en HTML.
Il fallait donc un outil de génération des "diapos"

Comme il n'était pas question non plus de faire cela en PHP, j'ai fait la génération en JS
Cette <figure> est donc elle même générée par un script

<script>diapo('ptahhtp_doorwayv.gif', '', 'Murs d\'entrée Est et ouest<br>(d\'après "Tomb of Ptah-Hetep", <br><i>ERÀ, London, 1896, par Paget et Pirie)')</script>

et pour faciliter l'écriture de cet appel de script (qui lui-même fait plus de 150 lignes de JS), c'est fait sous la forme d'un snippet DreamWeaver qui s'appelle "diapo"
Et encore la difficulté reste de devoir protéger les \' à la main, je ne suis pas allé plus loin pour le moment, mais je suis en train de travailler le sujet.

C'est dans le cadre de ce réseau de contraintes que se situe mon action.

Le propriétaire ne connait pas le concept de "listes" sous la forme <ul><li>...<li></ul>
Pour l'instant il utilise, à l'intérieur d'une balise <p> que j'ai eu quelques difficultés à lui faire utiliser, des séquences <br>&bull; ce qui n'est pas sémantiquement satisfaisant mais produit le résultat visuel qu'il désire.
Le but de cette tentative est de créer un snippet "liste" qu'il lui suffirait d'appeler en toute circonstance et qui générerait quelque chose comme

<ul>
    <li>        </li>
</ul>

Mais comme l'essentiel de ces pages est constitué de diapos à gauche ou à droite et d'un texte qui flotte dans l'espace qui reste, ce n'est pas envisageable s'il faut faire autre chose que mettre deux snippets côte à côte.

Pour <p>, pas de problème, il est stylé en conséquence et tout se passe très bien, mais pour <ul>, je ne vois pas très bien comment faire, et je pense en rester là pour l'instant
Modifié par PapyJP (02 Sep 2017 - 11:19)