Archive pour la catégorie ‘css’

Appliquer des attributs CSS seulement à un navigateur et/ou une version

Il existe de nombreuses possibilités pour cibler un navigateur avec CSS :

HTML

<!--[if IE 5.0]> pour IE 5.0 <![endif]-->
<!--[if IE 5.5000]> pour IE 5.5 <![endif]-->
<!--[if IE 6]> pour IE 6.0 <![endif]-->
<!--[if IE 7]> pour IE 7.0 <![endif]-->
<!--[if IE 8]> pour IE 8.0 <![endif]-->
<!--[if gte IE 7]> pour IE 7 et supérieur <![endif]-->
<!--[if lt IE 7]> pour IE inférieur à IE 7 <![endif]-->
<!--[if lte IE 6]> pour IE 5.0, IE 5.5 et IE 6.0 mais pas IE7.0 <![endif]-->

On peut alors charger un fichier CSS dans une de ces conditions.

Mais ça ne fonctionne que pour Internet Explorer.

Javascript

Avec jQuery, la fonction jQuery.browser permet de cibler un navigateur et une version.

Par exemple, on peut l'utiliser ainsi :

if (jQuery.browser.msie && parseInt(jQuery.browser.version) < 7) $('body').addClass('msieLte6');

Mais jQuery.browser est voué à disparaitre dans quelques années.

PHP

C'est la solution la plus sûre et qui marche avec tous les navigateurs.

Voici le code que je met pour la balise <body> :

<body class="<?php
class Browser
{
    private $props    = array("Version" => "unknown",
                                "Name" => "unknown",
                                "Agent" => "unknown") ;
    public function __Construct()
    {
        $browsers = array("firefox", "msie", "opera", "chrome", "safari",
                            "mozilla", "seamonkey", "konqueror", "netscape",
                            "gecko", "navigator", "mosaic", "lynx", "amaya",
                            "omniweb", "avant", "camino", "flock", "aol");
        $this->Agent = strtolower($_SERVER['HTTP_USER_AGENT']);
        foreach($browsers as $browser)
        {
            if (preg_match("#($browser)[/ ]?([0-9.]*)#", $this->Agent, $match))
            {
                $this->Name = $match[1] ;
                $this->Version = $match[2] ;
                break ;
            }
        }
    }
    public function __Get($name)
    {
        return $this->props[$name] ;
    }
}
$browser = new Browser ;
echo 'browserName-'.$browser->Name.' browserVersion-'.intval($browser->Version) ;
?>">

Ensuite, en CSS, je cible de cette manière :

.browserName-msie.browserVersion-6 #elementId {
    attribut: 'valeur';
}

Comment tester un site sur la majorité des navigateurs ?

En fonction des navigateurs, des versions de ceux-ci et du système d'exploitation, un site peu s'afficher différemment.

Donc avant publication de celui-ci, il convient de le tester dans la majorité des situations.

Pour ce faire, il faut :

1- avoir un Mac

Car un même navigateur s'affichera différemment suivant le système d'exploitation, et le Mac OS X n'est pas virtualisable à ma connaissance.

2- un logiciel de virtualisation pour tester sur Linux et Windows

Pour éviter d'avoir plusieurs ordinateurs.

Par exemple, Virtualbox est gratuit et fait très bien l'affaire.

3- avoir Windows Vista ou Seven

Pour pouvoir le virtualiser et installer internet explorer 9.

4- installer les principaux navigateurs avec les principales versions

Aujourd'hui, je teste sur :

  • Firefox 3.0 et 3.6
  • Chrome dernière version
  • Safari dernière version
  • Opera dernière version
  • Internet explorer 7, 8 et 9

Et internet explorer 6 ?
J'ajoute le bandeau ie6nomore pour expliquer que, comme facebook et beaucoup d'autres, j'arrête le support de ce navigateur obsolète.

Pour tester IE 7 et 8, pas besoin de les installer : sur IE 9, il suffit d'aller dans les "outils de développement", et cliquer sur "Mode de navigateur". Par contre, dans certains cas, il peut y avoir des différences entre le mode de compatibilité et le vrai IE7 ou 8 intégré avec le système d'exploitation (cf l'article de jpvincent). Donc je conseille de faire un ultime test sur des machines virtuelles contenant le vrai IE7 et IE8 avant de publier le site.

5- tester sur les smartphones

Et sans mac ou sans installer tous ces navigateurs ?

C'est quand même possible d'avoir des captures d'écran (mais ça ne permet pas de tester du code javascript par exemple) grâce à des sites internet :

Plugin jQuery d’alignement vertical sans tableau

Il existe de nombreuses solutions sur le net pour compenser avec jQuery l'absence d'attribut CSS quand on n'utilise pas de tableau, mais toutes celles que j'ai trouvé on un bug dans certaines conditions : position: absolute risque de faire sortir le texte du cadre, margin-top fait descendre aussi le conteneur parent, problème avec le padding dans certaines configurations css, …

D'où pastel-vAlign, que j'ai testé dans de très nombreuses situations.

Le code du plugin jQuery

    $.fn.vAlign = function() {
        return this.each(function(i){
            $(this).children().wrapAll('<div class="pastel-vAlign" style="position:relative; margin: 0; padding: 0;"></div>');
            var jWrap = $(this).children('div.pastel-vAlign');
            var ph = $(this).innerHeight();
            var dh = jWrap.height();
            var mh = Math.round((ph - dh) / 2);
            jWrap.css('top', mh);
        });
    };

Utilisation

$('#element').vAlign();

#element doit avoir la hauteur de la zone dans laquelle on veut centrer l'élément enfant qui est dedans. L'élément enfant, lui, ne doit pas avoir de hauteur définie.

Donc le css doit être du type :

#element {height: 100px}

et pas "#element * {height: 100px}" par exemple

Demo

Voir la démo de pastel-vAlign

Un formulaire de recherche avec css et jquery


Voir la démo

Télécharger

Le script jQuery permet :

  • de conserver le style du hover (ici fond bleu dégradé) une fois qu'on a pris le focus, même si la souris n'est plus au-dessus et de la libérer quand on perd le focus
  • d'effacer la valeur "Chercher …" quand on prend le focus, et de le réafficher si l'utilisateur a laissé le champ vide

Source remaniée

Appliquer l’attribut css position: fixed seulement sur un navigateur compatible par détection javascript

L'attribut css position: fixed n'est pas connus de tous les navigateurs (notamment les smartphones et IE6).

Donc si l'on souhaite positionner un élément en fixed seulement sur les navigateurs compatibles, il faudra les détecter.

Voici un script, qui oublie des navigateurs, mais où on est sûr que si on met en fixed le navigateur saura l'interpréter :

function badBrowser(){
    if($.browser.msie && parseInt($.browser.version) >= 7){ return false;} //IE >= 7
    if($.browser.opera && ($.browser.version *10) >= 98 && !(navigator.userAgent.match(/Opera Mini/i))) { return false;} //Opera >= 9.8
    if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){
    var ffversion=new Number(RegExp.$1);
    if (ffversion >= 3) { return false;}} //Firefox >= 3.0
    if ($.browser.safari && $.browser.version.split('.')[0] >= "530" && !(navigator.userAgent.match(/Mobile/i))){return false;} // Safari >= 4 ou Google Chrome >= 4
    return true;
};

if (!(badBrowser()))
        $("#footer").css({
            position: "fixed",
            bottom: 0,
            left: 0
        });

Fichiers CSS : quel est le meilleur compresseur ?

Compresseurs en ligne

Après avoir testé 9 compresseurs en ligne de fichiers CSS, le plus performant qui en ressort est cleancss, mais il crée des bugs avec IE7. J'ai donc retenu cssdriver qui compacte presque aussi bien et qui crée un CSS sans bug, mais qui n'affiche pas de rapport.

CSSDriver :

Je conseille de garder le mode "Normal".

CleanCSS :

Compresser avec PageSpeed sur FireBug (plugins firefox)

  1. faire une analyse de la page avec PageSpeed
  2. sur le rapport d'analyse développer la ligne "Minify CSS"
  3. enregistrer le fichier comprimé en cliquant sur "Save as"

Pastel Button : des boutons sexy en jQuery et CSS

  Transformez n'importe quelle balise HTML en bouton, comme celui-ci :   

Fonctionne avec toutes les balises HTML, en sachant que les balises <button>, <a> et <input type="submit"> sont transformées en <span>, puis est appliqué un javascript permettant de reproduire l'action de la balise.

Télécharger Pastel Button v1.1

Attention : pour activer le hack CSS3 sur IE qui permet d'avoir les ombrages et les coins arrondis, il faut éditer le fichier javascript et adapter la variable pastelButtonAbsolutePath.

Chargement du plugin

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

<script type="text/javascript" src="pastelbutton.min.js"></script>

<link rel="stylesheet" media="screen" type="text/css" title="Design" href="pastelbutton.css" />

Utilisations par l'exemple

<button class="pastelButton">Mon bouton de test 1</button>
<span class="pastelButton">Mon bouton de test 2</span>
<a href="monlien.html" class="pastelButton">Mon bouton de test 3</a>
<form action="macible.php"><input type="submit" class="pastelButton" value="Mon bouton de test 4" /></form>

<script type="text/javascript">
    jQuery('.pastelButton').pastelButton();
</script>

Embellir avec CSS

Augmenter la hauteur du bouton

.pastelButton {
    height: 100px;
}

Aligner le bouton au milieu

.pastelButton {

    margin: auto;

    width: 200px; /* largeur à  adapter en fonction du texte */

}

Changer la couleur de fond et ajouter une image

.pastelButton {

    background-color: #80D9F9; /* En attendant le chargement de pastelButton : doit être plus foncé que  .pastelButton .level1 */

}

.pastelButton .level1 { 

    background-color#85DFFF;

}

.pastelButton .level2 {

    background: url("monimage.png") no-repeat scroll 8px 8px;

}

Modifier la police

.pastelButton * {

    font-size: 16px;

    font-weight: bold;

}

 

Démo

Voir le site pastel.pro

Un site prêt pour HTML5 et CSS3, compatible avec la majorité des navigateurs actuels

Le but ici est de construire un site internet qui sera compatible avec les navigateurs actuels et prêt pour le passer en HTML5 et CSS3.

1- Choisir des technologies compatibles avec les navigateurs actuels

Voir sur le site caniuse.com

2- Éviter les attributs non compatibles avec HTML5

Balise(s) concernée(s) :
Attribut(s) à ne pas utiliser avec HTML5 :
link et a rev et charset
a shape et coords
img et iframe longdesc
link target
area nohref
head profile
html version
img (utiliser id à la place) name
meta scheme
object archive, classid, codebase, codetype, declare et stetby
param valuetype et type
td et th axis et abbr
td scope
caption, iframe, img, input, object, legend, table, hr, div, h1, h2, h3, h4, h5, h6, p, col, colgroup, tbody, td, tfoot, th, thead et tr align
body alink, link, text et vlink
body background
table, tr, td, th et body bgcolor
table et object border
table cellpadding et cellspacing
col, colgroup, tbody, td, tfoot, th, thead et tr char et charoff
br clear
dl, menu, ol et ul compact
table frame
iframe frameborder
td et th height
img et object hspace et vspace
iframe marginheight et marginwidth
hr noshade
td et th nowrap
table rules
iframe scrolling
hr size
li, ol et ul type
col, colgroup, tbody, td, tfoot, th, thead et tr valign
hr, table, td, th, col, colgroup et pre width

Source

3- Vérifier la compatibilité des déclarations CSS

Voir sur le site quirksmode.org

Au passage, je signale la page du siteduzero qui compile la liste des propriétés css les plus courantes. (à garder sous la main !).

4- Choisir le bon doctype

Vous pouvez utiliser le générateur de d'alsacreations.com

Vous pouvez déjà choisir d'avoir votre site en HTML5 sans risque, sans utiliser les balises spécifiques au HTML5 qui ne sont pas encore bien supportées. Dans ce cas, un page type serait :

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
    <title>Le titre de mon site</title>
    <meta name="description" content="Description de mon site" />
    <meta name="keywords" content="liste de mots clés" />
    <meta name="author" content="Mon nom" />
    <meta name="owner" content="Nom du propriétaire" />
    <meta name="geo.placename" content="Ville, Département, Pays" />
    <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
  </head>
  <body>
  </body>
</html>

5- Vérifier que votre site est bien valide

Grâce au validateur du w3.org qui reconnait désormais l'HTML5

Mettre l’image du logo dans le titre <h1> de la page et être bien référencé

Si l'image du logo correspond vraiment au titre

C'est le texte dans l'attribut ALT qui sera référencé (bien pris en compte par moteurs de référencement).
Ex :

<h1>
  <img src='monimage.png' alt='Mon titre' />
</h1>

Si on veut référencer un texte en <h1> mais afficher une image de fond

Alors il faut masquer ce texte et afficher l'image en background avec css.

html :

<h1>
  <span>Mon titre</span>
</h1>

css :

Méthode à ne pas utiliser car non compatible avec tous les navigateurs :

h1 { background: url(monimage.png); }
h1 span { display: none; }

Méthode conseillée : déplacer le texte en dehors de la page :

h1 { background: url(monimage.png); }
h1 span {
  position:absolute;
  left:0px;
  top:-500px;
  width:1px;
  height:1px;
  overflow:hidden;
}

Plus d'infos :

Des colonnes de même hauteur en css sans utiliser de tableau

Comment avoir plusieurs balises <div> automatiquement de la même hauteur en fonction du contenu qui prend le plus de hauteur dans l'une des balises <div> ?

Et ceci, sans tableau, et fonctionnant sur tous les navigateurs ?

Les 3 colonnes de départ

Code HTML

<div id="col1" class="sameHeightCol">Colonne 1</div>
<div id="col2" class="sameHeightCol">Colonne 2<br/>contenu supplémentaire</div>
<div id="col3" class="sameHeightCol">Colonne 3</div>

Code CSS

<style type="text/css">
    .sameHeightCol {
        float: left;
        position: relative;
    }
    #col1 {
        width: 45%;
        background: green;
    }
    #col2 {
        width: 30%;
        background: yellow;
    }
    #col3 {
        width: 25%;
        background: red;
    }
</style>

Rendu

Les 3 colonnes avec automatiquement la même hauteur que la balise <div> la plus haute

Voici l'astuce utilisée :

Code HTML

<div id="container1" class="sameHeightCol">
    <div id="container2" class="sameHeightCol">
        <div id="container3" class="sameHeightCol">
            <div id="col1" class="sameHeightCol">Colonne 1</div>
            <div id="col2" class="sameHeightCol">Colonne 2<br/>contenu supplémentaire</div>
            <div id="col3" class="sameHeightCol">Colonne 3</div>
        </div>
    </div>
</div>

Code CSS

<style type="text/css">
    .sameHeightCol {
        float:left;
        position:relative;
        overflow:hidden;
    }
    #container1 {
        width: 100%;
        background: green;
    }
    #container2 {
        width: 100%;
        right: 25%; /* = la largeur de la colonne verte */
        background: yellow;
        overflow: visible;
    }
    #container3 {
        width: 100%;
        right: 30%; /* = la largeur de la colonne jaune */
        background: red;
        overflow: visible;
    }
    #col1, #col2, #col3 {
        left: 55%; /* = #container2{right} + #container3{right} */
    }
    #col1 {
        width: 45%; /* = #container1{width} - #col1{left} */
    }
    #col2 {
        width: 30%; /* = #container3{right} */
    }
    #col3 {
        width: 25%; /* = #container2{right} */
    }
</style>

Rendu


 

Rajouter un padding dans les colonnes

Il faut rajouter une balise <div> qui entoure le contenu et lui donner le padding voulu.

Code HTML

<div id="container1" class="sameHeightCol">
    <div id="container2" class="sameHeightCol">
        <div id="container3" class="sameHeightCol">
            <div id="col1" class="sameHeightCol"><div class="myPadding">Colonne 1</div></div>
            <div id="col2" class="sameHeightCol"><div class="myPadding">Colonne 2<br/>contenu supplémentaire</div></div>
            <div id="col3" class="sameHeightCol"><div class="myPadding">Colonne 3</div></div>
        </div>
    </div>
</div>

Code CSS à rajouter

    .myPadding {
        padding: 15px;
    }

Rendu

 

Avoir une colonne centrée de largeur fixe

Code HTML

<div id="container1">
    <div id="container2">
        <div id="container3">
            <div id="colCentered">
                Ma colonne centrée avec une largeur fixe
            </div>
        </div>
    </div>
</div>

Code CSS

<style type="text/css">
    #container1 {
        position: relative;
        width: 100%;
        background: yellow;
        height: 100%;
        float: left;
        overflow: hidden;
    }
    #container2 {
        position: relative;
        background: green;
        width: 100%;
        right: 50%;
        float: left;
    }
    #container3 {
        float:left;
        position:relative;
        overflow:hidden;
        width: 100%;
        left: 50%;
    }
    #colCentered {
        margin: 0 auto;
        width: 300px;
        background: red;
        position: relative;
    }
</style>

Rendu

 

Plus d'infos (en anglais)

Retourner au début

Blog Pastel.pro

Ce blog est destiné à partager notre expérience sur la conception de sites web (programmation, design, référencement, ...) aux webmasters. Chaque sujet présente l'essentiel, avec un minimum de texte.