2009-08-19 6 views
0

숫자 매개 변수에 따라 왼쪽에서 오른쪽으로 배치해야하는 다양한 글꼴 크기의 짧은 문구 (1-2 단어)를 포함하는 DIV가있는 페이지가 있습니다. 수직으로 겹치지 않도록한다.Divs를 겹치지 않고 세미 랜덤하게 배치

그것은 태그 구름처럼,하지만 y 축에 포함 된 정보는 ("차가움"는이 경우 - http://cool-wall.appspot.com)뿐만 아니라 거기에

나는이를 배치하는 방법?

<div style="position:absolute; top:150px;left:10px;right:10px;bottom:10px"> 

<!-- then, repeated, with different top, left and font-size values --> 

    <div style="align:center; margin:0; border:none; padding:0; float:left; visibility:visible; position:absolute; top:21%; left:56%; font-size:11px"> 
    <div style="margin-top:0%; margin-right:50%; margin-bottom:0%; margin-left:-50%;"> 
     <a href="foo"><span style="display:inline"> &larr; </span></a> 
     <a href="bar"><span style="display:inline"> Buzz </span></a> 
     <span style="display:inline"> &rarr; </span> 
    </div> 
    </div> 

    <!-- of course, followed by a close div --> 

</div> 

내가 그 스타일의 일부를 추출하는 스타일 시트를 사용하고, 나는 그것이 매우 가난한 CSS (및 HTML)의 실현 ...하지만이 있었다 : 나는 현재 같이하는 div 매우 지저분한 시리즈를 사용하고 있습니다 내가하고 싶은 것을 (거의) 해킹 할 수있는 모든 것. 위의 주요 문제점 (혼란스러운 점을 제외하고)은 폰트의 크기가 무엇인지, 화면 상에 어떻게 표시 될지 모르기 때문에 포지셔닝을 겹치지 않도록 설정할 수 없다는 것입니다.

자바 스크립트를 사용하면 편리합니다. 그러나 나는 어디에서 시작해야할지 모른다. 어떤 팁?

답변

0

x 값은 각 하나에 설정되어 있습니다, 당신은 가능한 한 페이지에서 높이가되고 싶습니다 (최저 y). 중복. 너무 나쁘지 않다 :

1) 컨테이너를 렌더링 - 위치 : 상대적; "position : absolute; top : 0; left : -1000;"을 사용하여 컨테이너 안의 각 항목을 렌더링하고 화면에서 모두 그립니다.

2) 하나씩, 요소를 x 좌표와 y = 0으로 필요에 따라 이동합니다.

var regions = []; 
for(var i = 0; i < items.length; i++){ 
    var item = items[i]; 

    item.style.x = getX(item); // however you get this... 
    var region = YAHOO.util.Dom.getRegion(item); 
    var startingTop = region.top; 
    for(var iReg = 0; iReg < regions.length; iReg++){ 
    var existingRegion = regions[iRegion]; 
    while(region.intersect(existingRegion)){ 
     region.top++; 
     region.bottom++; 
    } 
    item.style.y = (region.top - startingTop) + 'px'; 
    } 
} 

그것은 단지 지역을 업데이트하는 것이 중요하고 실제로 DOM 노드를 이동하지 : 그것은 않는 경우,이 충돌하지 않을 때까지 하나 개의 픽셀을 아래로 이동, 그것은 충돌 있는지 확인하기 위해 이전의 모든 렌더링 항목을 확인 성능상의 이유로 한 번에 1 개씩.

가장 중요한 항목을 먼저 넣으면 아래 항목보다 우선 순위가 높습니다.

+0

정말 잘 생겼어. 하지만 위의 코드에는 몇 가지 버그가 있다고 생각합니다. "... regions [iRegion];" "regions [iReg]"여야합니다. 그리고 가장 바깥 쪽 for 루프의 맨 아래에 배열을 추가해야합니다 : regions.push (region); ... 또한 야후의 YUI 코드가 필요합니다.이 코드는

1

너비가 설정된 경우 태그의 높이를 알려주는 dom 객체에 javascript 속성이 있습니다. 나는 그것이 clientHeight라고 믿는다.

경고 (document.getElementById ('myElement') .offsetHeight);

, 즉

또는

<span style="margin-top:${randomNumber}px;margin-bottom:${randomNumber}">randomtext</span> 
<span style="margin-top:${randomNumber}px;margin-bottom:${randomNumber}">randomtext</span> 
.. 
<span style="margin-top:${randomNumber}px;margin-bottom:${randomNumber}">randomtext</span> 

그냥 인라인 표시 모든 요소가 시도 (또한 http://www.webdeveloper.com/forum/archive/index.php/t-121578.html 참조) 임의의 순서로 출력을 시도하고 그들에 임의 여백의 설정 . 이것은 모두 서버 측 코드 (또는 클라이언트 측에서 원할 경우 javascript)를 사용하여 수행 할 수 있습니다.

+0

JavaScript로 계산하지 않고도 자동으로이 작업을 수행 할 수 있습니까? 내가 말할 수있는 것부터,이 속성을 사용하면 DIV로 촬영 한 화면 부분을 계산하는 기능이 필요하며 매번 다시 계산하거나 다시 계산해야합니다 ... 맞습니까? –

+0

포지션 절대 값이 아님.내가하고 싶은 일을하는 유일한 방법은 Javascript를 이용하는 것입니다. 떠 다니는 요소는 화면의 왼쪽 (또는 오른쪽)으로 떠오르며 가능한 한 많은 수평 공간을 차지합니다. 그러나 이것은 수직 공간에서 작동하지 않습니다. 그런 일을하는 자바 스크립트는 그리 어렵지 않을 것입니다. 너는 이것에 참여하고 너비와 높이를 사용하는 요소들을 반복하기 만하면 그것을 놓을 수있는 가장 좋은 위치를 계산해야한다. – Zoidberg

+0

좋아요, 재미 있어요. 또한, 당신은 너비가 설정되어있는 경우이 작품을 언급했다. 폰트 렌더링과 폰트 크기에 달려 있기 때문에 그것이 렌더링 될 때까지 얼마나 커야할지 모르겠다. 나는 너비를 얻기 위해 유사한 함수가 필요하다고 생각하여 화면 사용 계산을 할 수 있습니다. 같은 방식으로 offsetWidth 사용할 수 있습니까? –

0

요소를 절대 배치하지 마십시오. 이것은 그들이 서로의 위에 떨어지는 이유입니다 ....

+0

괜찮 으면 어떻게 배치해야합니까? 나는 절대적인 X 값과 중첩을 야기하지 않는 Y 값을 원한다. –

관련 문제