Równomierne rozłożenie obrazków w dokumencie

18 Apr 2008

TinyMCE fajnym edytorem jest. Problem leży jednak w tym, że czasem zbyt fajnym (bo nikt nie odważy się przecież powiedzieć klientowi, że program jest fajny, tylko jego użytkownicy są głupi ;-). Przycisk dodawania obrazków do dokumentów przyprawia o ból zębów każdego, kto ma jakiekolwiek poczucie estetyki (innej niż ta z Cepelii). Userzy wrzucają je całkowicie bezmyślnie, bez formatowania i najczęściej w absurdalnych rozdzielczościach i w ogóle robią bydło.

Rozwiązanie jest proste - zabierz userom przycisk obrazka, a w zamian daj własny widget do zarządzania fotografiami i rozkładaj je w dokumencie automatycznie. Pisanie uploadera, thumbnailera i obsługi listy to banał i był wałkowany milion razy, bardziej zagadkowe jest natomiast równomierne rozłożenie obrazków w dokumencie.

Pierwotnie próbowałem rozwiązać ten problem po stronie serwera - zliczać paragrafy i wklejać tagi IMG. Nie mogąc uzyskać zadawalających wyników, przeniosłem kod do klienta. Oto implementacja w Javascripcie:

spreadImages = function (bodyId, imagesId) {
	var bw = document.getElementById(bodyId);
	var iw = document.getElementById(imagesId);
	var ps = bw.getElementsByTagName('P');
	var imgs = iw.getElementsByTagName('IMG');
	var n = imgs.length; // ważne by skopiować rozmiar tablicy
	var left = true;
	var d = ps.length / imgs.length;
	for (var i = 0; i < n; ++i) {
		var tmp = iw.removeChild(imgs[0]);
		var p = ps[Math.round(d * i)];
		p.insertBefore(tmp, p.firstChild);
		tmp.style.cssFloat = left ? 'left' : 'right';
		tmp.style.styleFloat = left ? 'left' : 'right';
		left = !left;
	}
};

Jak widać zadanie nie okazało się wcale takie trudne. W wywołaniu podajemy dwa parametry. Pierwszy to identyfikator elementu otaczającego dokument, drugi to identyfikator elementu zawierającego obrazki. Na dowód, że kod działa zamieszczam poniżej kilka fotografii z wycieczki na Giants Causeway w Północnej Irlandii, oraz magiczny przycisk.

Po przeładowaniu strony kliknij na obrazek by go usunąć i spróbować ponownie dla innej liczby fotografii.

Digg del.icio.us StumbleUpon Wykop Reddit Folksr

permalink | trackback | rss

 
 
Albi

Podoba mi się!

witek

Tylko problem w tym, że najlepiej aby obrazki lądowały w najbardziej zbliżonym do nich tematycznie miejscu, a nie gdzie popadnie, ale w równych odstępach.

Walker

Całkiem ciekawe rozwiązanie, choć u Ciebie trochę się psuje przez <pre>

str()

Walker: To dlatego, że pre ma w stylu clear:left. To rozwiązanie dobrze wygląda przy dłuższych akapitach.

witek: Wiadomo, że nie wszędzie wystarczy tak prosty automat jak ten, ale przyjrzyj się dobrze stronom w serwisach tematycznych - każda podstrona dotyczy zazwyczaj jednego tematu, więc nie ma wielkiej różnicy czy obrazek będzie trochę wyżej czy niżej. Również w czasopismach ilustracje bywają powstawiane tak, jak się łamaczowi sformatowało.

Your turn:

nick:
and?:
www (if any):
Wpisz kod:code
Równomierne rozłożenie obrazków w dokumencie html rozłożenie obrazków