728x90

정해진 클래스가 아니면 동작이 안된다. bootstrap 3에서 잘 동작하던 걸 MDBootstrap 기반에서 동작되도록 하려면 Class 속성을 정확하게 알아야만 가능한 거 같다.


select 일반 속성을 적용하고자 할 때


<select name="where" class="browser-default custom-select" >
    <option value="unify">통합</option>
    <option value="userNM">성명</option>
    <option value="mNO">휴대폰</option>
</select>


자료 입력을 편하기 위해서 엔터키를 치면 자동으로 검사하는 코드를 추가했더니 먹통이 되는 증상이 보였다.

스마트폰에서는 엔터키를 입력하는 걸 추가하면 안되더라.

그래서 PC에서만 동작하는 코드를 검사하여 추가하는 걸로 코드를 변경했다.

구글링으로 검색해서 찾은 코드로 테스트했더니 잘 안되어서 PHP 코드에서 Device를 검사한 다음에 코드화를 통해서 해당 코드값을 인식하고 자바스크립트 코드는 코드의 하단에 추가하여 순차적으로 읽을 때 PHP 값을 읽을 수 있도록 했다.


<?php require_once 'deviceChk.php';?>

<script>

var device_type = "<?php echo $mtype;?>";

//alert(typeof device_type); // string 으로 인식하는 걸 확인할 수 있다.


if(parseInt(device_type) > 2){ // 정확한 검사를 위해 정수형으로 변환하여 부등 비교를 했음
    $('#BBSSearchKeyword').keypress(function(e){
        e.preventDefault();
        if(e.keyCode == 13 || e.which==13){ // 검색어 입력하고 엔터키를 누르면
            BBSSearch(uri,where,keyword);
        }
    });
}






블로그 이미지

Link2Me

,
728x90

반응형웹은 다양한 디바이스(PC, 노트북, 테블릿, 스마트폰 등)에 최적화된 UI를 제공하게 할 수 있다.
웹사이트의 레이아웃을 만들 때 방문자가 사용하는 모니터의 화면 해상도를 고려해야 한다.
너무 크게 가로폭을 만들면 작은 해상도의 모니터로 접속했을 때 가로 스크롤이 생겨 컨텐츠를 보는 게 불편하기 때문이다.
해상도에 따라 가로폭이나 배치를 변경하여 가독성을 높인다.

이러한 작업을 할 수 있게 해주는 것이 @media 이다. media 쿼리는 장치 특성에 따라 브라우저가 해석해야 할 CSS 코드를 분기 처리하는 규칙이다. 보통 해상도 또는 해상력을 판별하여 분기 처리한다.


CSS3 @media 쿼리는 IE6~8 브라우저에서는 지원되지 않는다. 그래서 Javascript로 구현된 respond.js를 이용해서 이 문제를 해결해야한다. respond.min.js 라이브러리를 사용하면 IE6~8 브라우저도 media 쿼리를 해석할 수 있다.

html5shiv.js 파일을 문서 head 요소 내부에 삽입하면 IE6~8 브라우저도 HTML5 요소를 화면에 표시하게 된다.

하지만 html5shiv.js 파일을 추가해도 새로운 요소들 때문에 화면이 깨지는 증상을 발견할 수 있다. 이유는 display:block 으로 표시를 해야 할 블럭 요소들이 display:inline 으로 랜더링 되기 때문이다.

header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{
  display:block
}

인라인 형태로 표시되던 새로운 HTML5 요소를 블럭 요소로 변경해 준다. 이제 IE 6~8 브라우저도 HTML5 요소를 화면에 제대로 표시하게 된다.

최근에는 IE6~8 사용 거의 안하므로 이런 건 무시하자.


고정으로 보일 영역과 가변으로 보일 영역을 지정한다.
고정 영역에서도 padding 처리, 글꼴 크기 등을 조절하여 디바이스 기기에 따라 변하게 작성한다.


A 영역에는 공용으로 사용할 기본 CSS를 모두 적어준다.

B/C/D/E 영역에는 기본 사항과 공통 요소 값을 다르게 적어주면 해당 해상도에 따라 덮어쓰기가 된다.


  A

/* ########### 599px 이하 ########### */
@media (max-width: 599px) {
  B
}

/* ########### 600px 이상 ~ 767px 이하 ########### */
@media (min-width: 600px) and (max-width: 767px) {
  C
}

/* ########### 768px 이상 ########### */
@media ( min-width: 768px ) {
  D
}

/* ########### 1040px 이상 ########### */
@media ( min-width: 1024px ) {
  E
}



Layout 구성하는 예제를 작성해보자.

가장 먼저 전체 Layout 에서 헤더 중심으로 파일을 살펴본다.

<!doctype html>
<html lang="en">
<head>
<title>반응형 웹 예제</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="./css/main.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>

</body>
</html>


<meta name="viewport" content="width=device-width, initial-scale=1">

webkit 계열 iOS, Android 모바일 브라우저에서 이코드를 해석한다.


jQuery 를 사용하기 위해 https://www.w3schools.com/ 를 참조하여 Header 를 구성하면 편하다.


<link rel="stylesheet" href="./css/main.css">

이제 main.css 파일 내용은 @media 를 사용해서 작성할 것이다.


<body> </body> 사이의 구성할 Layout 은 <div></div> 를 사용한다.

div 태그는 기본 속성이 세로로 하나씩 추가되므로 container 에 가로로 정렬되도록 하려면 별도 처리를 해야 한다.


<body>
<div class="header"></div>
<div class="container">
    <div class="sidemenu"></div>
    <div class="content"></div>
</div>
<div class="footer"></div>
</body>


div 태그 : float 속성으로 가로 정렬 한다.

/* ########### 768px 이상 ########### */
@media ( min-width: 768px ) {
    .container:after {content:"";display:both;clear:both;}
    .sidemenu { float:left; width:160px;}
    .content {float:none; width:auto; margin-left:160px;}
    /* sidemenu 와 content 의 왼쪽 오른쪽의 간격 */
    .sidemenu    {
        padding-right: 10px;
        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
        box-sizing: border-box;
    }
    .footer { 

        clear:both; /* float 속성 적용한 것을 해제하겠다. */

        width:100%;

    }
}

<div class="header"></div>

에는 상단 가로정렬 메뉴를 만들어보자.

<div class="header">
    <nav class="topmenu">
        <ul>
            <li><a href="#">Home</a></li>
            <li><a href="#">메뉴1</a></li>
            <li><a href="#">메뉴2</a></li>
            <li><a href="#">메뉴3</a></li>
            <li><a href="#">메뉴4</a></li>
            <li><a href="#">메뉴5</a></li>
        </ul>
    </nav>
</div>


위와 같은 코드만 추가하면 메뉴는 세로 정렬로 추가된다.

가로 정렬로 추가되도록 하려면 CSS 코드를 추가해줘야 한다.

/* 메뉴(가로 정렬) */
.topmenu ul {    margin: 0; padding: 0; list-style: none; }
.topmenu li a    {
    display: block;
    padding: 7px 10px;
    color: #000000;
    font-size: 14px;
    text-decoration: none;
}
.topmenu li a:hover {background-color: #F7D358;}
.topmenu ul:after    {content: ""; display: block; clear: both;}
.topmenu li {float: left; width: auto;}


header를 바의 형태로 디자인 하려면

.header    {background-color: #58D3F7;}



사이드 메뉴 만들기

    <div class="sidemenu">
        <ul>
            <li><a href="#">Home</a></li>
            <li><a href="#">Side 메뉴1</a></li>
            <li><a href="#">Side 메뉴2</a></li>
            <li><a href="#">Side 메뉴3</a></li>
            <li><a href="#">Side 메뉴4</a></li>
            <li><a href="#">Side 메뉴5</a></li>
        </ul>
    </div> 

 /* 사이드 메뉴(sidemenu) */
.sidemenu ul {margin: 0; padding: 0; list-style: none;}
.sidemenu li a    {
    display: block;
    padding: 5px;
    color: #000000;
    font-size: 14px;
    text-decoration: none;
}
.sidemenu li a:hover {background-color: #eeeeee;}


content 부분

    <div class="content">
        <article class="story">
            <h2>본문 제목</h2>
            <p><img src="img/img_sample.png" alt=""></p>
            <p>본문 내용을 여기에 작성한다.</p>
            <p>김남길과 김아중이 연기한 명불허전은 조선시대 침술대가 허임을 소재로......</p>
        </article>
    </div>

 /* 본문 기사 */
.story h1    {margin-top: 0;    margin-bottom: 10px;font-size: 26px;}
.story p    {margin-top: 0;    margin-bottom: 10px;}
.story img    {max-width: 100%; height: auto}


연습한 Layout 샘플 파일을 첨부한다.

구글에서 "반응형 css 예제" 로 검색하면 참고할 수 있는 자료가 많이 나온다.

div 화면 구성하는 것을 많이 다뤄보면 도움된다.

블로그 이미지

Link2Me

,
728x90

Layout 예제를 만들어가면서 Layout 개념을 좀 더 확실하게 익히려고 한다.


네이버지식인에 답변된 내용을 토대로 좀 수정을 하고 내용을 보강하면서 연습중이다.

bootstrap 관련 css 와 js scrpit 를 연결했더니 좀 이상하게 나와서 관련 사항은 삭제를 했다.

div 태그는 세로 정렬이 기본이다.

가로 정렬을 하기 위해서는 container div 안에 content div, aside div 를 float 로 위치를 설정한다.


<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style type="text/css">
body {background:#FFFFF;}
p {
   font-size:1.5em;
   color:#666;
   text-align:center;
   line-height:80px;
}

.wrap {
   /* 전체를  wrap으로 감싸 브라우저의 사이즈에 상관없이 가운데 정렬되게 만든다.  */
   width:800px; 
   margin:0 auto;
}

.header {
   width:100%;
   height:60px;
   background:#F8ECE0;
}

.container {}

.container div {
   height:160px;
}

.container:after {
    display: block;
    clear:both;
}

.content {
   float:left;
   width:80%;
   background:#D8D8D8;
}

.aside {
   float:left;
   width:20%;
   background:#A9E2F3;
}

.footer {
   clear:both; /* float 영향을 받지 않겠다는 의미 */
   width:100%;
   height:60px;
   background:#81DAF5;
}
</style>    
</head>
<body>
<div class="wrap">
    <div class="header">
        <p>Header</p>
    </div>
    <div class="container">
        <div class="content">
            <p>content</p>
        </div>
        <div class="aside">
            <p>aside</p>
        </div>
    </div>
    <div class="footer">
        <p>Footer</p>
    </div>
</div>

</body>
</html>


블로그 이미지

Link2Me

,
728x90

<div></div> 태그는 Division의 약자로, 레이아웃을 나누는데 주로 쓰인다.
div 태그는 가상의 레이아웃을 설계하는데 쓰이며, 주로 CSS와 연동하여 쓴다.
div와 span 요소는 보통 class 속성을 같이 사용한다.

레이아웃(layout)하는 순서
1. 실제 설계도를 그리는 것처럼 메뉴바, 사이드바, 본문, 하단 등의 배치를 그려본다.
2. 그리고 남들이 직관적으로 이해할 수 있는 이름을 붙인다.
   <div id="navbar"></div>
   <div id="sidemenu"></div>
   <div id="contents"></div>
3. 스타일 주기
   - width : 너비 속성(pixel, % 가능)
   - height : 높이 속성(pixel, % 가능)
   - float : 좌우 정렬 속성(left or right)
   - background-color : 배경색 속성

   - line-height : 1.2 /* 줄 간격(텍스트를 싸고 있는 라인의 기본 높이를 설정) */

     . 숫자 : 현재 글꼴에서 몇 배 크기로 할 지 지정

     . % : 현재 글꼴 크기의 백분율로 높이를 지정

     . 길이 : em, px, pt, cm 등의 고정된 폭

     폰트 사이즈가 12px이고 line-height가 20px 이라면

     그 나머지 8px의 반인 4px씩을 그 위와 아래에 더하게 된다.

     한글의 경우 line-height를 100% 이상으로 지정하여 줄사이의 간격을 좀 띄우는 편이 가독성에 좋다.

     참조 : http://www.tiptech.net/lecture/html/css/line-height.html
4. 여백 주기
   - margin : 객체와 객체 사이의 공간
     margin-top (상단 여백)
     margin-right (오른쪽 여백)
     margin-bottom (아래 여백)
     margin-left (왼쪽 여백)
     table {
      margin: 5px 7px 3px 0px; (위, 오른쪽, 아래, 왼쪽 순임)
     }
5. border : 선 굵기
   - border-width : border의 width 값을 지정
     p {border-top: thick solid #ff0000;} // CSS 문법
     object.style.border="3px solid blue" // 자바스크립트 문법

   - border-style : border의 style 값을 지정 (4방향의 테두리에 적용될 선의 스타일을 지정)
     . none : border 스타일을 지정하지 않는다.
     . hidden : none 속성값과 같다.
     . dotted, dashed, solid, double, groove, ridge, inset, outset
     .inherit : 부모 요소로부터 값을 상속 받는다
     object.style.borderStyle="dotted double" // 자바스크립트 문법

   - border-color : border의 color 값을 지정 (4방향의 테두리에 적용될 색상을 지정)
     h4 {border-color: red;} /* all four borders are red */
  
6. padding : 내용과 border 사이의 공간

7. float 속성

   - float 속성은 자기 자신의 위치를 주변의 콘텐츠로부터 상대적으로 배치하는 속성이다.
   - float 속성은 left, right, none 만 있다.
   - float 속성의 default 는 none(띄우지 않음)이다.
   - inline 으로 float 속성 설정
     <img src="imags.png" style="float:left;" >
   - css 이용한 float 속성 설정
     <style type="text/css">
     img { float:left; }
     </style>

   - float 속성 값을 right 로 지정하면 첫번째 박스부터 순서대로 오른쪽으로 붙게 된다.
   - 이미지에다가 float 속성을 적용하면 이후에 오는 글자나 다른 요소들은 그 사진 주위로 둘러싼 형태가 된다.
     이미지 좌우에 글자가 오는 걸 방지하려면 clear 속성을 설정한다.
     이미지가 float:left 상태인데 clear:left를 해 주면 글자가 글자가 이미지 아래로 내려간다.

   - clear 속성은 float이 더이상 주변 엘리먼트의 배치에 영향을 미치지 않도록 해제시키는 속성이다.


8. div 속성 배우기

    - 아무런 설정을 하지 않은 div는 세로 정렬을 한다.

    - 가로 정렬을 하려면 div 태그로 감싸고 float, width 속성값을 추가한다.

    <div class="boxA">
     <div class="box1">
         BOX1
     </div>
     <div class="box2">
        BOX2
     </div>
    </div>

       <style>
            .boxA {
                border: solid 1px #00a0e9;
                background-color: #a0e0fe;
                color: #00a0e9
            }
            .boxA:after {
                display: block;
                clear: both; // float 의 영향을 받지 않겠다는 의미
            }

            /* BOX1와 BOX2를 가로 정렬 */
            .box1 { float: left; width:50%; }
            .box2 { float: left
; width:50%; }
        </style>


    - 가로로 정렬한 div의 너비가 100%를 넘으면 옆으로 빠져나온 div가 아래로 내려가서 출력된다.

    - box1 div width를 고정(250px)하고 싶다면 ... (왼쪽 div 고정)

            .boxA:after {
                content: "";
                display: block;
                clear: both
            }

            /* BOX1와 BOX2를 가로 정렬 */
            .box1 { float: left; width:250px; }
            .box2 { float: none
; width:auto;margin-left: 250px; }


    - box2 div width 를 고정(250px)하고 싶다면.... (오른쪽 div 고정)

            .boxA:after {
                content: "";
                display: block;
                clear: both;
            }

            .box1 {
                float: left;
                width: 100%;
                margin-right: -250px;
                padding-right: 250px;
                -moz-box-sizing: border-box;
                -webkit-box-sizing: border-box;
                box-sizing: border-box
            }

            .box2 {
                float: left;
                width: 250px
            }


     - 반응형 웹 다지인 : 브라우저 화면의 크기에 따라 가로정렬, 세로정렬 상태를 변경

       . 반응형 웹 : Device 가 모바일, 테블릿, PC에 구분없이 이용 가능한 템플릿을 이용하여 개발한다.

       . https://startbootstrap.com/ 에서 템플릿을 다운로드 한다.

       . 템플릿을 수정하여 화면의 변화를 확인하면서 class 의 내용을 확인한다.

       . 직접 작성하는 반응형 웹 디자인은 "모던 웹사이트 디자인의 정석" 책과

         홈페이지에서 소스코드를 받아서 직접 테스트하면서 해보면 도움된다.


9. 색상 선택

    - https://html-color-codes.info/Korean/ 에서 색상을 선택하면 관련 코드가 나온다.

    - 기본적인 활용 코드는 http://www.color-hex.com/ 를 참조하면 좋다.

    - https://www.w3schools.com/colors/colors_names.asp 에서 다양한 색상을 참조할 수 있다.

   

회색

#888888

 청록색

#7cbac1

 회색

#eeeeee

밝은 하늘색

#94ecf6

 흰색

#ffffff

하늘색

#75dbe7

 검정색

#000000

 

 


10. 스마트폰 레이아웃 주의사항

- overflow 속성을 사용해서 스크롤을 넣을 수 없다.
- 스마트폰은 hover가 없다. 그래서 hover, active 등 상태 선택자를 사용할 때 주의해야 한다.
- 동위 선택자에 제한이 있다.
- 선택자에 ~를 지원하지 않는 브라우저가 있다.
- iphone에서는 label 태그에 onclick="" 속성을 부여해야 정상 동작한다.
- 그래디언트를 적용할 수 없을 수 있다.



출처: http://link2me.tistory.com/567?category=831192 [소소한 일상 및 업무TIP 다루기]

- overflow 속성을 사용해서 스크롤을 넣을 수 없다.
- 스마트폰은 hover가 없다. 그래서 hover, active 등 상태 선택자를 사용할 때 주의해야 한다.
- 동위 선택자에 제한이 있다.
- 선택자에 ~를 지원하지 않는 브라우저가 있다.
- iphone에서는 label 태그에 onclick="" 속성을 부여해야 정상 동작한다.
- 그래디언트 적용이 불가할 수 있다.

블로그 이미지

Link2Me

,
728x90

네이버지식인에 질의사항이 있어서 간단하게 테스트해본 예제를 첨부한다.

최신버전 다운로드는 https://github.com/stevenwanderski/bxslider-4 에서 한다.

당연히 jQuery도 시간이 지나면서 버전이 업그레이드 되어 왔고, 이에 맞춰 bxslider 역시 jQuery 버전에 맞춰 개발되었을 확률이 높다.

버전에 맞게 하려면 위 사이트에서 파일을 최신버전으로 받고, jQuery 버전은 https://www.w3schools.com/jquery/default.asp 에서 확인하시라. 


bxslider.zip


http://bxslider.com/ 사이트에 받은 파일중에서 필요한 파일만 js, css 폴더에 복사한다.

아래 코드 중에서 색상을 별도 표시한 부분을 중점적으로 보면 금방 이해할 수 있다.


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex,nofollow"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="pragma" content="no-cache" />
<!-- jQuery library (served from Google) -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<!-- bxSlider Javascript file -->
<script src="./js/jquery.bxslider.min.js"></script>
<!-- bxSlider CSS file -->
<link href="./css/jquery.bxslider.css" rel="stylesheet" />
<script>
$(document).ready(function(){
  $('.bxslider').bxSlider();
});
</script>
</head>
<body>
<ul class="bxslider">
  <li><img src="./images/img_01.jpg" /></li>
  <li><img src="./images/img_02.jpg" /></li>
  <li><img src="./images/img_03.jpg" /></li>
  <li><img src="./images/img_04.jpg" /></li>
  <li><img src="./images/img_05.jpg" /></li>
</ul>   
</body>
</html>


------------------------------------------------------------------------------------------------------------------------

  <li><img src="./images/img_01.jpg" /></li>
  <li><img src="./images/img_02.jpg" /></li>
  <li><img src="./images/img_03.jpg" /></li>
  <li><img src="./images/img_04.jpg" /></li>
  <li><img src="./images/img_05.jpg" /></li>
파일명을 일일이 적기가 귀찮다면 PHP 를 이용해서 해당 폴더 images 를 읽어서 파일 갯수만큼 표시되도록 코드를 만들어도 된다.


<body>
    <?php
    $path = "./images"; // 오픈하고자 하는 폴더
    function getFileNames($directory) {
        $results = array();
        $handler = opendir($directory);
        while ($file = readdir($handler)) {
            if ($file != '.' && $file != '..' && is_dir($file) != '1') {
                $results[] = $file;
            }
        }
        closedir($handler);
        return $results;
    }
?>
<ul class="bxslider">
<?php
    foreach(getFileNames($path) as $value){
        echo '<li><img src="./images/'.$value.'" /></li><\n>';
    }
?>
</ul>
</body>


로 코드를 대체하면 된다.

블로그 이미지

Link2Me

,
728x90

현재 경로 설정을 매번 수동으로 일일이 지정하려니까 귀찮아서 구글링으로 찾은 소스를 수정해서 구현했다.

구글에서 찾은 함수 pathUrl 는 http://localhost/ 라는 명칭을 찾아준다.

이런 방법으로 경로를 지정하면 보안 강화로 인해서 url forwarding 문제가 생긴다.


파일을 include 해서 사용하다보니 경로 설정에서 문제가 생기더라.

현재 실행되는 파일의 위치를 기준으로 경로를 인식해서 처리한다.

그러므로 홈페이지의 소스가 설치된 기준 위치를 어디로 정할 것인가를 고려해서 사용하면 된다.


<?php
$cur_root = pathUrl();
$g = array(
    'path_root'   => $cur_root,
    'path_core'   => $cur_root.'_core/',
    'path_config'   => $cur_root.'_core/config/',
    'path_tmp'    => $cur_root.'_tmp/',
    'path_layout' => $cur_root.'layout/',
    'path_module' => $cur_root.'modules/',
    'path_plugin' => $cur_root.'plugin/',
    'path_bootstrap' => $cur_root.'plugin/bootstrap/',
    'path_page'   => $cur_root.'pages/',
    'path_file'   => $cur_root.'files/'
);

function pathUrl($dir = __DIR__){
    $root = "";
    $dir = str_replace('\\', '/', realpath($dir));

    //HTTPS or HTTP
    $root .= !empty($_SERVER['HTTPS']) ? 'https' : 'http';

    //HOST
    $root .= '://' . $_SERVER['HTTP_HOST'];
    $web_root = $root;

    //ALIAS
    if(!empty($_SERVER['CONTEXT_PREFIX'])) {
        $root .= $_SERVER['CONTEXT_PREFIX'];
        $root .= substr($dir, strlen($_SERVER[ 'CONTEXT_DOCUMENT_ROOT' ]));
    } else {
        $root .= substr($dir, strlen($_SERVER[ 'DOCUMENT_ROOT' ]));
    }

    $root = substr($root,strlen($web_root),strlen($root));
    //$root .= '/';

    // 홈페이지 기준점을 http://domain/abc/ 로 설정한 경우에는 -2 를 해준다.
    $cnt = count(explode("/",$root)) -2; // 현재 경로 구하기

    switch($cnt){  // 상대경로 설정
        case 0:
            $cur_root = './';
            break;
        case 1:
            $cur_root = '../';
            break;
        case 2:
            $cur_root = '../../';
            break;
        case 3:
            $cur_root = '../../../';
            break;
        case 4:
            $cur_root = '../../../../';
            break;
        case 5:
            $cur_root = '../../../../../';
            break;
    }

    return $cur_root;
}
?>



사용법 예제

<?php
if(!isset($_SESSION)) {
    session_start();
}
require_once 'path.php';
session_save_path($g['path_tmp'].'session');

require_once $g['path_config'].'dbconnect.php';
require_once $g['path_config'].'config.php';

if(isset($_SESSION['userid'])){
    $userid = $_SESSION['userid'];
}

$m = isset($_GET['m'])? $_GET['m']:'';
?>

블로그 이미지

Link2Me

,
728x90

<?php
if(isMobile()){
    //include_once("m.php");
    echo 'Mobile';
}else{
    //include_once("pc.php");
    echo 'Windows';
}

// 접속 디바이스가 모바일인지 검사
function isMobile() {
        return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
}
?>


블로그 이미지

Link2Me

,
728x90

https://startbootstrap.com/template-overviews/sb-admin-2/ 사이트에서 무료 Layout 을 하나 받아서 분석을 해봤다.


전체적인 Layout 구조하에서 테이블 Layout 이 어떻게 배치되는지를 집중적으로 분석했다.

테이블 Layout 구글검색을 해도 실제 테이블 부분만 다루고 있더라.

전체 Layout 에서 배치되는 영역까지는 찾아보기가 쉽지 않다.


본문 영역에 테이블이 배치되는 구조는 아래와 같다.

<div id="page-wrapper">

<div class="row"></div> <!-- 하나의 테이블 처리 div -->
<div class="row"></div>
<div class="row"></div>
<div class="row"></div>

</div>


css 파일에는 PC와 스마트폰(768px 이하)로 구분 처리하고 있다.

css 파일을 본인이 작성하는 css 에 내용을 추가하거나 상황에 맞게 수정해서 사용하면 된다.

#page-wrapper {
  padding: 0 15px;
  min-height: 568px;
  background-color: white;
}
@media (min-width: 768px) {
  #page-wrapper {
    position: inherit;
    margin: 0 0 0 250px;
    padding: 0 30px;
    border-left: 1px solid #e7e7e7;
  }
}


  /* 세로 방향 타블렛부터 가로 방향 타블렛과 데스크탑까지 */
 @media (min-width: 768px) and (max-width: 979px) { ... }
 
 /* 가로 방향 스마트폰부터 세로 방향 타블렛까지 */
 @media (max-width: 767px) { ... }
 
 /* 가로 방향 스마트폰 이하 */
 @media (max-width: 480px) { ... }


The Bootstrap grid system has four classes:
 - xs (for phones)
 - sm (for tablets)
 - md (for desktops)
 - lg (for larger desktops)
 


<div class="col-lg-12"> 를 적용하면 PC화면에 하나의 테이블이 화면 전체를 채운다.


<div class="row">
    <div class="col-lg-12">
        <div class="panel panel-default">
            <div class="panel-heading">
                테이블 제목 1
            </div>
            <div class="panel-body">
                <table width="100%" class="table table-striped table-hover" id="tables-example">
                    <thead>
                        <tr>
                            <th>#</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>1</td>
                        </tr>
                    </tbody>
                </table>
            </div><!-- .panel-body -->
        </div><!-- .panel -->
    </div><!-- .col-lg-12 -->
</div><!-- .row -->


만약 공지사항이나 메인화면처럼 화면에 여러개의 테이블을 표시하고 싶은 경우, 즉 왼쪽과 오른쪽에 두개의 테이블을 배치하고 싶은 경우에는 어떻께 할까?

<div class="col-lg-12"> 의 절반인 <div class="col-lg-6"> 를 두개 표시해준다.

그러면 PC화면에서는 2개의 테이블이 나란히 보이고 스마트폰에서는 자동으로 한테이블씩 나열해서 보여준다.


<div class="row">
    <div class="col-lg-6">
        <div class="panel panel-default">
            <div class="panel-heading">
                테이블 제목 2
            </div>
            <div class="panel-body">
                <table width="100%" class="table table-striped table-hover" id="tables-example">
                    <thead>
                        <tr>
                            <th>#</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>1</td>
                        </tr>
                    </tbody>
                </table>
            </div><!-- .panel-body -->
        </div><!-- .panel -->
    </div><!-- .col-lg-6 -->
</div><!-- .row -->


<div class="row">
    <div class="col-lg-6">
        <div class="panel panel-default">
            <div class="panel-heading">
                테이블 제목 3
            </div>
            <div class="panel-body">
                <table width="100%" class="table table-striped table-hover" id="tables-example">
                    <thead>
                        <tr>
                            <th>#</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>1</td>
                        </tr>
                    </tbody>
                </table>
            </div><!-- .panel-body -->
        </div><!-- .panel -->
    </div><!-- .col-lg-6 -->
</div><!-- .row -->


이제 기존에 어설프게 table layout 처리했던 걸 전체 Layout 상에서 움직이도록 수정해야겠다.

기존에 작성 연습했던 topmenu.php Layout 과 조합해서 구조를 그려보자.

sidebar 는 2, content 는 10 (bootstrap grid system 은 12개의 화면 분할 구조로 처리)


<main class="container-fluid">
    <div class="container main-container">
        <div class="col-md-2 sidebar">
            <div class="row">
            </div>
        </div>

        <!-- Main 화면 -->
        <div class="col-md-10 content">
            <div class="row">
                <div class="col-md-12">
                    <div class="panel panel-default">

                        <div class="panel-heading">

                           <!-- 제목 적어주기 -->

                        </div>

                        <div class="panel-body">
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</main>

블로그 이미지

Link2Me

,
728x90

jQuery Mobile 템플릿을 사용하여 Layout 기본 구조를 파악해보자.



jQuery Mobile 에 대한 자세한 설명은 http://www.w3schools.com/jquerymobile/default.asp 에서 영문으로 찬찬히 읽어가면서 습득하면 도움된다.

jQuery Mobile 버전이 달라지면서 표시되는 색상도 변경될 수 있으므로 무조건 버전을 높은걸 사용하는게 좋지 않을 수도 있다. 높은 버전을 사용하면 변경된 부분을 파악해서 수정해주어야 한다.


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="pragma" content="no-cache" />

<!-- Include meta tag to ensure proper rendering and touch zooming -->
<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, width=device-width" />

<!-- Include jQuery Mobile stylesheets -->

<link href="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.css" rel="stylesheet" type="text/css" />

<!-- Include the jQuery library -->

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

<!-- Include the jQuery Mobile library -->

<script src="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.js"></script>
</head>


<body>
<div data-role="page">
    <div data-role="header" data-position="fixed" data-theme="b">
        <h1>Header title</h1>
    </div>
    <div id="content" data-role="content" data-theme="e">
        <ul data-role="listview">
        <?php
            echo  '<li>';
            echo  '<a href="#">목록이 없습니다.</a>';
            echo  '</li>';
        ?>
        </ul>
    </div>
    <div data-role="footer" data-position="fixed" data-theme="d">
        <table>
        <tr>
        <td width="15%"><a href="index.html" data-role="button" data-icon="plus" data-iconpos="left">추가</a>
        </td>
        <td width="70%" align=center>Footer Title</td>
        <td width="15%"></td>
        </tr>
        </table>
    </div>
</div>
</body>
</html>


일반적인 웹 사이트의 경우 1 페이지 = 1 HTML 파일이지만, jQuery Mobile 에서는 data-role 속성 'page'를 갖는 div 요소가 1페이지가 된다.

http://www.w3schools.com/jquerymobile/tryit.asp?filename=tryjqmob_pages

에서 보면 1 페이지 안에
<div data-role="page" id="pageone">

<div data-role="page" id="pagetwo">

로 구분하여 작성된 것을 실행해 볼 수 있다. 즉 HTML 페이지는 1Page이지만, jQuery Mobile 에서는 2Page 인 것처럼 만들 수 있다는 의미다.


data-theme="b" 를 사용하여 테마를 변경할 수 있다. (a ~ e 까지 5개 테마)

data-inset="true" 는 모서리를 둥글게 처리

data-split-icon="gear" : 스플릿된 우측모양이 기어모양

data-position="fixed" : 하단에 고정하는 기능

data-rel="dialog" : 다이얼로그 팝업창으로 띄워라

<div data-role="header" data-add-back-btn="true" data-back-btn-text="이전">

data-add-back-btn="true" : Back 버튼 표시

data-back-btn-text="뒤로" : 라벨 변경

<ul data-role="listview" data-theme="e" data-inset="true">

data-theme="e" : 리스트 테마의 변경

data-inset="true" : 모서리를 둥글게 처리

<li data-theme="b" >

data-theme="b" : 해당 항목만 별도로 리스트 테마 변경

<li data-role="list-divider">

data-role="list-divider" : 리스트에 제목 설정

<span class="ui-li-count">10</span><!-- class="ui-li-count" 은 카운트 버블 표시 -->

<ul data-role="listview" data-count-theme="b" data-filter="true" data-filter-placeholder="검색어">
        <!--data-count-theme="c" : 카운드 버블의 테마 변경 -->
        <!--data-filter="true" : 검색 필터 => 일치하는 검색어만 표시됨 -->
        <!--data-filter-placeholder="검색어" : 플레이스 홀더 변경 -->
        <li><a href="#index" data-transition="slideup">
        <!--data-transition="slideup" 위쪽으로 슬라이드되면서 페이지 전환 -->
        <h3>메인 페이지</h3>
        </a></li>
        <li><a href="#about" data-transition="slide">
         <!--data-transition="slide" 왼쪽으로 슬라이드되면서 페이지 전환 -->

data-transition="flip"

data-transition="flip" data-direction="reverse"

<li><a href="#access" data-transition="slide">
    <p class="ui-li-aside">보충정보 표시</p>
    <!--class="ui-li-aside" 속성 추가시 보충정보 표시됨 -->
    <h3>오시는 길</h3>
    <p>설명 내용</p> <!-- 설명문이 있는 리스트 표시됨 -->
    <span class="ui-li-count">99</span>
    <!-- class="ui-li-count" 은 카운트 버블 표시 -->
</a></li>
<li><a href="#contact" data-transition="pop">
    <p class="ui-li-aside">보충정보 표시</p>
    <!--class="ui-li-aside" 속성 추가시 보충정보 표시됨 -->
    <h3>문의</h3>
    <p>설명 내용</p> <!-- 설명문이 있는 리스트 표시됨 -->
</a></li>

<div data-role="content">
    <form action="form.php" method="post">
        <div data-role="fieldcontain">
            <label for="name">이름</label>
            <input type="text" id="name"><!-- id는 전체 소스 기준으로 중복되지 않게 처리해라. -->
        </div>
        <div data-role="fieldcontain">
            <label for="gender">성별</label>
            <select name="gender" id="gender" data-role="slider"><!--플립스위치 표시 -->
            <option value="남자">남자</option>
            <option value="여자">여자</option>
            </select>
        </div>
        <div data-role="fieldcontain">
            <fieldset data-role="controlgroup">
                <legend>주제별 문의</legend>
                <input type="checkbox" name="type1" id="type1" value="수주">
                <label for="type1">프로그램 수주</label>
                <input type="checkbox" name="type2" id="type2" value="기획">
                <label for="type2">프로그램 기획</label>
                <input type="checkbox" name="type3" id="type3" value="개발">
                <label for="type3">프로그램 개발</label>
                <input type="checkbox" name="type4" id="type4" value="배포">
                <label for="type4">프로그램 배포</label>
            </fieldset>
        </div>
        <div data-role="fieldcontain">
            <label for="comment">문의 내용</label>
            <textarea id="comment"></textarea>
        </div>
        <div data-role="fieldcontain">
            <input type="button" value="취소" data-theme="a" data-icon="delete" data-inline="true">
            <input type="submit" value="전송" data-theme="a" data-icon="arrow-r" data-inline="true">

        </div>
    </form>

</div>


jQuery 아이콘 모양은 http://demos.jquerymobile.com/1.4.5/icons/ 에서 참조하면 된다.

data-role 의 설명은 http://blog.naver.com/kimchangyoun/70184929188 참조


블로그 이미지

Link2Me

,
728x90

코딩을 배우면서 느끼는 것은 기본기가 중요하다는 것이다.

그래서 기초적인 걸 다시 정리차원에서 적어둔다.


HTML5의 기본적인 템플릿 구조는 이렇게 되어 있다.

스마트폰에서 접속하는 걸 고민하지 않게 하는 한줄이 viewport 기능이다.


익스플로러의 최대 단점은 버전별로 보여지는 웹의 모습이 많이 다르다는 것이다.
마이크로소프트사는 X-UA-Compatible 태그로 웹의 호환성을 지정할 수 있도록 하였다.
바로  X-UA-Compatible 태그다.
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<meta http-equiv="X-UA-Compatible" content="IE=9" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
edge라고 기록된건 IE 브라우저의 최신 버전의 엔진을 사용하라는 뜻이다.
모든 버전에서 사용가능한 사이트라고 하면 edge만 추가해주면 된다.



<!DOCTYPE html> <!--HTML5 선언 -->
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/><!--화면 사이즈를 고려하지 않아도 적절하게 표시 -->
        <meta http-equiv="X-UA Compatible" control="IE=edge,chrome=1" /> <!--브라우저 호환성 설정 -->
        <title>HTML 서식</title>

        <!-- Include the jQuery library -->
        <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
    </head>
    <body>
        문서본문
    </body>
</html>


HTML5 에서는 <script type="text/javascript"를 넣지 않아도 된다.

Web은 HTTP(Hyper Text Transfer Protocol) 라는 프로토콜에 따라 서버와 클라이언트 간의 통신을 수행한다.
HTML은 태그를 통해 정보를 구조화한다.
태그란?
- 문서의 글자크기, 글자색, 글자모양, 그래픽, 링크 등을 정의하는 명령어
- 꺽쇠괄호 ‘<>’를 사용 <html>
- 일반적으로 태그는 시작과 끝을 표시하는 2개의 쌍 <table></table>
- 태그의 종류는 엄청 많다. 문법과 용도에 맞게 사용해야 한다.
Web browser마다 랜더링 방식이 서로 달라 HTML5가 나왔다.
- HTML에 화면 표시와 관련된 태그까지 추가하게 되자 간단하게 해결하고자
  CSS(Cascading Style Sheets)가 담당하게 했다.


화면에 정보를 보여주는 방법으로 가장 많이 사용하는 것이 테이블이다.

테이블은 table 태그를 사용한다.
테이블 선언 <table></table>
- 테이블 행은 <tr>을 사용
- 행을 셀로 분할하는 태그는 <td>를 사용, 제목 태그는 <th>를 사용
- 테이블의 너비, 테두리, Padding, 셀간격, 경계설정 등은 CSS를 사용
- CSS 는 head에 정의한다.
  <style>
    table,tr,td {border:1px solid #000000}
  </style>


테이블에서 셀간에 병합을 하는 것은 셀에 해당하는 <tr>, <th> 테그이다.

영어로 행에 해당하는 row, 열에 해당하는 column 을 사용하여

위아래 행을 병합하는 것은 <tr rowspan="합치고 싶은 만큼의 숫자">

같은 행에서 옆으로 병합하는 것은 <tr colspan="합치고 싶은 만큼의 숫자"> 로 하면 된다.


테이블에서 실제 정보가 표현되는 것은 <tr> 태그이다.

예제를 살펴보자.

DB와 연결하기 위해 DB 연결파일을 include 하고 나서, 테이블 태그를 작성하고 실제 내용을 채울 곳은 while 문으로 반복해서 <tr><td>내용</td></tr> 구조로 작성된 것을 알 수 있다.


<?php
include_once 'dbconnect.php'; // DB 연결

echo '<table border="1">';
// 제목
echo '<tr>';
echo '<th ALIGN=CENTER BGCOLOR="#9DEEE1">번호</td>';
echo '<th ALIGN=CENTER BGCOLOR="#9DEEE1">구분자</td>';
echo '<th ALIGN=CENTER BGCOLOR="#9DEEE1">연관번호</td>';
echo '</tr>';

$sql = "SELECT uid, classname, relateduid FROM category ORDER BY uid DESC";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result) ){ // DB에서 가져온 갯수만큼 테이블 행 생성
    // 내용
    echo '<tr>';
    echo '<td ALIGN=CENTER>'.$row['uid'].'</td>';
    echo '<td ALIGN=CENTER>'.$row['classname'].'</td>';
    echo '<td ALIGN=CENTER>'.$row['relateduid'].'</td>';
    echo '</tr>';
}
echo '</table>';

?>


Web 에서의 특수문자

공백

&nbsp;

>

&gt;

 <

&lt;


블로그 이미지

Link2Me

,