티스토리 뷰
박스모델
다음과 같은 형태의 table 박스모델이 있다. 박스모델의 형태를 살펴보면
a. 상단에는 이미지
b. 하단에는 설명
c. 이미지(a)위에는 장비에대한 아이콘(이미지)으로 구성되어있다.
박스모델은 대략 아래와 같이 상상하면 되고 주요한 css 속성은
- container와 vendor의 position은 모두 absolute
- a와b는 table의 text-align:center 라는 점이다.
<div id="container"> <table> <tr> <td> <img src = "a.이미지" </td> <td> b.텍스트</td> </tr> </table> </div> <div id="vendor"> <img src=" c.아이콘"> </div>
그런데 문제는 "a.이미지" 위치를 조정하는 x, y 좌표(html에서는 left와 top)를 전달 받았을 때
그대로 적용하면 "b.텍스트"가 가변적으로 길어질 경우 테이블 안에서는 녹색과 같은 갭이 생기고
결과적으로 x 좌표에 오차가 생긴다.
공간계산
먼저 녹색의 갭(차이)를 구하면 테이블안의 TD에서 이미지 width를 빼고 2등분 해준다.
var gap = ( TD.width() - a이미지.width() ) / 2;
좌표계 값(x) 에서 gap을 빼서 left를 구하면
var left = x - gap;
이렇게 하므로써 ①번에 그려졌던 테이블이 ②번으로 이동되어 a의 이미지 위치가 제대로 표현되고 전달받은(x, y)값과 정확히 일치한다.
마지막으로 c.아이콘(vendor)는 그림과 같이 저런 형태로 항상 이미지 좌측하단에 위치해야 하는데
c아이콘 left = a이미지의 x에서 c이미지의 절반을 빼서 위치
c아이콘 left = a이미지.left - ( c이미지.width()/2 );
c아이콘 top = a이미지의 y 에 a이미지의 height를 더해서 끝점을 알아낸 뒤 - c이미지 높이 값의 절반을 뺀다.
c아이콘 top = a이미지.top + a이미지.height() - ( c이미지.height() /2 );
참고로 하단의 텍스트의 공간 - 핑크색은 padding으로 조절한다.
소스와 결과
소스다운로드
(* 참고로 serverSide - asp,php,jsp 에서 전달받은 정보를 가지고 엘리먼트를 생성해야 하는 목적을 테스트한 코드이므로
append로 추가 하며 사용되었으며, 만약 갯수가 추가되면 다음과 같이 동적으로 추가해서 그려내야 함.)
for ( var i = 0; i<SQL; ++i ){
var code = "<div id='dataDis'" + i +">";
.....
<!DOCTYPE HTML> <HTML> <HEAD> <title></title> <meta charset="utf-8" /> <script type="text/javascript" src="js/jquery-2.0.3.min.js"></script> <script> var path = "sample.jpg"; var desc = "길고긴텍스트인데자동으로중앙정렬이잘될것인가"; var vendor = "linux.png"; var percent = 100; var color = "#00ccff"; </script> </HEAD> <body> <script> $(document).ready(function(){ //append var body = $('body'); var code = ""; code = "<div id='dataDis'>" code+= "<a id='' href='#'>" code+= "<table border='1'>"; code+= "<tr><td id='upTD'>"; code+= "<img id='imgID' src='"+ path +"' />"; code+= "</td></tr>"; code+= "<tr><td id='downTD' style='padding:10px 0 0 0'>"; code+= desc; code+= "</td></tr>"; code+= "</table>"; code+= "</a>"; code+= "</div>"; code+= "<img id='venID' src='"+ vendor +"' />"; body.append(code); //css $('#dataDis').css({ 'position':'absolute', 'left':100, 'top':100 }); $('td').css('text-align','center'); $('#venID').css('position','absolute'); //callBack $('#venID').load(function(){ calculate(); }); }); function calculate(){ //sel var con = $('#dataDis'); var upTD = $('#upTD'); var downTD = $('#downTD'); var img = $('#imgID'); var vendor = $('#venID'); //percent of size var IMG_W = Math.floor( img.width() * percent /100 ); var IMG_H = Math.floor( img.height() * percent /100 ); var VEN_W = Math.floor( vendor.width() * percent / 100 ); var VEN_H = Math.floor( vendor.height() * percent / 100 ); //size of css img.css({'width':IMG_W, 'height':IMG_H}); vendor.css({'width':VEN_W, 'height':VEN_H}); downTD.css('color', color); //abs var DIV_X = $('#dataDis').offset().left; var DIV_Y = $('#dataDis').offset().top; var TD_W = upTD.width(); var TD_H = upTD.height(); //gap var leftGap = Math.floor((TD_W - IMG_W) /2); var topGap = (DIV_Y + TD_H); //vendor vendor.css({ 'left':DIV_X + leftGap - (vendor.width()/2), 'top':topGap - vendor.height()/1.5 }); } </script> </BODY> </HTML>
결과)
'■ 프론트엔드 ■ > HTML' 카테고리의 다른 글
박스모델의 생성 : HTML에서 js까지 (0) | 2014.11.03 |
---|---|
SVG, HTML5, jQuery UI 데모페이지 (0) | 2014.03.12 |
테이블샘플 (0) | 2014.01.16 |
기본엘리먼트 작성하기 - nonCss (0) | 2013.11.26 |
Table (0) | 2013.11.20 |