Les variables CSS : un projet qui avance !

Les tendances se confirment : l’innovation vient bien de Safari ces derniers temps…

Un nouvel exemple vient de s’ajouter à la liste, poutant déjà longue, des innovations d’Apple :

  • Les variables CSS, dont j’avais déjà parlé plus tot, on finit par faire écho dans les projets W3C et sont désormais implémentées à titre indicatif dans les derniers builds de WebKit !

La spécification suivie est disponible ici : http://disruptive-innovations.com/zoo/cssvariables/

You can test this feature using a nightly from:
http://nightly.webkit.org/

Test cases can be found here:
http://trac.webkit.org/browser/trunk/LayoutTests/fast/css/variables

dave
(hyatt@apple.com)

Si vous avez des remarques pour ce qui est de cette spécification, n’hésitez pas à poster des commentaires ou à vous s’inscrire, comme moi, au CSS3 W3C Working Group.

Fremy

Alpha 1, α2, α3, α4, α5, α6, α7, α8, β1, β2, …

Pas moins de huit versions ALPHA, 5 versions BETA et, jusqu'au dernières nouvelles, 3 versions RC, ces dernières échelonnées sur plus de 2 années de travail. Tout ça pour un seul un même programme !

Windows Vista ? Que nenni. Le nouveau noyau Linux ? Vous n’y êtes pas. KDE ? Et bien non. Mac OS ? Pas du tout ! Open Office ? Mais non, voyons !

Je peux comprendre que certains types de programmes nécessitent de nombreux tests et versions publiques, mais je commence sérieusement à me demander si il y a bien une logique à tout ceci…

Car ce programme qui a demandé tant de versions BETA en tout genre, c’est votre très cher navigateur FireFox 3 !

J’en fini même par me demander si toutes ces versions témoignent réellement d’une amélioration du produit… ou alors d’une preuve nouvelle de la complexification toujours constante d’un navigateur qui met, à chaque fois que je le lance et au fur et à mesure que je le mets à jour, plus de temps à se lancer, et ce même sans le moindre plugin, et même si de magnifiques nouveaux efforts ont été fournis pour la version 3.

Je me demande aussi si tout cela n’est pas une affaire de marketing. Sortir des BETA/RC pour faire parler de soi. Ce n’est pas une si mauvaise idée après tout. Mais ce n’est pas non plus vraiment honnête par rapport aux autres navigateurs (Safari, IE, Opéra) qui ne sortent de betas que quand elles ont réellement quelque chose à apporter face à la précédente (j’exclus ici les version nightly, qui sont encore tout autre chose).

Je peux paraître assez critique envers FireFox dans cet article. N’en pensez pas moins que j’en suis pourtant un admirateur. Seulement je commence à voir celui-ci prendre du retard sur les autres navigateurs “W3C” (Safari et Opéra) sur de nombreux domaines, et je commence à me poser des questions sur la politique réelle du groupe Mozilla, qui s’en fiche pourtant plein les poches alors que ses propres développeurs doivent travailler bénévolement.

Espérons que l’avenir répondra à mes questions, et par des réponses qui me satisferont.

Qui nous satisferons tous, espérons-le.

Fremy

[VB.NET] Les Custom Events

    Utilisation des Custom Events afin de créer une relation "Friend" comme C++.
  
    
      Public Delegate Sub MyDelegate()
Public Class MyClass1
   Public Custom Event MyEvent As MyDelegate
' Called when a class want to subscribe to the event AddHandler(ByVal value As MyDelegate) ' Accept the handler only if it comes from a certain class If value.Target.GetType() Is GetType(MyClassObserver) Then MyEventHandler.Add(value) Else Throw new ArgumentException("Your class is not authorized to handle any event of this one.") End End AddHandler ' Called when a class want to unsubscribe to the event RemoveHandler(ByVal value As MyDelegate) MyEventHandler.Remove(value) End RemoveHandler ' Called when the event is triggered RaiseEvent() On error resume next For Each D as MyDelegate in MyEventHandlers : D() : Next End RaiseEvent End Event Private MyEventHandlers as new List(Of MyDelegate) End Class

[CSS3] A quoi ressemblera box-shadow ?

Bien que je réalise un petit message sur le sujet aujourd'hui, la question n'est absolument pas tranchée - loin de là - et les débats se font assez actifs dans le groupe W3C chargé du CSS depuis maintenant quelques jours : une vraie polémique !

Néanmoins, les grandes lignes se tracent, petit à petit.

Syntaxe globale.

Comme je l'ai dit, elle est encore en pleine discussion, mais on devrait au final arriver à un résultat semblable à ceci :

box-shadow: none | [[<shadow-def>]? [<color>]? [inner | outer]]

Il sera peut-être possible de spécifier plusieurs effets en séparant chaque effet d'une virgule, mais cela non plus n'est pas encore arrêté.

<Shadow-def> Structure

image // Translation horizontale de l'effet "Shadow"
<length> offsetX;

// Translation verticale de l'effet "Shadow"
<length> offsetY;

// Rayon du flouté appliqué sur le "Shadow"
<length>? blurWeigth;

// Épaisseur de l'étendage (bordure autour du box-shadow)
<length>? spreadTickness;

Inset et Outset : Quelle différence ?

Outset : comportement "logique" pour un effet ombré.

L'effet se réalise à l'extérieur de l'élément. Le Spread sert à étendre la zone vers l'extérieur. L'effet d'ombre est placé sous l'élément auquel il s'applique.

Inset : une bordure "tardive"

L'effet se réaliser dans l'élément. Le Spread sert à étendre la zone vers l'intérieur. L'effet d'ombre est placé sur l'élément auquel il s'applique.

Son utilisation permet surtout de faire des bordures "floues" qui passent par dessus le contenu en lui même de l'élément.

image

Edit : Nouvelle version du contenu en "image" :

Color et gestion de la couleur

imageC'est ici que le comportement est encore mal défini. Quelle sera la relation exacte de color dans l'histoire ? Remplacera-t-il, si il est défini, les couleurs de l'élément, ou au contraire sera toujours défini par "gray" si il est omis ? La question reste ouverte.

Une idée globale du méchanisme de génération du box-shadow est disponible ici à gauche.

La difficulté sera l'étabissement de la color map. Comment faire pour se baser à la fois sur la couleur donnée, la couleur de l'objet, et l'effet ombre censé être rendu ?

 

 

D'autres problèmes à régler : d'autres options en perspective ?

image

Si vous avez des remarques à faire, n'hésitez pas, ca pourrait toujours être utile dans les débats.

Fremy

[VB9] La fonction/opérateur IF : une nouveauté passée inaperçue

Cette fonction a du passer à la trappe. En effet, je n'avais jamais vu son existence ni n'avais entendu parlé d'elles dans les posts parlant des nouveautés de la nouvelle version de VB.NET.

Quelle est son principe ?

C'est en quelque sorte l'équivalent de l'opérateur bool?truePart:falsePart de C#.

Cette fonction est différente de IIF car ce n'est en fait pas une fonction. Voici un exemple qui vous aidera à en comprendre la rasion :

'''' L'opérateur IF
Try
    Dim E as Type = IF (True, True.getType(), Nothing.getType())
Catch ex as Exception
    ' Ne sera jamais atteint
    ' Seul True.getType() sera évalué, qui lui ne génère par d'erreur
    Console.WriteLine("Nothing.getType à été évalué")
End Try

'''' La fonction IIF
Try
    Dim E as Type = IIF (True, True.getType(), Nothing.getType())
Catch ex as Exception
    ' Sera atteint
    ' Nothing.getType() sera évalué, et il génère une erreur
    Console.WriteLine("Nothing.getType à été évalué")
End Try

L'opérateur || de JavaScript

Une surchage de la fonction/opérateur IF permet aussi d'obtenir une variante l'opérateur || de JavaScript.

Pour ceux qui ne ne connaissent pas, ce n'est pas grave.

Voici un code pour expliquer plus précisément le code

Public Sub X(Optional Arg as Object = Nothing)
    ' L'opération qui suit peut aussi s'écrire 
    ' Dim Arg2 = IF(Arg, new Object())
    Dim Arg2 as Object
    If Not CBool(Arg)  Then
        Arg2 = new Object()
    Else
        Arg2 = Arg
    End If
End Sub 

Afficher la zone Poste de Travail (IE7)

Voici un lien qui vous sera peut-être utile : Afficher la zone de sécurité Web - Poste de travail (fr)

Fremy

Quel navigateur crée-t-il les standards d'aujourd'hui, de demain ?

Cette question peut être subdivisée en trois parties.

Qui était, il y a 10-15 ans, le moteur de l'évolution (standards qui sont déjà sortis ou vont arriver dans les mois qui viennent) ?

La réponse, si elle ne saute pas tout de suite aux yeux, me semble assez claire. Les standards qui existent déjà aujourd'hui et la majeure partie Working Drafts les plus avancés sont l'oeuvre d'un navigateur aujourd'hui complétement éteint : Netscape.

Complètement éteint ? Pas si sûr, car FireFox a repris, et amélioré le code de Netscape (moteur de rendu Mozilla/Gecko).

Les standards qui existent déjà sont, dans leur floue globalité, à 80% basés sur le travail des développeurs de NetScape, 10% sur ceux de l'équipe de Microsoft, et 7% sur FireFox. 3% sont, selon moi, encore à répartir sur les autres navigateurs comme Opéra, Safari, ...

Cette tranche des standards va grosso modo de 1991 à 2005, même si on en voit aujourd'hui toujours les conséquences.

On doit à cette tranche des standards plus de 90% de ce qui s'écrit encore en HTML de nos jours. On peut considérer cette partie des standards comme le "fondement" du CSS.

Qui était, il y a 5-10 ans, le moteur de l'évolution (standards qui vont arriver dans quelques années, et qui sont aujourd'hui déjà en préparation, où qui vont arriver dans quelques mois).

La deuxième vague de domination du Web est sans contexte à imputer à Internet Explorer.

Si, à l'époque, une grande partie des standards étaient déjà écrits, il n'en reste pas moins que tant le DOM, que l'HTML que le CSS n'en étaient qu'à leurs premiers balbutiements.

Internet Explorer s'est montré très créatif durant toute la phase de "lutte" contre NetScape. Aujourd'hui, de nombreuses évolutions d'IE sont en phase de standardisation (et sont désormais presque toutes implémentés dans FireFox, et pour certaines sous Opéra/Safari)

- offsetLeft/Top/Width/Height/Parent (DOM)
- clientLeft/Top/Width/Height (DOM)
- XMLHTTPRequest (DOM)
- writing-mode (CSS)
- direction (CSS)
- oncontextmenu (DOM)
- oncut/copy/paste (DOM)
- applying some sytle to the HTML element (CSS)
- ...

De nombreuses autres trouvailles ont été faites par IE à cette époque :

- filter (CSS) --> Effets DirectX et Transitions PowerPoint
- Entrées et sorties de page
- VML
- MARQUEE (qui est/sera implémenté, mais en CSS 3, pas en HTML)
- ...

Le problème de ces fonctionnalités est qu'elles ne sont pas dans "le ton" de ce qui s'était fait avant. Il s'agit de système très efficaces mais beaicoup trop longs et complexes (il faut parfois plusieurs lignes de CSS pour faire ce qu'on pourrait imaginer en 15 caractères), qui dénote de tout ce qui a été standardisé avant. Les fonctionnalités sont présentes mais de manière trop "expert-mode". Cette note me semble importante pour le point qui va suivre

Quel navigateur est aujourd'hui en constante évolution et propose sans cesse de nouvelles fonctionnalités ? Qui dicte désormais aux autres ce qu'ils doivent faire, qui implémente déjà les standards des 5-10 prochaines années ?

Aujourd'hui, n'en déplaise aux défenseurs de FireFox le massif ou d'Opéra le véloce - ou même d'IE même si je me doute qu'eux ne se faisaient pas de grande illusions, IE rattrapant pour l'instant son retard, - et à moi qui n'aime pas trop leur politique de marque, mais c'est aujourd'hui Apple, avec son navigateur Safari, qui mène la danse.

Rien que sur l'année écoulée, nous devons à Safari :

- Les filtres et transitions en CSS (filter plus simple)
- Les canevas HTML/CSS en tant que background image, ...
- Les gradient en CSS (déjà implementé dans filter)
- Effets de texte (déjà implémenté dans filter)
- Plusieurs background pour un seul objet (combinaisons de bg)
- Bordures faites avec des images
- ...

Apple est vraiment très très créatifs, et dans le bon sens du terme ! Les évolutions sont intelligentes et bien pensés, vraiment ce que demande le développeur (même si bon, on éviter d'attaquer le fond du langage CSS, en se contentant d'ajouter des propriétés).

Pourquoi IE bénéficie-t-il de ces nouvelles propositions d'implémentations CSS venues d'Apple ?

Je pense qu'Internet Explorer pourait assez facilement implémenter toutes ces propriétés juste en les transformants en "filter" (qui est un peu une propriété à tout faire sous IE).

Je crois donc qu'IE va suivre plus facilement que les autres ces nouvelles propriétés. Néanmoins IE a encore un retard à rattraper sur ce qui est des propriétés introduites par FireFox et sa team (qui est aussi très proactive).

Ces nouvelles propriétés vont donc donner la chance à IE de rattraper une bonne partie de son retard sur les autres navigateurs comme FireFox, Opéra ou Safari.

Que dire d'Opéra ?

Je crois qu'Opéra n'a jamais vraiment eu le moindre pouvoir de décision.

Ils implémentent les propriétés qu'on standardise, - souvent avec retard, - mais ne sont pas moteurs de l'évolution. Ils discutent des propriétés que les autres proposent, voire réfutent leurs idées, ca oui, mais ils ne proposent pas vraiment de nouvelles évolutions.

Un dernier mot sur Firefox

Si Safari semble avoir la mainmise sur le CSS, je crois quand même que c'est FireFox qui reste maitre au niveau du JavaScript. Dommage que tous les navigateurs n'implémentent pas le JavaScript de FireFox, qui est vraiment extraordinaire !

De plus, si FireFox a souffert d'un léger essouflement d'innovations ces deux trois dernières années, c'est surtout qu'il héritait de l'ancienne structure de Netscape, hélas truffée de failles de mémoires et assez mal pensée (CSS a été implémenté à la va-vite par Netscape, car il ne croyais pas à son avenir), causant problèmes de lenteur, de mémoires, et tout ce qui va avec.

FireFox 3 a corrigé pas moins de 400 problèmes (dont certains hérités de Netscape, d'autres pas) liés aux performances du navigateur (mais je vous préviens tout de même, ne vous attendez pas à un boom de performances non plus).

Maintenant, peut-être FireFox va-t-il revenir dans la course....

Fremy

W3C : Comment donner son avis, suivre les débats ?

Non, W3C n'est pas réservé aux seuls Microsoft, Mozilla et Google.

Outre la myriades d'autres membres de W3C, vous pouvez vous aussi suivre, si pas les réunions des membres, l'évolution "au jour le jour" et les idées des uns et des autres en vous inscrivant dans les divers groupes de discussion.

L'inscription se fait via qques mails automatiques (inscription, validation de l'adresse email) et vous permettra de recevoir une copie de tous les messages e-mail du groupe.

Elle vous donnera en outre la possibilité de réagir (votre mail étant conservé sur un serveur et validé avant envoi au groupe lui-même) et de donner, le cas échéant, votre avis.

Vous pourrez vous désinscrire à tout moment du groupe de discussion.

Notez que vous recevez, le jour de votre inscription, les mails de la veille en prime.

Il semblerait que pas mals de mails soient envoyés en semaine, éviter donc votre adresse privée si vous ne souhaitez pas la charger inutilement.

Fremy

[CSS] Pourquoi pas @color ?

Il existe déjà @font-face {} qui permet de définir une nouvelle police, mais pas de @color permettant de définir une nouvelle couleur !

Pourtant, tous les webmaster seront d'accord avec moi, il est assez casse-pied de devoir fouiller dans ses CSS pour retrouver "LE" code couleur qu'on recherche.

De plus, il faut souvent refaire un CSS par style pour son site, juste pour une couleur ou une image.

Dès lors, un @color, ou même un généralisé @ressource serait franchement pratique pour le développeur, qui pourrait ne garder qu'un seul CSS pour le site, et mettre dans un petit CSS les valeurs des couleurs, images, ... qu'il utilise, ainsi que quelques autres customisations si nécéssaire pour le style.

Ma proposition de syntaxe :

@res {
    /* 
        CSS Type : A CSS Type (lenght, font, color, url, string, ...)
            background: @color @image @repeat @position @...;
        Value : A whole CSS value (can't be combined with others things)
            background: @backgroundValue;
    */
    type: [CSS_Type, 'value'];
    name: CSS_String;
    value: CSS_String;
}

Utilisée comme suit :

@res { type: color; name: 'color1'; value: #abcdef; }
@res { type: url; name: 'image'; value: '/images/bg.png'; }
@res { type: background-repeat; name: "both"; value: repeat; }

@res { type: value; name: 'headerBg'; value: @color1 @image @both ; }

#someObject {
     background: @headerBg;
}

Qu'en pensez vous ?

Fremy

Document: quelle est le format le plus compact ?

Test

Prenons un document DOCX, sans image, utilisant juste quelques styles prédéfinis comme Normal, Titre, Titre 1, Titre 2, Préformaté HTML.

Enregistrons ce fichier sous tous les formats de documents existants :

- DOCX (Word 2007)
- DOC (Word 2003)
- WPS (Works 9.0)
- ODF (Open office)
- PDF (Adobe Reader)
- XPS (Windows Vista)
- HTML (Navigateurs internet)

ATTENTION : les documents sont tous des conversions (plus ou moins identiques) d'un document DOCX originel.

Les documents ODT sont obtenus selon deux méthodes
- Exportation avec l'add-in de Microsoft (créateur de DOC)
- Importation avec l'add-in de Sun (créateur d'ODF)

Quelles sont mes résultats (qui valent ce qu'ils valent, bien sûr) :

ODT (1) : 7Ko (MS, Perte de qualité constatée)
HTML : 12Ko (Perte de qualité constatée)
DOCX : 15Ko (Document de base)
WPS : 19Ko (OK)
ODT (2) : 21Ko (Sun, OK)
DOC : 34Ko (OK)
PDF : 64 Ko (OK)
XPS : 209Ko (OK)

Même test, mais avec un document contenant juste une image (53Ko)

HTML : 56Ko (53+3)
PDF : 80Ko
ODT (1) : 177Ko (MS)
DOCX : 185Ko
DOC : 198Ko
ODF (2) :222Ko
XPS : 226Ko
WPS : Echec

Mes conclusions :

Contrairement à ce qu'on pourrait croire, HTML est un format très dense, car il se retrouve dans le haut du podium, sans pour autant aller au bout des ses capacités (le code généré contient des tabulations inutiles pour être plus lisible pour un développeur).

DOCX fait mieux que DOC (plus ou moins 50% moins en règle générale)

ODF peut faire mieux que DOCX, mais une perte de qualité est dans ce cas inévitable.
Si on évite cette perte de qualité, on se retrouve un peu avant le niveau du DOC.

PDF est très bon pour les images (moins de metadata ou compression ?), lamentable pour le texte (il ne gère pas les styles à répétition et a sans doute un format trop prolixe).

XPS est toujours lamentable pour ce qui est de la taille du fichier. A éviter si le but recherché est la diffusion en ligne.

Fremy

CSS Float & Clear: Triomphe de l'illogisme ou magouille pro-NetScape ?

Internet Explorer, quelle daube ! Il respecte même pas les standards ! Combien de fois dans notre vie ne devrons nous pas entendre ou lire cette fameuse sentence.

IE est-il plus logique que les autres ?

Pourtant, force est de constater qu'il existe des points pour lesquels IE a raison, là où tous les autres navigateurs sur le marché ont tort. Peut-être pas selon le W3C, mais selon toute logique oui en tout cas !

Je vais aujourd'hui me concentrer sur l'attribut CLEAR.

This property indicates which sides of an element's box(es) may not be adjacent to an earlier floating box. (It may be that the element itself has floating descendants; the 'clear' property has no effect on those.)

This property may only be specified for block-level elements (including floats). For compact and run-in boxes, this property applies to the final block box to which the compact or run-in box belongs.

Values have the following meanings when applied to non-floating block boxes:

left The top margin of the generated box is increased enough that the top border edge is below the bottom outer edge of any left-floating boxes that resulted from elements earlier in the source document. right The top margin of the generated box is increased enough that the top border edge is below the bottom outer edge of any right-floating boxes that resulted from elements earlier in the source document. both The generated box is moved below all floating boxes of earlier elements in the source document.. none No constraint on the box's position with respect to floats.

Constatons quelque chose d'intéressant dans cette définition :

   1:  <div style="float: left">
   2:      Line 1<br/>
   3:      Line 2
   4:  </div>
   5:  <div style="float: left; clear: left">
   6:      Line 3
   7:  </div>
   8:  <div style="float: right">
   9:     First right line
  10:  </div>

Quelle sera la disposition logique de cette structure ?

Personnellement, j'ai toujours été tenté de dire que cela devrait être celle-ci :

Line 1                                    First right line
Line 2
Line 3

Force est pourtant de constater que le rendu de ce code, sur tout autre navigateur qu'IE, est le suivant :

Line 1
Line 2
Line 3                                    First right line

Les standards semblent donner raison à IE

Pourtant ma troisième DIV ne possède pas de clear (d'ailleurs elle est bien posée à la droite de la troisième ligne et pas sur une quatrième ligne comme si elle avait clear: left).

Normalement, il n'y a donc aucune raison pour qu'elle ne se place pas "le plus haut possible", ce qui est la 2e règle de base du float (après l'alignement gauche/droite).

Alors comment expliquer le comportement de FF, Opéra (v9+) et Safari ? Est-ce un bug ?

Je l'ai longtemps crû, mais le changement de comportement d'Opéra m'avait donné la puce à l'oreille... Aujourd'hui, j'ai pris mon temps et je suis allé lire les standards sur clear (que je vous ais donné précédement).

Ceux-ci donnent, à première vue, raison à IE.

Puis j'ai regardé la définition de float. Peut-être qqchose avait-il pu m'échapper...

This property specifies whether a box should float to the left, right, or not at all. It may be set for elements that generate boxes that are not absolutely positioned. The values of this property have the following meanings:

left The element generates a block box that is floated to the left. Content flows on the right side of the box, starting at the top (subject to the 'clear' property). The 'display' is ignored, unless it has the value 'none'. right Same as 'left', but content flows on the left side of the box, starting at the top. none The box is not floated

Décidément, tout donne raison à IE. Aucune loi fondamentale n'impose le comportement de FireFox & co, et tout semble confirmer les qualités d'IE.

Oui mais...

Le W3C pouvait-il vraiment donner raison à IE et obliger FireFox à corriger un bug remontant à NetScape (qui a largement été favorisé par les standards, inutile de se le cacher) ?

Probablement non.

Dès lors, une petit règle suffit pour imposer son comportement en tant que standard :

  • A floating box must be placed as high as possible.
  • A left-floating box must be put as far to the left as possible, a right-floating box as far to the right as possible. A higher position is preferred over one that is further to the left/right.

BUT, there is another rule :

  • The outer top of a floating box may not be higher than the outer top of any block or floated box generated by an element earlier in the source document.

THIS RULES MAKE THE USE OF FLOAT MORE DIFFICULT !

And also (but it's logic in fact) :

  • The outer top of an element's floating box may not be higher than the top of any line-box containing a box generated by an element earlier in the source document.
  • The left outer edge of a left-floating box may not be to the left of the left edge of its containing block. An analogous rule holds for right-floating elements.
  • If the current box is left-floating, and there are any left floating boxes generated by elements earlier in the source document, then for each such earlier box, either the left outer edge of the current box must be to the right of the right outer edge of the earlier box, or its top must be lower than the bottom of the earlier box. Analogous rules hold for right-floating boxes.
  • The right outer edge of a left-floating box may not be to the right of the left outer edge of any right-floating box that is to the right of it. Analogous rules hold for right-floating elements.

CQFD,

FireFox a raison, IE a tort Smile

D'autres problèmes avec float

Float est probablement une des propriétés CSS les plus mal pensées et les plus mal formulées par le W3C. Dommage car c'est un outil génial !

Voici encore un cas assez "en balance" de Float :

<div style="text-align: center">
    Some text
    <div style="float: left"> LEFT </div>
    <div style="float: right"> RIGHT </div>
</div>

Que doit rendre le navigateur ?

Moi j'aurais penché pour :

LEFT

SOME TEXT

RIGHT

Bien que cela ne m'aurait pas dérangé non plus :

            SOME TEXT

RIGHT

IE et FireFox rendent pourtant cela ainsi :

 

SOME TEXT

 
LEFT   RIGHT

Opéra et Safari rendent comme le version 1 (la plus logique selon moi)

Qui a raison ? Si SOME TEXT avait été un DIV, on n'aurait pas hésité à dire IE et FireFox, mais avec un élément inline (et même moins vu qu'ici ce n'est que du texte) ?

 

Exemple concret de problèmes causés par cette loi

Imaginons que nous voulions le rendu suivant :

SELECT (ensemble)
==> float: left

SELECT objet dans ensemble
==> float: left
Propriétés de l'objet
==> float: right
................................................
................................................
................................................
................................................
................................................
................................................

Une solution envisageable est placer les deux selects les uns à la suite de l'autre et mettre les propriétés ensuite :

<select id="objGroup">...</select>
<select id="objGroupItem">...</select>
<div id="propertyDiv">...</div>
SELECT (ensemble)
==> float: left
 
SELECT objet dans ensemble
==> float: left
Propriétés de l'objet
==> float: right
................................................
................................................
................................................
................................................
................................................
................................................

Les propriétés sont décalées vers le bas. car elles sont placées après le deuxième SELECT qui lui doit se placer après le premier (supposons que nous ayons demandé un clear: left; à celui-ci)

Solutions :

- Jouer sur les margin-top (mais alors il faut connaitre la taille des objets)

- Mettre les deux SELECT dans une DIV englobante (mais alors, vous perdez en partie votre modularité (cas ou vous voudriez placer un SELECT à gauche et un autre à droite (ici pour un SELECT c'est inutile, mais il se peut que doivent coexister des choses plus grosses que des bêtes SELECT, que j'ai ici choisi dans mon exemple pour simplifier les choses)

- Utiliser une TABLE (mais cela ne permet pas toujours de faire ce que l'on veut faire de manière simple et concise, et surtout de manière rapidement modulable, les TABLE étant encore plus complexes que les DIV)

- REORGANISER LES FLOATS

Cette solution n'est pas toujours envisageable (si comme je le disais précédemment les objets sont succeptibles de changer d'alignement en fonction de la partie de l'interface dans laquelle on se trouve) mais est très souvent LA solution.

Dans mon exemple, la solution est relativement simple :

<select id="objGroup">...</select>
<div id="propertyDiv">...</div>
<select id="objGroupItem">...</select>

Rendu sous FF et IE :

SELECT (ensemble)
==> float: left

SELECT objet dans ensemble
==> float: left
Propriétés de l'objet
==> float: right
................................................
................................................
................................................
................................................
................................................
................................................

Save the developpers : Say no to IE 6 !

Il est vrai que malgré la sortie il y a plus d'un an d'IE 7, le nombre d'internautes utilisant encore IE 6 reste tout à fait non-négligeable.

Si certains (peut-être une majorité, c'est difficile à dire) parmi ces utilisateurs utilisent des versions de Windows inférieures à XP SP2, les autres pourraient mettre à jour leur navigateur (passer à IE7). Les premiers peuvent toujours se tourner vers FireFox, Opéra ou Safari.

Pour promouvoir cette migration, rien de tel que de "forcer gentillement" la main des utilisateurs d'Internet Explorer 6.

Si les plus extrémistes demandent de ne plus prendre en compte IE 6 lors de la conception des sites - ce qui est selon moi un peu fou au vue des parts de marchés d'IE 6 - une autre branche préfère demander - juste demander - aux utilisateurs via l'appartiion d'une banderole non-agressive.

Cette approche est celle adoptée par le site suivant : http://www.savethedevelopers.org/

Vous y trouverez un script à mettre dans votre page d'accueil (ou autre) affichant une petite banière temporaire si l'internaute utilise encore IE 6.

Cela dit, je reste persuadé que ce genre de solution ne peut pas s'appliquer dans le milieu du business (clients obligent) mais pourquoi pas ne pas l'adopter sur nos sites personnels ?

Fremy

Apple critique à son tour l'Acid Test 3

Si même Apple, dont les derniers builds de WebKit passent le test Acid3 à 92%, avec assez peu de problèmes de design du HTML/CSS visible, plutôt que de vanter la qualité de celui-ci préfèrent le dénigrer, ou au moins le critiquer, on peut se demander si ce test a vraiment une raison d'être. N'est-ce pas juste de quoi emmerder le monde du web plutôt que de l'aider à progresser ? Car tant que les navigateurs essaieront (vainenement?) de passer des tests tirés par les cheveux, ils n'implémenteront pas des nouvelles fonctions HTML5/CSS3+/... nettement plus intéressantes pour le développeur !

Jugez plutot l'extrait suivant (source: Blog officiel de Safari/WebKit) :

This brings up another point about Acid3. Elsewhere on the interblag, some have argued that Acid3 is not an important test because a lot of what it tests are edge cases or obscure technologies. Our own Dave Hyatt downplayed the importance of the numeric score. It’s true that acid tests like this are not thorough standards compliance tests, and often enter the realm of very obscure standards details.

Un autre article, paru sur le même blog, réverbait déjà avant l'heure les paroles que je devais prononcer quelques jours plus tard sur mon propre blog :

The reality is that all of the browsers are doing much better than their scores would have you believe, since the engines are often passing a majority of the subtests and experiencing minor failures that cost them the point for that section.

L'auteur relativise tout de même, quelques lignes plus loin :

While some tests are crazy edge cases, others are meat and potatoes interoperability issues that web developers have to work around today. Keep in mind that while the tests cover quirks of particular features, they also incidentally test much bigger gaps, for example the fact that some browsers are missing certain features entirely.

Malgré cette petite tentative d'optimisme, on sent bien que le monde du web (partie navigateur en tout cas) ne semble pas ravi de la venue de ce test.

Aussi, je n'ai pu trouver aucun communiqué, tant de FireFox que d'IE sur Acid3, pourtant sorti il y a longtemps... Volonté commune des deux concurrents de masquer leurs piteux résultats aux tests (et plus encore pour IE que pour FF, faut il le rappeler) ?

Fremy

                                                                             EDIT :

Par la même occasion, je signale qu'MS a donné un site sur lesquel on peut tester la compilance des standards de son nouveau navigateur IE 8. IE 8 passe (ou passera) tous les tests présents. J'ai testé avec FireFox, et je dois dire que j'ai été surpris de constater qu'il existait encore des tests que FireFox 3 ne passe pas !

                            CE TEST NE CONCERNE QUE ET RIEN QUE CSS 2.1 !

Pour ceux que cela intéresse : http://samples.msdn.microsoft.com/csstestpages/default.htm

[CSS]Avoir un background semi-transparent, mais un contenu opaque ?

Est-ce possible ? En CSS uniquement ?

Comme d'habitude : oui et non....

Sous IE, vous avez (css) :

filter: progid:DXImageTransform.Microsoft.Gradient(
   startcolorstr="#55ffffff",endcolorstr="#55ffffff"
);

Sous les autres navigateurs, ben il n'y a pas de solution aussi simple Smile

Votre première arme sera d'utiliser le positionning :

<div>
    <div style="background: white; opacity: 0.75; width: 100%; height: 400px;"></div>
    <div style="margin-top: -400px">
         Contenu de la page
    </div>
</div>

Mais cela implique de connaitre la taille de la zone.

Si vous ne la connaissez pas, à moins que qqun aie une autre idée, vous devrez passer par l'utilisation d'une deuxième arme :

- RGBA(255,225,225,0.666); (Compatible avec les dernières versions de FireFox et Safari seulement)

- Du JavaScript (Mais cela ne marchera pas sur les 5% de nav's avec JS désactivés)

- Ou, mieux, une image PNG (mais alors vous aurez des problèmes sous IE 6-, sur Beaucoup% de surfeurs donc, à moins d'utiliser du JavaScript pour corriger le problème)...

Fremy

IE 8 BETA 1 : Quelles performances ?

Temps de démarrage

IE 8 : +-1 seconde

FF 2 : +- 4 secondes

Mémoire à vide (sans page d'accueil)

IE 8 : 11/12 Mo

FF 2 : 18/20 Mo

Mémoire après avoir visité Google.be

IE 8 : 18 Mo [+6.5Mo]

FF 2 : 21 Mo [+1.5Mo]

Test JavaScript

Je reprends ici un ancien test JavaScript. Tous les navigateurs ont été (re)testés.

Les conditions étant différentes de la dernière fois (CPU plus lent), les résultats obtenus par les navigateurs ont été diminués. Les versions testées sont les dernières existantes.

JavaScript (opérations sur entiers)
============================
Internet Explorer 7.00 : 325*
Internet Explorer 8.00 : 300
FireFox           2.00 : 235
Opéra             9.20 : 250
Safari            3.02 : 310

JavaScript (opérations sur décimaux)
============================
Internet Explorer 7.00 : 1150*
Internet Explorer 8.00 : 850
FireFox           2.00 : 1700
Opéra             9.20 : 525
Safari            3.02 : 875

JavaScript (opérations sur le DOM)
============================
Internet Explorer 7.00 : 340*
Internet Explorer 8.00 : 450
FireFox           2.00 : 90
Opéra             9.20 : 110
Safari            3.02 : 35

JavaScript (parsing innerHTML)
============================
Internet Explorer 7.00 : 715*
Internet Explorer 8.00 : 750
FireFox           2.00 : 290
Opéra             9.20 : 70
Safari            3.02 : 45

JavaScript (total)
============================
Internet Explorer 7.00 : 2530*
Internet Explorer 8.00 : 2350
FireFox           2.00 : 2315
Opéra             9.20 : 955
Safari            3.02 : 1265

JavaScript (ancien total)
============================
Internet Explorer 7.00 : 1687*
FireFox           2.00 : 1374
Opéra             9.20 : 733
Safari            3.02 : 1048

*Calculé grâce au changement
de vitesse de FireFox (et donc
non-testé en condition réelle)
et aux résultats des tests
antérieurs à celui-ci.

Quelles conclusions tirer de ce test ?

IE 8 semble s'être amélioré au niveau du JavaScript pur (addition, ...) mais a perdu en vivacité au niveau du DOM, DOMaine où il n'était pas particulièrement rapide déjà sous IE 7.

Il sera donc un défi pour cette BETA de changer la donne, afin de réellement se montrer plus performant qu'IE 7, et ne pas se contentent d'une amélioration minimum.

 

Test HTML

Je reprends à nouveau un Test HTML (différent de l'ancienne version, même si très semblable)

C'est pourquoi je n'ai pas mis IE 7, vu que je n'ai pas pu le tester sur la même machine que les autres navigateurs avec ce test modifié.

Rendering (HTML)
============================
Internet Explorer 7.00 : 281  > 435*
Internet Explorer 8.00 : 281* > 36500
FireFox           2.00 : 412  > 1032
Opéra             9.20 : 271  > 430
Safari            3.02 : 97   > 200

*Calculé grâce au changement
de vitesse de FireFox (et donc
non-testé en condition réelle)
et aux résultats des tests
antérieurs à celui-ci.

*IE 8.0 n'existait pas à l'époque.

Un résultat très étonnant, vu qu'IE8 freeze pendant 40 secondes !

Et il ne s'agit pas d'une question de téléchargement : la page est en locale, ne contient ni image ni CSS. A peine 5 lignes de JavaScript... et bien sur de tonnes de balises HTML Smile

J'avoue être surpris, et j'espère que ce bug sera corrigé d'ici la version finale !

Conclusion

Encore au stade de BETA 1, IE 8 n'est pas encore un navigateur fini

Néamoins, il semble avoir des performances un peu moindre % IE 7, même si différents domaines ont visiblement été améliorés.

Ne tirons pas de conclusions hatives, attendons au moins la première RC pour forger notre avis !

Fremy

IE8 Beta 1 : premières captures d'écran

Où est-il donc passé ? Non, je ne parle pas de mon sandwich ou de mon livre de math, mais bien du célèbre test Acid 2 ! Celui-ci semble en effet bouder la sortie d'IE8 Beta et reste inaccessible, quelque soit le navigateur utilisé.

image

Impossible, dans ses conditions, de vérrifier les dires de Microsoft,,mais une telle réaction de la part des créateurs du test ne laisssent aucun doute : IE 8 passe Acid2 !

imageimage 

Mais à part ca ? Que nous apporte IE 8 ?

A première vue

Une interface peut modifiée, mais modifiée quand même....

image

Par défaut, IE tourne en mode IE 8. Si un site le demande explicitement (ou, tant que IE8 sera en phase beta, si vous le demandez), il peut rétrograder en mode IE 7.

Le mode quirks (IE 5/6) reste toujours d'application pour les pages mal codées

Acid3... et une console d'erreurs en préparation !

image

EDIT : Il semblerait que IE8 peut désormais faire mieux :

On progresse lentement, mais surement ! (Même si ca m'énèrve un peu qu'ils passent du temps sur ce test et pas sur CSS 3 ou HTML 5 !)

Tout ce que vous devez savoir sur IE 8 :

http://www.microsoft.com/windows/products/winfamily/ie/ie8/readiness/DevelopersNew.htm 

Débogage de script : FireBug pour IE ?

Cette console devrait s'enrichir de toutes les fonctions déjà données par IE Dev Toolbar.

image

Mais l'essentiel y est déjà !

image

Un petit lookup sur une fonctionnalité d'IE 8

On aime ou on aime pas....

image

image

 image

image

IE8 BETA 1, c'est par ici les amis....

Petite incohérence au niveau du HTML/CSS : middle/center

Voici différents cas d'utilisation de center/middle dans le CSS :

CSS (text-align)

Accepte "center" comme valeur

Alignement horizontal du contenu

Attribut (align) - decrapted

Accepte "center" comme valeur

Alignement horizontal du contenu

CSS (text-align)

Accepte "middle" comme valeur

Alignement vertical du contenu

Attribut (valign) - decrapted

Accepte "middle" comme valeur

Alignement vertical du contenu

Découverte intuitive de la logique

Alignement horizontal : center

Alignement vertical : middle

Exception : background-position

Si on suit la logique, on devrait écrire background-position comme suit :

(left|center|right|{length(px,em,%)}) (top|middle|bottom|{length(px,em,%)})

==> left middle ou encore center top

Mais en fait, seul IE6- accepte cet manière d'écrire, car elle n'est pas standardisée.

En effet, le standard demande center pour les deux types d'alignement (vAlign/hAlign)

C'est contraire à la logique utilisée jusque là, et donc source d'égarement pour le développeur pas au courant, comme moi, qui pensait que le problème d'affichage de l'image venait d'ailleurs...

Il est donc bon à savoir cette petite subtilité CSS, afin de ne plus se tromper par la suite !

Fremy

Coup de gueule : le prétendu Acid3 test, fait par Google....

De quoi me mettre en rogne : un test Acid3, qui - on l'aura déjà deviné - met complètement Internet Explorer hors course...

Alors bien sûr, on se consolera en se disant que même FireFox échoue très lamentablement à ce test, mais ca ne me suffit pas... J'ai décidé de regarde comment notre test fait échoué IE, ainsi que les autres navigateurs modernes, pourtant maintenants fort de l'Acid Test 2.

EDIT : Apple et sa vision d'Acid Test 3

Comment foutre tous les navigateurs dedans, et IE en particulier

*** Premier élément de réponse : jouer sur des détails (enfin ca c'était déjà Acid2)

*** Deuxième chose : utiliser tout ce qu'IE n'a pas. Ne jamais utiliser ce qu'IE a.

*** Troisième chose : Empecher IE de faire les tests en le faisant buter sur des futilités (IE n'effectue en fait aucun test après le 40e - il en rate deux avant 29 en n'en rate plus aucun après le 29. En tout il totalise 13 points. 29 + 13 - 2 = 40)

*** 4e chose : Utiliser un test qui déstabilise le navigateur, au point de causer des anomalies étonnantes :

Strangely, loading the test in a background tab in Firefox 3 (2008012704) gives me 58, whereas loading in the foreground gives me 60.
Also, on random occasions, I get 61 instead.

Ce n'est pas le seul témoignage. Des utilisateurs de FireFox obtiennent 51, d'autre disent avoir 57, ...

Konqueror 3.5.8 on latest Ubuntu Linux 7.10 loads the page, then crashes after a split second

En gros, ca ressemble un peu à rien ce test...

REM : Je ne veux pas faire croire que je suis pro-IE (même si cela a peut-être un fond de vérité, car j'ai toujours trouvé malhonnête d'accuser IE de ne pas respecter des standards qu'on a créé très différent de l'implémentation DEJA EXISTANTE d'IE du HTML/CSS/JavaScript) mais je vais démontrer ici que ce test, loin d'avoir été fait pour le respect des standards, a surtout été conçu pour discréditer IE.

Le protocol data

Inutile en soit. Comme par hasard présent à de nombreuses reprises dans le test.

Le sélecteur :root

Si vous n'avez plus envie de taper HTML { ... }, pourquoi ne pas taper :root { ... } ?

Font-Face

Trop dur de taper url(font.ttf) ? On a pensé à vous :

@font-face { font-family: "AcidAhemTest"; src: url(font.ttf); }

* { font: AcidAhemTest; }

Opacity

Non content de montrer qu'IE ne gère pas l'opacité via opacity mais bien via filter, on s'arrange aussi pour que la DIV censée disparaitre via opacity soit grande et très mal placée :

.removed { position: absolute; top: 80px; left: 380px; height: 100px; width: 100px; opacity: 0; }

Ne pas faire confiance à celui qui tape son code HTML

<link rel="stylesheet" href="empty.css">

<!-- text/html file (should be ignored, <h1> will go red if it isn't) -->

C'est pareil pour de nombreux test.

On fait passez un script pour un PNG, et on regarde si il se lance.

On refait le même essai mais avec un document HTML.

Créer un document, supprimer head et body, puis les recréer.

De préférence en larguant IE dès la première ligne : doc = iframe.contentDocument;

Ce code est utilisé à chaque fois qu'on tente de tester les manipulations du DOM du navigateur.

Faire foirer IE à tous les tests CSS

doc.defaultView.getComputedStyle, sans aucun appel à currentStyle (variante IE qui me semble en plus bien plus simple que son cousin FireFox)

Demander de garder des TextNode vide (ou remplis d'espace)

var penultimate = last.previousSibling; // this should be the whitespace node
penultimate = penultimate.previousSibling; // this should now be the actual penultimate element

 

Utiliser des fonctions inconnues

doc.createNodeIterator; doc.createTreeWalker

Appeler les propriétés comme des méthodes

w.lastChild()

Très courrant et surtout non-supporté par IE.

Document.getElementById searched on name

Très très grave bug d'IE et d'opéra, en effet....

Test sur les DOM Range

Implémentation W3C du ControlRange d'IE, lors d'une sélection. Aucune chance pour IE de réussir vu que la manière dont cela est géré est radicalement différente.

IE ne sait même pas en créer une (document.createRange)

Tromper le appels vers le C++ avec des chaines contentant \0

document.getElementById('bucket1\0error')

Utiliser les features d'IE et les considérer comme un bug

document.createElement('<div>');

document.implementation.createDocumentType

Rien à dire si ce n'est qu'IE utilise évidemment les ActiveX.

Changer le type des inputs dynamiquement

input.type="password"

Empecher de joindre une propriété et un attribut

test.setAttribute('http-equiv', 'boxes');
assertEquals(test.httpEquiv, 'boxes', "boxes: httpEquiv wrong");

 

Utilisation du SVG

Non supporté par défaut sur IE

Utilisation du seul nom de couleur HTML n'étant pas géré correctement par IE

grey est en effet, selon CSS3.info, le seul nom de couleur du CSS3 à ne pas être supporté par IE

Changer le contenu HTML d'une feuille de style.

Et pas passer par sa propriété cssText. Complètement tordu.

doc.styleSheets[0].ownerNode.firstChild.data = "img { height: 20px; }";

Des trus à propos des events à dormir debout.

Mais je parie que ca passe sous FireFox.

button.onclick = function () { up += 1; if (up < 10) button.click(); down += up; };
button.click();
assertEquals(up, 10, "click event handler called the wrong number of times");
assertEquals(down, 100, "click event handler called in the wrong order");

 

Jouer sur les specs ECMA

// constructor is not DontDelete
var f3 = function (a, b) { 3 };
delete f3.prototype.constructor;
var f3i = new f3();
assertEquals(f3i.constructor, Object.prototype.constructor, "Function object's prototype's constructor was DontDelete (or got magically replaced)");

 

En vrac

var a = []; var s;
s = a.length = "2147483648";
assertEquals(typeof s, "string", "type of |\"2147483648\"| is not string");

<div class="buckets"
><p id="bucket1" class="z"></p
><p id="bucket2" class="z"></p
><p id="bucket3" class="z"></p
><p id="bucket4" class="z"></p
><p id="bucket5" class="z"></p
><p id="bucket6" class="z"></p>
</div>

....

Pour ceux qui veulent se marrer : http://acid3.acidtests.org/

Info relayée de : http://www.css3.info/acid3-completed/

Afficher l'image d'un input type=file : réalité ou fiction ?

Question

Serait-il possible d'afficher dans une balise IMG une image prête à être uploadée dans un input FILE ?

Réponse

Oui sous Safari, sans difficulté.

Oui sous Internet Explorer, via astuce.

Peut-être une astuce à trouver sous FireFox.

Non sous Opéra.

Code Source

Voici le code que j'utilise actuellement :

   1:  <html>
   2:      <head>
   3: