[jQuery] ajouter une image en CSS :before(content)

Résolu/Fermé
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 10 juil. 2013 à 17:27
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 11 juil. 2013 à 10:15
Bonjour,

En CSS il est possible d'ajouter du contenu au document avec un :before, par exemple une image en faisant comme ceci :

<html>
	<head>
		<style>#img_pro_0:before {content:url(image.png);}</style>
	</head>
	<body>
		<div id="img_pro_0"/>
	</body>
</html>

Ce que je voudrais, c'est faire un script jQuery (que je ne maitrise pas) qui permettrait de générer automatiquement ce ":before" avec une page html qui serait comme ça :

<html>
	<head>
		<script type="text/javascript" src="jquery.js"></script>
		<script>
		
		$(function()
		{
			$('.image_protegee').each(function (num,img)
			{
				$(img).append('<div id="img_pro_'+num+'"/>');
				// ...
			});
		});
		
		</script>
	</head>
	<body>
		<div class="image_protegee" url="image.png"/>
	</body>
</html>

Mon problème est de générer le CSS (ou son équivalent) qui permettrait d'avoir :
#img_pro_0:before {content:url(image.png);}
à partir de la balise que j'obtiens :
<div class="image_protegee" url="image.png"><div id="img_pro_0"/></div>
Évidemment, cela serait fait pour chacune des images 0, 1, 2... que j'aurais déclaré via la classe "image_protegee" comme dans mon exemple.

PS. quand on fait ":before {content:url(image.png);}" le chemin d'accès est relatif au fichier CSS, pas au fichier HTML. Est-ce qu'il est possible de conserver cette propriété avec le script ? Ou du moins faire un chemin relatif au script par exemple, mais surtout éviter que le chemin d'accès à l'image soit relatif à la page HTML...

Si vous avez une solution pour faire ça (ou même une idée) je serais preneur, merci ;-)
A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
10 juil. 2013 à 22:00
Bonsoir,

J'ai un peu réussi à avancer, mais j'ai un petit bug.

Voici comme j'en fait : j'ai rajouté une balise <style> dans le head, et je rajoute ligne par ligne mes :before pour chaque image, il y a peut-être mieux, j'attends vos idées à ce sujet, en attendant voilà ce que ça donne :

$(function()
{
    $('head').append('<style id="style_img_pro"/>');
	
    $('.image_protegee').each(function(num,img)
    {
        $(img).append('<div id="img_pro_'+num+'"/>');
        $('#style_img_pro').append('.image_protegee #img_pro_'+num+':before {content:url("'+$(img).attr('url')+'");}');
    });
});

Le bug que j'ai c'est au niveau de la hierarchie des balises.

En code HTML au départ je mets par exemple ceci :

<body>
    <p>Avant</p>
    <div class="image_protegee" url="image.png"/>
    <p>Après</p>
</body>

J'aurais voulu logiquement obtenir ceci :

<body>
    <p>Avant</p>
    <div class="image_protegee" url="image.png">
        <div id="img_pro_0"></div>
    </div>
    <p>Après</p>
</body>

Mais en réalité j'obtient ceci, ce qui ne convient pas du tout :

<body>
    <p>Avant</p>
    <div class="image_protegee" url="image.png">
        <p>Après</p>
        <div id="img_pro_0"></div>
    </div>
</body>

Je ne vois pas où est le problème... Des idées ?

Merci...
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 juil. 2013 à 10:15
J'ai corrigé le bug, il s'agissait juste de mes balises "<div/>" qu'il n'aime pas, j'ai mis "<div></div>" et ça fonctionne... Mais du coup j'ai mis wrapInner pour que le contenu de la <div> s'imbrique bien, et remplacé les <div> par des <span> pour que éviter les sauts de ligne. J'ai aussi ajouté un "type" qui vaut soit "before" soit "after" pour spécifier la position de l'image par rapport à ce contenu.

Au final ça donne donc :

<html>
    <head>
        <script type="text/javascript" src="jquery.js"></script>
        <script>
        $(function()
        {
            $('head').append('<style id="style_img_pro"/>');
            
            $('.image_protegee').each(function(num,img)
            {
                $(img).wrapInner('<span id="img_pro_'+num+'"></span>');
                $('#style_img_pro').append('.image_protegee #img_pro_'+num
                    +':'+($(img).attr('type')=="after" ? "after" : "before")
                    +' {content:url("img_pro/'+$(img).attr('url')+'");} ');
            });
        });
        </script>
    </head>
    <body>
        1
        <span class="image_protegee" url="image1.png" type="before">
            2
            <span class="image_protegee" url="image2.png" type="after">
                3
            </span>
            4
        </span>
        5
    </body>
</html>

Ce qui génère :

<html>
    <head>
        <script src="jquery.js" type="text/javascript"></script>
        <script>...</script>
        
        <style id="style_img_pro">
.image_protegee #img_pro_0:before {content:url("img_pro/image1.png");}
.image_protegee #img_pro_1:after {content:url("img_pro/image2.png");}
        </style>
    </head>
    <body>
        1
        <span class="image_protegee" type="before" url="image1.png">
        <span id="img_pro_0">
            2
            <span class="image_protegee" type="after" url="image2.png">
            <span id="img_pro_1">
                3
            </span>
            </span>
            4
        </span>
        </span>
        5
    </body>
</html>

Et affiche (grosso modo) :

1 <image1> 2 3 <image2> 4 5
0