ChezSimay

Aller au contenu | Aller au menu | Aller à la recherche

Xhtml, Css, JS & PHP

Fil des billets - Fil des commentaires

samedi, mai 3 2008

les astuces de l'intégrateur : avoir toujours ses styles à jour même avec un site en production

Lorsque vous intégrer un site, la différence que vous avez par rapport aux développeurs c'est que vous travaillez sur des fichiers qui s'exécutent coté client. Et donc cela implique souvent de travailler sans le cache ou bien de vider le cache de son navigateur régulièrement, lorsque le site est en cours de développement cela ne pose pas de soucis. Par contre lorsque le site est en production, il arrive parfois que quelques erreurs d'intégration passent quand on met le site en production... Malheureusement on a pas la main sur le poste des utilisateurs, du coup si on met nos styles à jour, il est probable que ces derniers soient dans le cache du navigateur, et donc il ne profite pas des dernières modifications de styles jusqu'à ce que son cache se vide.

Il existe donc la possibilité de modifier l'appel à la feuille de style en lui passant un numéro de version par exemple, dans ce cas le nom du ficher à changé et du coup le client n'y voit que du feu car son navigateur va chercher la dernière version de la feuille de style :

<link rel="stylesheet" type="text/css" href="style/iesucks.css?v1" />

Billet librement inspiré de l'excellent article sur CSS-tricks

dimanche, avril 13 2008

Utiliser des PNG24 avec des inputs type="image"

Certains d'entre vous (voir beaucoup) ont déjà utilisé des images au format PNG pour pouvoir bénéficier de la qualité et surtout de la transparence alpha de ce format d'images. Malheureusement ce format d'images est mal interprété par IE6, c'est à dire que sera l'image sera bien affichée, mais les endroits ou se trouvent la transparence ne seront pas transparents, heureusement, pour nous les intégrateurs, il existe la possibilité d'ajouter un petit script qui permet de faire en sorte que les images s'affichent bien sur Internet Explorer, attention ce script en fonctionne que pour les images insérées dans le flux HTML, pour les images insérées en CSS, allez faire un petit tour du coté de chez alsacréations.

Si on regarde de plus prêt le javascript utilisé pour faire en sorte que les images PNG insérées dans le flux s'affichent bien, cela ne fonctionne que pour les images insérées via le tag <img ... src="" ... />, Malheureusement, dans un projet récent j'ai du utiliser des images en PNG d'une autre façon, en les insérant comme des boutons de formulaires via le tag <input type="image" src="" ... />, et de cette façon le script que j'utilisai jusqu'à présent, je l'ai donc modifié en conséquence et je me dit que cela pourrait bien en intéresser certains :

var arVersion = navigator.appVersion.split("MSIE")
var version = parseFloat(arVersion[1])
if ((version >= 5.5) && (document.body.filters)){
	for(var i=0; i<document.images.length; i++){
		var img = document.images[i]
		var imgName = img.src.toUpperCase()
		if (imgName.substring(imgName.length-3, imgName.length) == "PNG"){
			var imgID = (img.id) ? "id='" + img.id + "' " : ""
			var imgClass = (img.className) ? "class='" + img.className + "' " : ""
			var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
			var imgStyle = "display:inline-block;" + img.style.cssText 
			if (img.align == "left") imgStyle = "float:left;" + imgStyle
			if (img.align == "right") imgStyle = "float:right;" + imgStyle
			if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
			var strNewHTML = "<span " + imgID + imgClass + imgTitle
			+ " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
			+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
			+ "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>" 
			img.outerHTML = strNewHTML
			i = i-1
		}
	}
	var formulaires = document.getElementsByTagName('form');
	for(var j=0; j<formulaires.length; j++){	
		for(var i=0; i<formulaires[j].getElementsByTagName('input').length; i++){
			var bouton = formulaires[j].getElementsByTagName('input')[i];
			if(bouton.src){
				var boutonName = bouton.src.toUpperCase();
				if (boutonName.substring(boutonName.length-3, boutonName.length) == "PNG") {
					var boutonID = (bouton.id) ? "id='" + bouton.id + "'" : "''";
					var boutonTitle = (bouton.title) ? "title='" + bouton.title + "' " : "title='" + bouton.alt + "' ";
					var boutonStyle = "" + bouton.style.cssText ;
					if(bouton.className){
						var boutonClass = "class='" + bouton.className + "' input_image";
					}else{
						var boutonClass = "' input_image'";
					}
					if (bouton.align == "left") boutonStyle = "float:left;" + boutonStyle;
					if (bouton.align == "right") boutonStyle = "float:right;" + boutonStyle;   
					if (bouton.parentElement.href) boutonStyle = "cursor:hand;" + boutonStyle;
					var strNewHTML = "<a href=\"#\" " + boutonClass + boutonID + boutonTitle + " style=\"" + "width:" + bouton.width + "px; height:" + bouton.height + "px;" + boutonStyle + ";" + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader" + "(src=\'" + bouton.src + "\', sizingMethod='scale');\" onclick=\"envoyerForm("+j+");\" >&nbsp;</a>" ;
					bouton.outerHTML = strNewHTML;
					i = i-1;
				}
			}
		}
	 }
}

function envoyerForm(num){
	document.forms[num].submit();
}

Évidement, il y a certaines restrictions, il faut que les boutons se trouvent entre des balises form, et que le formulaire ai un fonctionnement normal, en gros ça veut dire que je ne sais pas trop comment ça se passe si le formulaire est envoyé via AJAX mais bon je pense qu'un test sur l'argument onclick du bouton et si il est présent je le reprend sinon j'envoie le formulaire normalement (si une âme charitable passe par la...)

mercredi, mars 19 2008

les astuces de l'intégrateur : simuler un paragraphe limité en caractères

Nous allons voir comment simuler le fait qu'un paragraphe est limité en nombre de caractères, il est vrai qu'avec l'utilisation de certains CMS, il n'est pas toujours évident de limiter en un certain nombre de caractères. Il existe pourtant une astuce qui permet d'afficher uniquement un certain nombre de lignes. Il suffit d'appliquer une hauteur à un bloc puis une hauteur de ligne (line-height) qui est un multiple de la hauteur du bloc (ce multiple va définir le nombre de lignes affichées). Enfin, on va appliquer, une propriété qui va permettre de masquer tout ce qui dépasse de notre bloc ; overflow:hidden;.

Voici de que nous donne le code CSS au final:

	height:3em;
	line-height:1em;
	overflow:hidden;

dimanche, février 3 2008

les bonnes pratiques de l'intégrateur : faire un ombrage full css

Dans cet article, nous allons voir comment réaliser des ombres entières réalisés en CSS. D'habitude la gestion de zone avec des ombres en CSS se réalisent avec des images de fond, ce qui implique forcement que la taille de la zone qui possède l'ombre est fixe (au moins sur un axe), et que chacune des zones du site qui possèdent une ombre et qui ont des tailles différentes ont des images de fond différentes.

Dans mon cas, il suffit d'avoir dans un calque positionné, deux calques, un pour le contenu et une autre pour l'ombre et le tour est joué. Voici le code HTML, on pourra remarque qu'il n'y a pas grand chose de compliqué...

<div id="conteneur">
	<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.</p>
	<div class="ombre">&nbsp;</div>
</div>

Et la feuille de style associée, ici il faut donc faire attention à ce que le calque conteneur ai un attribut de position (position:relatif; ou position:absolute;) afin que le calque qui possède l'ombrage soit étiré sous le contenu avec un positionnement en absolute en left, top, bottom et right. Attention, étant donné que l'ombrage est positionné de façon absolute et après le contenu de mon cadre, il faudra donner au contenu un positionnement relatif pour pouvoir lui associer un niveau d'ordre de calque (z-index). Ensuite, il faut juste appliquer des propriétés pour gérée une opacité réduite pour cet ombrage et le tour est joué.

#conteneur{
	background:#fff;
	width:350px;
	position:relative;
	border:1px soldi #555;
	margin:30px;
}
#conteneur p{
	padding:10px;
	margin:0;
	color:#555;
	background:#fff;
	position: relative;
	z-index:1;
}
.ombre{
	position: absolute;
	bottom:-5px;
	right:-5px;
	top:-5px;
	left:-5px;
	background:#000;
	filter : alpha(opacity=20);
	-moz-opacity : 0.2;
	opacity : 0.2; 
}

jeudi, janvier 17 2008

les bonnes pratiques de l'intégrateur : la cas des éléments flottants...

Lorsque vous positionnez un élément de façon flottante à l'aide de la propriété float:left|right;, cet élément sort du flux "normal" de la page, par conséquent il sort aussi de son élément parent le plus proche autrement dit son conteneur. Pour remédier à ce soucis la plupart d'entre vous ajoutent une balise à la fin du conteneur avec un style de type clear:both; De cette façon, l'élément conteneur arrive à savoir ou il se termine et donc l'élément flottant ne déborde plus du conteneur.

Voici un exemple typique du HTML utilisé dans ce genre de situations :

<div id="conteneur">
	<div id="flottant">&nbsp;</div>
	<p>&nbsp;</p>
	<hr class="pusher" />
</div>

et le code CSS :

#flottant{
 width:100px;
 height:100px;
 float:left;
}
.pusher{
 clear:both;
 visibility:hidden;
}

Pour en savoir un peu plus, Openweb en parle bien mieux que moi : Initiation au positionnement CSS : 2.position float. Malheureusement, cet élément positionné en dernière position donne parfois un résultat assez désagréable au niveau de l'apparence (quelques pixels en trop en bas de votre bloc conteneur qui en colle plus aux éléments auxquels il devrait). Attention, vous avez peut être remarqué aussi que l'utilisation abusive de clear engendre des soucis d'affichages assez bizarres sur IE donc n'oublions pas le dicton ; trop de clear tue le clear

Afin d'éviter, ces petits désagréments dut à l'ajout de cette balise à la fin du conteneur et de ses styles, nous allons utiliser d'autres styles afin d'avoir l'effet voulu, en fait sur l'élément conteneur, il suffit d'ajouter overflow:auto; (et zoom:1;, mais cette propriété n'est utile que pour IE). Du coup, avec cette propriété, on a plus besoin d'ajouter une balise à la fin du conteneur.

Voici un exemple du HTML utilisé pour avoir le même type d'affichage :

<div id="conteneur">
	<div id="flottant">&nbsp;</div>
	<p>&nbsp;</p>
</div>

et le code CSS :

#conteneur{
 overflow:auto;
 zoom:1;
}
#flottant{
 width:100px;
 height:100px;
 float:left;
}

EDIT : Attention, cette méthode à quelques restriction notamment si vous voulez positionner un élément de façon absolute à l'intérieur du conteneur, Si cet élément sort complètement ou bien en partie du conteneur, on va avoir un soucis au niveau de l'affichage. Ce soucis est du à l'utilisation de la propriété overflow:auto; qui gère tout ce qui doit s'affiche en dehors du conteneur. Une page d'exemples vaut bien un long discours : voir la page d'exemple sur les éléments flottants

- page 1 de 3