Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zaawansowane tricki CSS stylów kIEview
Konnekt | Forum > Developerzy > Tworzenie dodatków
riddle
Zaczynam serię krótkich porad dotyczących wygibasów CSS-owo-JavaScriptowych w stylach dla kIEview. Osoby niezaznajomione z CSS i JS w ogóle proszone są o nie pytanie o podstawy i poczekanie, aż ktoś inny poprawi / przygotuje nowy styl wykorzystujący wypisane przeze mnie sztuczki. W ten sposób unikniemy bałaganu. :-)

Zanim zacznę, wspomnę jeszcze o bardzo ważnej rzeczy. JavaScript i CSS działają tylko w obrębie okienka rozmowy. Czasem JS pozwala wyciągnąć przez różne obiekty właściwości ekranu (rozdzielczość, pozycja), ale taki styl to nie jest wtyczka. Jeśli coś nie znajdzie się w okienku, nie ma szans żeby tego wykorzystać w czymkolwiek.

1. „Przezroczyste” okienko rozmowy


Zimaq'owe style CSS prezentowały pseudoprzezroczyste okienko rozmowy, stosując trick z wyśrodkowaniem tła - pliku z kopią tapety oraz wyśrodkowaniem okienka za pomocą dodatkowych narzędzi, programów.

Wpadłem natomiast na rozwiązanie o wiele lepsze, chociaż nie doskonałe.

Wystarczy w swoim stylu użyć następujących linijek:

CODE
body {
    background-repeat: no-repeat;
    background-attachment: fixed;
    background-image: url(wallpaper.jpg);
    -ieh: expression(
        this.style.backgroundPosition = parseInt(0 - window.screenLeft) + 'px ' + parseInt(0 - parseInt(window.screenTop + 12)) + 'px'
    );
}


A obrazek tła (wallpaper.jpg) będzie się przesuwał razem z przesuwaniem okna rozmowy, będąc dokładnie nad prawdziwą tapetą.

Mówiąc „przesuwał” niestety nie mam na myśli niczego superszybkiego i nieodróżnialnego od prawdziej przezroczystości… najpierw należy aktywować okienko klikając w rozmowę, a potem po każdym przesunięciu należy wykonać w oknie akcję - można coś napisać, machnąć kursorem nad rozmową, albo poczekać na pojawienie się statusu. ;-)

W skrypcie jest tajemnicza wartość 12. Tyle wynosiła u mnie różnica w pionie, tzn o tyle był przesunięty obraz w okienku w dół. Jeśli u Was jest w górę - odejmijcie to 12 zamiast dodawać. Wiadomo chyba o co chodzi.

Przykładowo może to wyglądać tak:



Kopię tapety można sobie przyciemnić albo rozjaśnić, aby uzyskać fajne efekty. No ogólnie można zrobić wszystko, podejrzewam że nieźle może wyglądać efekt wypikselizowanej prawdziwej tapety i wersji czystej w okienkach rozmowy. ;-) Inwencja twórcza zależy od Was.

Dodatek A: Trochę informacji o expressions:

JavaScript przekazywany jest w CSS za pomocą expression(). Może on odpowiadać konkretnej własności (left: expression(…obliczenia…)) albo być podpinany za pomocą dowolnej właściwości. Ja używam "-ieh".




2. Dodatkowe elementy w oknie rozmowy >>
KOSMOS
riddle pewnie masz pasek startu u góry tongue.gif

QUOTE
body {
background-repeat: no-repeat;
background-image: url(wallpaper.jpg);
-ieh: expression(
this.style.backgroundPosition = parseInt(0 - window.screenLeft) + 'px ' + parseInt(0 - parseInt(window.screenTop + 12)) + 'px'
);
}


to co na czerwono w kodzie "12" - wysokość naszego paska "start" - jest różna, "+" jeżeli pasek jest o góry a "-" gdy na dole

jeszcze jak mamy pasek z lewej lub prawej trzeba pewnie się pobawić z (0 - window.screenLeft)
saCOOL
Wszyscy tak chcą tej przezroczystości, ale czy takie bawienie się w Pseudo Przezroczystość nie jest lepsze? Czy ten sposób nie zużywa mniej zasobów komputera? Po co nam prawdziwa przezroczystość tongue.gif smile.gif..

Co do paska startu i jego usytuowania (jeśli to faktycznie ma znaczenie), to jeszcze dochodzi kwestia różnej jego wysokości w różnych stylach win-zgrozy, oraz ustawienia jego wysokości analogicznie (ja mam 2 linijki paska startu: jeden na ikonki i jeden na aplikacje).
ved
Nie wiem czy mozna w tym dziale ponarzekac, ale jednak sprawa chyba dosc istotna:
Obrazek 'przewija sie', tzn nie pozostaje nieruchomy: Screen
riddle
KOSMOS, na górze mam tylko QuickLaunch i na pewno jest on wyższy niż 12px. Poza tym wyłączyłem go dla testu i było tak samo.

Ved: 7 akapit w 1 poście, proszę.
ved
Nie nie Riddle.
Mi chodzi o to ze dopoki nie pojawia sie w o.rozm. scroll to tlo pozostaje nieruchome i jest faktycznie wycinkiem tapety podspodem, ale kiedy juz zaczyna scrollowac to razem z tlem - znaczy pojawia sie nizszy wycinek...
Mam nadzieje ze teraz wyrazilam sie jasno:)
riddle
Racja, poprawione. background-attachment: fixed trzeba dodać.
zimaq
Dlaczego zmienne systemowe nie są trawione przez css'a importowanego do okna rozmowy...
Jakby działały to wystarczyłoby
CODE

   background: url(file:///%USERPROFILE%/Ustawienia%20Lokalne/Dane%20Aplikacji/Microsoft/Wallpaper1.bmp) no-repeat fixed;
    -ieh: expression(
        this.style.backgroundPosition = parseInt(0 - window.screenLeft) + 'px ' + parseInt(0 - parseInt(window.screenTop)) + 'px'
    );

...i było by pięknie ;-)
btw. Riddle - genialne ;-)
Trial
ja dodam swoje 5 groszy....

zeby bylo fajnie i nie bylo prosto to tapety sa nie zawsze IDEALNIE tych samych rozmiarow co rozmiar pulpittu co jest bardzo wazne... poniewaz stosujemy wtedy rozne triki z ta tapeta.. czyli rozciagnij / wysrodkuj / sasiadujaco.

czyli to juz muisial by kIeView obsluzyc

druga rada ...
dla pewnosci bez cudow kazde odzwierciedlenie tapety znajduje sie w katalogu:

"C:\Documents and Settings\Nazwa Uzytkownika\Ustawienia lokalne\Dane aplikacji\Microsoft\Wallpaper1.bmp"

no i nie wiem.. co tam jeszcze wink.gif
zhvir
nie każde... korzystając z irfanview tapeta znajduje się w zupełnie innym miejscu tongue.gif
Olórin
Genialne, chociaż to +12 musiałem wywalić wink.gif
riddle
Ja korzystam z tapet dedykowanych mojej resce… rozciąganie? Przecież jakość spada. Poza tym coś za coś. :-)

Olórin… pewnie to wina mojego XP Style tongue.gif
ved
potwierdzam, u mnie tez +-12 do wywalenia bylo calkowicie.
Ale smiga wszystko pieknie:)

Razem z nowymi mozliwosciami TloKa tworzy wspanialy zestaw:)
Normalnie jak paczki swiateczne:P
ciaastek
QUOTE
Normalnie jak paczki swiateczne:P

Oby na święta przygotowali coś lepszego biggrin.gif

K 0.7 czy coś takiego ^^

Ale rzeczywiście tworzy piękny zestaw i to +12 jest do wywalenia.

Tak jak pisał riddle, po dopasowaniu tapety przez Windowsa jest ona niewyraźna. Jak nie ma odpowiednich wymiarów (za szeroka czy coś) to lepiej ją trochę obciąć niż na siłę dostosowywać.
brecho
Triki Riddla + nowy TłoK i gg nie ma szans biggrin.gif tyle ze mógłby to być domyślny wygląd i byłoby pięknie smile.gif

Edit
To prawda ze gg nigdy szans nie mialo, ale gdyby ustawic taki domyslny wyglad to ludzie ktorzy dotychczas ogladali mase reklam i okropny pomarancz byliby olsnieni biggrin.gif Równie dobrze mógłby tez byc najnowszy gonedark bo tez nie ma sobie równych z avatarami smile.gif
Suchy
OT

GG nigdy nie miało szans ;x

EOT

Czekamy z niecierpliwością na kolejny odcinek smile.gif
KOSMOS
Mam pytanie odnośnie komuniktów o zmianie statusu, błedach, wczytaniu historii.

Czy jest jakiś sposób aby w/w komunikaty były brane za wiadomości od np: serwera i nie wchodziły między wiadomości grupowane.

Chodzi mi oto ze jak, jako ostani pisałem wiadomość, romówca zmieni status (pokazuje komunikat), ja pisze kolejną wiadomość - i ona już nie ma byś zgrupowana z tą przed komunikatu, tylko ma być jako nowa - pierwsza.

Jest możliwe zrobienie czegoś takiego?
riddle
Sprawdzaj klasę diva przed [send|recv]next i jeśli jest równa quickevent[warning|normal] to zmień klasę na [send|recv]. Pamiętaj też, że [send|recv]next nie zawiera diva z nazwą kontaktu, możesz musieć go dodać (komplikuje się wszystko wink.gif). Jak znajdę chwilę to nad tym posiedzę.
ustrYk
szkoda ze pole wpisywania nie jest obslugiwane przez css.... byloby pieknie
ciaastek
Właśnie mi się przypomniało to co pisałem w temacie o kIEview:
http://www.konnekt.info/forum/index.php?s=...ost&p=75300

Skoro dzięki riddle'owi jest możliwe użycie JS w CSS, to czy to by poszło? Chodzi o możliwość poprawnego wyświetlania półprzezroczystości png w IE (w wersjach niższych niż 7)
zimaq
ciaastek: fragment nowego GoneDark'a:
CODE
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../../themes/gonedark/img/tplbg.png", sizingMethod="scale");

Zgaduj, do czego to może służyć? ;-)
ciaastek
ekhm... no tak.. przepraszam za zamieszanie smile.gif
Olórin
IE7 nie gryzie, zawsze system lepiej załatany :]
ciaastek
Gorzej jak nie można go zainstalować smile.gif
psota
@ciaastek> Jest już IEs 4 Linux 2.1 beta 3 które instaluje IE7(silnik z IE7, a interface z IE6 o ile mi wiadomo). Bawiłem się w ręczną instalacje IE7 z interfejsem IE6, ale mi nie wychodziło. Poczekam na stabilną wersje IEs4Linux i będę sprawdzał czy działa razem konnektem wink.gif
ciaastek
Hehe... albo ja będę musiał zmienić napis w sygnaturze, albo Ty go źle zrozumiałeś tongue.gif (patrz temat pokaż pulpit i mój kontrowersyjny screen)

Chodzi o to, że nie każdy ma oryginalnego Windowsa.
zhvir
jak ktoś nie ma oryginalnego windowsa to wystarczy że zapuści np. emula, wklepie w wyszukiwarce odpowiednią frazę i za pare minut powinien mieć ie7 na swoim kompie... jak ktoś nie chce używać emula to google także pomoże wink.gif
ciaastek
Próbowałem... tyle że w instalatorze też jest w(v?)alidator, pozatym sp2 nie mogę ściągnąć z tego samego powodu... a podobno jest na płytce... ehhh... może masz jakiś sposób? biggrin.gif
Konrado
Ja mam SP2 i też próbowałem i nie idzie ;] Na Bearshare też nic mądrego nie wynalazłem ...
dampis
a od czego zalezy to ze przy przechwytywaniu tapety jako tla onka rozmowy, przy rozmowie z niektorymi kontaktami podczas przesuwania okna tapeta przesuwa sie razem z oknem a przy rozmowie z innymi kontaktami zeby tapeta sie dostosowala trzeba np. ruszyc myszka
riddle
Nie z niektórymi tylko ze wszystkimi. A zależy od tego czy nastąpi jakiekolwiek zdarzenie w oknie rozmowy. W pierwszym poście o tym napisałem, to nie jest bug tylko sposób w jaki całość działa.
jiobel.
Trzeba kupić oryginalnego Windowsa, albo zmienić w tym waszym (ble! wstyd…) pirackim klucz. Wujek Gugiel nie boli. (odnośnie gadki o IE i sp2)
riddle
<< 1. „Przezroczyste” okienko rozmowy

Note: Zanim zaczniesz eksperymentować, przeczytaj post do końca.

Przydługi ten post, ale chciałem dokładnie wytłumaczyć jak dodawać nowe rzeczy do DOM okna rozmowy, żeby potem już się nie rozdrabniać.

2. Dodatkowe elementy w oknie rozmowy


Tworząc styl czasem żałujemy, że z powodu sztywnego szablonu div okna rozmowy nie da się zrobić tego czy tamtego. „Jeden dodatkowy div i by było po sprawie” - ile razy tak mówiliśmy? Dzięki expressions można dodać sobie dowolną ilość elementów.

2.1 Teoria - this


W expression zmienna this określa element określony przez selektor CSS. W tym przykładzie:

CODE
div.send {
  -ieh: expression(this.style.color = 'red');
}


odwołuje się do każdego elementu div.send na stronie, po kolei idąc w pętli. Ten kod ustawi czerwony kolor każdemu <div class="send">


2.2 Teoria - createElement, className, id


Aby dodać element do DOM należy najpierw go stworzyć.

CODE
document.createElement('nazwa')


Możemy przyporządkować taki pływający w próżni element (dajmy na to div) do zmiennej.

CODE
temp = document.createElement('div')


Następnie musimy określić klasę bądź identyfikator, aby za pomocą kolejnych reguł CSS jakoś się do niego odwołać. Klasa przyda się, gdy mamy wiele podobnych elementów w oknie rozmowy, identyfikator jeśli jeden.

Klasa:

CODE
temp.className = 'klasa'


Identyfikator:

CODE
temp.id = 'identyfikator'


Okej, jest element, jest do niego uchwyt za pomocą class/id - ale to nie wszystko. Należy go teraz podczepić do dokumentu.


2.3 Teoria - appendChild, insertBefore


Istnieją dwie szeroko używane metody:

CODE
element.appendChild(nowyElement)
element.parentNode.insertBefore(nowyElement, element)


Pierwsza - appendChild - służy do doczepiania nowego elementu wewnątrz jakiegoś, dodając go na sam koniec. Gdybyśmy wykonali appendChild(temp) na div.send dostaniemy coś takiego:

CODE
<div class="send">
  <div class="header">…</div>
  <div class="body">…</div>
  <div class="klasa"></div>
</div>


Druga - insertBefore - pozwala wstawiać element przed dany. Przy małej pomocy może też wstawić element za dany.

Najpierw musimy pobrać element nadrzędny dla danego. Robimy to przez parentNode. Z niego wywołujemy metodę insertBefore. Jej parametry to element do wstawienia oraz element przed który to coś nowe chcemy wstawić - cel. Cel musi być dzieckiem (zawierać się w) naszego parentNode.

Przykładowo, wykonując insertBefore na div.send z naszym temp musimy napisać coś takiego

CODE
this.parentNode.insertBefore(temp, this)


Otrzymamy:

CODE
<div class="klasa"></div>
<div class="send">
  …
</div>



2.4 Praktyka - this.parsed


Aby zacząć dostawiać elementy do okna rozmowy, należy upewnić się, że nie wpadniemy w nieskończoną pętlę dodającą setki, tysiące elementów dla danej reguły CSS - zawiesi nam to okno rozmowy -> Konnekta.

CODE
div.send {
  -ieh: expression(
    this.parsed ? 0 : (
      [tutaj wstawiamy nowe rzeczy]
      this.parsed = 1
    )
  );
}


2.5 Praktyka - zaokrąglenie rogów


Aby zaokrąglić rogi, potrzebujemy 4 elementów. Najpierw musimy stworzyć dwa, jeden przed i drugi po. A w nich stworzyć po jednym i odpowiednio wypozycjonować.

Zróbmy to na powiadomieniu o statusie:

CODE
div.status {
  -ieh: expression(
    this.parsed ? 0 : (
      temp = document.createElement('div'),
      temp.className = 'statusTop',
      temp2 = document.createElement('div'),
      temp2.className = 'statusBot',
      [c.d.n.]
      this.parsed = 1
    )
  );
}


Mamy już po dwa elementy stworzone, teraz należy je doczepić. Niektóre style swoją kontrukcją pozwolą dodać div przed za pomocą insertBefore (div.statusTop będzie poza div.status) a za przy pomocy appendChild (div.statusBot będzie na końcu, w środku div.status). Wybierzmy jednak metodę najlepszą, ale i najtrudniejszą. Wstawmy div.statusBot naprawdę za div.status.

CODE
div.status {
  -ieh: expression(
    this.parsed ? 0 : (
      temp = document.createElement('div'),
      temp.className = 'statusTop',
      temp2 = document.createElement('div'),
      temp2.className = 'statusBot',
      this.parentNode.insertBefore(temp, this),
      this.parentNode.insertBefore(temp2, this.nextSibling),
      this.parsed = 1
    )
  );
}


Powstało tutaj magicznie "insertAfter" - wstawiliśmy temp2 (div.statusBot) przed następny element za div.status. Czyli za div.status, prawda? Musimy jednak się zabezpieczyć - musimy zawsze mieć element, który będzie za div.status, żeby się go uchwycić.

Należy przed tą linijką wstawić jakiś zbędny element do elementu nadrzędnego div.status.

CODE
div.status {
  -ieh: expression(
    this.parsed ? 0 : (
      temp = document.createElement('div'),
      temp.className = 'statusTop',
      temp2 = document.createElement('div'),
      temp2.className = 'statusBot',
      this.parentNode.insertBefore(temp, this),
      this.parentNode.appendChild(document.createElement('fake')),
      this.parentNode.insertBefore(temp2, this.nextSibling),
      this.parsed = 1
    )
  );
}

fake { display: none }


Stworzyłem tutaj element o mojej własnej nazwie - fake. Potem odwołałem się do niego w CSS i ukryłem go na 100% za pomocą display: none.

Teraz jesteśmy pewni, że będzie zawsze ten "fake" stał za div.status, żebyśmy się mogli go złapać i wstawić przed niego div.statusBot.

Wystarczy teraz wstawić dodatkowe 2 elementy do naszych div.statusTop i div.statusBot:

CODE
div.statusTop, div.statusBot {
  -ieh: expression(
    this.parsed ? 0 : (
      temp = document.createElement('div'),
      temp.className = 'statusRight',
      this.appendChild(temp),
      this.parsed = 1
    )
  );
}


Dostajemy teraz po jednym div.statusRight w każdym div.statusTop i div.statusBot. Wystarczy je teraz tylko ostylować wg własnego widzimisię i voila.

2.6 Praktyka - problemy z CSS
  • Aby ustawić małą wysokość diva, na przykład 2px, należy dodać overflow: hidden, aby tekst nie rozpychał go w pionie.
  • Aby uniezależnić się od szerokości ekranu / okna rozmowy tworząc obrazki teł po parę tysięcy pikseli, można wstawić 2 dodatkowe elementy do div.statusTop i div.statusBot. Wtedy pojemniki mogą dostać tło powtarzane w poziomie, a te 2 same zaokrąglenia.
  • Gdyby zdarzyło się, że jakiś element zacznie zanikać w miarę jak ruszamy nad nim myszką albo przewijamy - dodajmy zoom: 1 do div.status (kontenera dodatkowe rzeczy)
Tak może wyglądać proof-of-concept z bardzo prostym stylowaniem (float, background-color).

joshua
przydało by się jeszcze krótkie opisanie jak wyciągać dane z okna(tak jak ty to zrobiłeś aby wyświetlić Nazwę na Topie w GoneDark'u).
riddle
Będzie, będzie. :-) Ale najpierw właśnie potrzeba takich informacji, jak tworzyć elementy.
joshua
czekam z niecierpliwością ;)
m4ci3kk
czy mógłby mi ktos powiedziec jak dokładnie ma wyglądac sciezka do tapety?? jestem początkujący i nie wiem jak sie za to zabrac blush.gif
Konrado
CODE
body {
    background-attachment: fixed;
    background-repeat: no-repeat;
    background-image: url([nazwa stylu w folderze themes/[nazwa pliku z tapeta+rozszerzenie]);
    -ieh: expression(
        this.style.backgroundPosition = parseInt(0 - window.screenLeft) + 'px ' + parseInt(0 - parseInt(window.screenTop + 0)) + 'px'
    );
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2012 Invision Power Services, Inc.