EpicWEB.pl

webdesign, programowanie, phat lewt!

Ostatni projekt

ddrpl.com

Ostatnie wiadomości

Wykrywanie poziomu powiększenia w przeglądarce.

Gdybym za każdym razem, kiedy źródłem błędnego wyświetlania się strony jest to, że klient ma zwiększony poziom zbliżenia (Ctrl +) dostawał 5 zł miałbym już chyba na parę zgrzewek PEPSI ;-) Przy jednym z ostatnich mini projektów potrzebowałem informacji właśnie o tym - czy osoba odwiedzająca stronę ma ustawiony zoom na wartość inną niż 100%.

Pierwsze próby spełzły na niczym - myślałem, że przy zwiększeniu poziomu zoom-u wymiary obrazków pobierane dynamicznie przez JavaScript będą odzwierciedlał ich nowe proporcje - jednak tak nie jest, podają one wciąż rzeczywiste (ustalone na stronie za pomocą HTML/CSS) wymiary. Okazało się, że jedynym obiektem, który przy zmianie zoom-u potrafi zgłaszać swój nowy wymiar jest Flash. Nie przepadam za Flashem, ale Action Script mam jako-tako opanowany, więc całość zamknęła się w 8 linijkach AS3 i kilku JS. Zacznijmy od Action Script:

stage.scaleMode = "noScale"; #1
import flash.external.ExternalInterface;
import flash.utils.setInterval;
function sendSignal():void {
        ExternalInterface.call("flashSize", stage.stageWidth); #5
}
setInterval(sendSignal, 100);
sendSignal();

Wyjaśnię tylko co "trudniejsze" linijki. Pierwsza (#1) informuje nasz obiekt, że w przypadku skalowania strony nie należy skalować zawartości flash - obiekty mają pozostać tej samej wielkości, zmieni się za to wymiar "płótna" (stage). Kolejna (#5) wywołuje poprzez ExternalInterface funkcję flashSize którą definiujemy w naszym HTML jako funkcję JavaScript, przyjmującą jako argument jeden parametr numeryczny - przekazujemy do niej szerokość obiektu flash.

Mając już gotowy Flash, osadzamy go na stronie nadając np. 100px szerokości - domyślnie, pierwsze wywołanie przekaże do funkcji flashSize() właśnie powyższe 100. Przy przeskalowaniu strony (Ctrl +) przekaże już nową wartość, np. 111px - dzięki temu możemy z proporcji (bądź też bez, jeżeli używamy bazowej szerokości 100px) obliczyć procentowy poziom powiększenia i odpowiednio zareagować (zmienić logikę strony, poinformować odwiedzającego).

Próbowałem wywołanie cykliczne (setInterval) zastąpić reakcją na zdarzenie Event.RESIZE, ale zdaje się, że nie jest one sygnalizowane w takiej konfiguracji stąd też setInterval - na szczęście sama funkcja jest na tyle lekka że nie powoduje praktycznie żadnego dodatkowego obciążenia dla CPU.

Ładne "guziki" w czystym HTML/CSS

Ostatnio potrzebowałem na szybko stworzyć "ładne guziki", będące odnośnikami do wartych wyeksponowania części serwisu - jako że elementów takich było by kilka(naście) na łamach całego serwisu i jako iż nie przepadam za stosowaniem grafiki tam, gdzie nie trzeba wymyśliłem coś, co w moich odczuciach jest ładnym guzikiem z zastosowaniem samego HTML i CSS.

To jest ładny, gładki button!

Rozwiązanie takie daje mi możliwość zmienienia koloru guzika poprzez łatwą modyfikację 2(4) parametrów w CSS. Przejdźmy do kodu, na początek HTML:

<a href="#" class="fancyButton><span>To jest ładny guzik</span></a>

Jak widać całość jest semantycznie poprawna - ktoś mógłby się upierać, że SPAN nie jest potrzebny i można go wstawić dynamicznie za pomocą CSS, może i można, nie wszędzie działa - starałem by rozwiązanie ładnie się degradowało w starszych przeglądarkach (w IE6 prawie działa).

Koniec dygresji, CSS:

.fancyButton {
        background: #0066CC;
        border: 1px solid #0066CC;

        display: inline-block;
        height: 48px;
        line-height: 48px; 
        font: 24px/48px "Trebuchet MS","Trebuchet",Arial,Helvetica,sans-serif;
        -webkit-border-radius: 5px;
        -moz-border-radius: 5px;
        border-radius: 5px;
}

.fancyButton:hover {
        opacity: 0.7;
        -moz-opacity: 0.7;
        -webkit-opacity: 0.7;
}

.fancyButton span {
        background: #53A9FF;
        border: 1px solid #53A9FF; 
        color: white;
        
        display: block;
        text-align: center;
        padding: 0px 10px;
        -webkit-border-radius: 5px;
        -moz-border-radius: 5px;
        border-radius: 5px; 
        height: 50%;
}

Na pierwszy rzut oka widać, że rozwiązanie nie będzie działać w starszych przeglądarkach - do zaokrąglenia używam border-radius, do przeźroczystości opacity - przeglądarki, które nie obsługują tych rozwiązań wyświetlą po prostu dwu-kolorowy prostokąt bez efektu najazdu (można go osiągnąć na sztywno zmieniając kolory w :hover, ale tracimy wygodę zmiany koloru w wielu guzikach na raz).

Demonstracja oraz informacje o degradacji w starszych przeglądarkach

Portal 2

I już prawie wszystko wiemy - Portal 2 został zapowiedziany.

Po przyjrzeniu się ogłoszeniu można zauważyć podkreślone literki - zebrane razem tworzą napis Dr Attmann i h0nee, które to mogą zostać użyte jako login i hasło do BBS-u co daje nam kolejny kawałek układanki ...

Thank you for assuming party escort submission position!

Ha! Mówię Ha! tym wszystkim (ok, Tobie jednemu, flegmatyk :P) z was, którzy myśleli, że zmiany w Portal to tylko próba ożywienia starej gry!

Przed paroma godzinami pojawił się kolejny update do gry Portal dodający jedną rzecz: "Added valuable asset retrieval". Co tym razem? Nowe zakończenie!

Po zakończeniu gry słychać dźwięk jakiejś maszyny, głos robota mówiącego "Thank you for assuming party escort submission position!" i widzimy jak nasza bohaterka zostaje odciągnięta w nieznane.

Jeżeli nie jest to zapowiedź kolejnych przygód w świecie Portal-u to ja już nie wiem :-)