[jQuery] ajouter une image en CSS :before(content)
Résolu
KX
Messages postés
19031
Statut
Modérateur
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
Bonjour,
En CSS il est possible d'ajouter du contenu au document avec un :before, par exemple une image en faisant comme ceci :
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 :
Mon problème est de générer le CSS (ou son équivalent) qui permettrait d'avoir :
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 ;-)
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:
- [jQuery] ajouter une image en CSS :before(content)
- Légender une image - Guide
- Image iso - Guide
- Transformer une image en icone - Guide
- Ajouter une signature sur word - Guide
- Ajouter une liste déroulante excel - Guide
1 réponse
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 :
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 :
J'aurais voulu logiquement obtenir ceci :
Mais en réalité j'obtient ceci, ce qui ne convient pas du tout :
Je ne vois pas où est le problème... Des idées ?
Merci...
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...
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) :