안녕하세요 flexBox Model 중


flex-direction( 플렉스 - 방향 ) 에 대해서 작성 하려고 합니다. ( 테스트한 전체 코드는 포스팅 하단에 있습니다. )


flex-direction


  • row (default)
  • row-reverse
  • column
  • column-reverse


  • flex-direction 이라 함은 컨테이너 내부의 아이템들이 만들어지는 방향을 뜻 합니다.

     



    안의 초록 박스가 Items (이후에도 계속 해당 방식으로 작성 하려고합니다. )


    겉의 빨간 줄? 로 덮여진 박스가 Container 라고 보시면 됩니다.


    1.  row (default)



    좌 -> 우로 만들어지는 방식이며

    <container>

    <box>

    <box>

    <box>

    <box>

    </container> 상태에서 <box>태그를 하나 더 추가한다면 점선으로 되어있는 쪽에 추가가 될 것입니다.

    - 결과 화면


    2. row-reverse


    row의 리버스 형태로 우 -> 좌로 만들어지는 형태입니다. 아이템을 추가할때 마다 우측에서 붙습니다. 


    - 결과 화면



    3. column


    위 에서 아래로 붙습니다. 새로운 아이템 추가시 위 부터 차례로 붙습니다.


    - 결과 화면



    4. column-reverse





    column 의 리버스 형태로 아래에서 위로 생성 됩니다. 새롭게 생성되는 아이템은 가장 최상단 부터 생성됩니다.

    - 결과 화면 






    확인 코드 (html) 그대로 복붙 하셔서 test.html 로 만들면 됩니다.!




    
    
    <!DOCTYPE html>
    <html>
    <head>
          <meta charset="utf-8">
          <title> CSS3 FlexBox </title>
    <head>
    <style>
    /* padding 및 border를 width 와 height 에 포함한다.  margin X  > box-sizing:border-box */
    *{
          box-sizing:border-box;
          
    }
    html,body{
       display:-webkit-flex;
       display:flex;
    
       flex-wrap:wrap;
       -webkit-flex-wrap:wrap;
       
       width:100%;
       height:100%;
       padding:0;
       margin:0;
    }
    
    header{
       display:flex;
       flex-direction:row;
       width:100%;
       height:80px;
       background-color:#DAD9FF;
       text-align:center;
    }
    
    div#bodyLayout{
       display:flex;
       
       width:100%;
       height:calc(100% - 180px);
    }
    
    nav {
       display:flex;
       width:10%;
       height:100%;
       background-color:#4641D9;
       color:white;
    }
    
    article{
       display:flex;
       flex-direction:column;
       width:90%;
       height:calc(100%);
       background-color:#FFD9EC;
       border : solid 3px black;
       padding: 15px;
       overflow-y:auto;
    }
    
    article .block{
          display:flex;
          flex-direction:row;
          align-items :center;
          border : solid 2px #FF007F;
          padding :2px;
          width:100%;
          min-height:80px;
          
          overflow-x:auto;
          overflow-y:hidden;      
          margin-bottom:3px;
        
          font-size:12px;
          font-weight:700;
     
    }
    article .columnblock{
          display:flex;
          flex-direction:row;
          align-items :center;
          border : solid 2px #FF007F;
          padding :2px;
          width:100%;
          min-height:200px;
          
          overflow-x:auto;
          overflow-y:hidden;
          margin-bottom:3px;
          
          font-size:12px;
          font-weight:700;
    
    
    
    
    }
    article span{
          line-height: 30px; 
          display:inline-block;
          vertical-align:middle;
          background-color:aquamarine;
          text-align:center;
          height:30px;
          width:30px;
          margin:5px;
        
    
    }
    footer{
       width:100%;
       height:100px;
       background-color:orange;
    }
    
    </style>
       <body>
             <header>
                   header 태그입니다.   
                <div style="display:flex;width:250px;height:50px; border : solid 2px #FF007F;
                align-items:center;align-self:center;justify-content:center;margin:0px 50px 0px 0px;
                font-size:10px;font-weight:600;">
                      flex-Container 테스트 
                </div>
                <div style="display:flex;width:250px;height:50px; border : solid 2px #E1FF36;
                align-items:center;align-self:center;justify-content:center;
                font-size:10px;font-weight:600;">
                      flex-Items 테스트 
                </div>
             </header>
             <div id="bodyLayout">
                <nav>
                   <ul>
                      <li>nav Tag</li>
                   </ul>
                </nav>
                
                <article>
                      <div class="block">
                            <div style="display:flex">
                                  <span></span><span></span><span></span><span></span>
                            </div>            
                            display:flex
                      </div>
    
                      <div class="block">
                                 <div style="display:flex;flex-direction:row">
                                   <span>A</span><span>B</span><span>C</span><span>D</span>
                                 </div>         
                            display:flex </br>
                            flex-direction  : row (default)   
                      </div>
                      
                    
                      <div class="block">
                                  <div style="display:flex;flex-direction:row-reverse">
                                   <span>A</span><span>B</span><span>C</span><span>D</span>
                                  </div>       
                                  display:flex</br>
                                  flex-direction  : row-reverse</br>     
                      </div>
    
    
                      <div class="columnblock">
                            <div style="display:flex;flex-direction:column">
                             <span>A</span><span>B</span><span>C</span><span>D</span>
                            </div>       
                            display:flex</br>
                            flex-direction  : column</br>     
                      </div>
    
                      <div class="columnblock">
                            <div style="display:flex;flex-direction:column-reverse">
                             <span>A</span><span>B</span><span>C</span><span>D</span>
                            </div>       
                            display:flex</br>
                            flex-direction  : column-reverse</br>     
                      </div>
    
                </article>
             </div>
          
             <footer>
                      footer 입니다.
             </footer>
          <script>
             window.addEventListener('load',function(){
                    console.warn('onLoad flexBox Test')
             });   
             
             window.addEventListener('unload',function(){
                     alert("unLoad flexBox Test");
             });   
             /*
                load = 페이지를 전부 다 읽어 들인 후 발생
                unload = 페이지로부터 빠져나갈때 빨생  
                
                
             */
       
          </script>
    
       </body>
    </html>
    
    
    


    flex Box 모델


    기존에 사용하던 inline inline-block , table 등이 아닌 flex라는 모델이 CSS3에서 도입되었습니다.


    flex에서 가장 좋았던 점은 세로 수직 정렬이든 여러 정렬등이 너무 편리하게 동작할수 있다는 점이고


    flex박스에 장점은 동적은 변경 가능한 순서를 지정하고 사용할 수 있는 공간내에서 자동으로 너비와 높이를 지정 할 수 있습니다.


    이제부터 flex display 로만 화면을 구성해볼겁니다.


    아래의 화면도 전부 flex로 구성되어있으며  아래 화면에 대한 html 코드 리뷰를 하고 


    다음 포스팅부터는 flex의 속성 하나하나 훑어볼 예정입니다.


    기준은 Chrome을 기준으로 하겠습니다.  IE에 대한 트러블 슈팅은 따로 ..







    
    
    <!DOCTYPE html>
    <html>
    <head>
          <meta charset="utf-8">
          <title> CSS3 FlexBox </title>
    <head>
    <style>
    /* padding 및 border를 width 와 height 에 포함한다.  margin X  > box-sizing:border-box */
    *{
          box-sizing:border-box;
          
    }
    html,body{
       display:-webkit-flex;
       display:flex;
      
       
       flex-wrap:wrap;
       -webkit-flex-wrap:wrap;
       
       width:100%;
       height:100%;
       padding:0;
       margin:0;
    }
    
    header{
       width:100%;
       height:80px;
       background-color:#DAD9FF;
    }
    
    div#bodyLayout{
       display:flex;
       
       width:100%;
       height:calc(100% - 180px);
    }
    
    nav {
       display:flex;
       width:10%;
       height:100%;
       background-color:#4641D9;
       color:white;
    }
    
    article{
       display:flex;
       width:90%;
       height:100%;
       background-color:#FFD9EC;
       border : solid 3px black;
       overflow-y: auto;
    }
    footer{
       width:100%;
       height:100px;
       background-color:orange;
    }
    
    </style>
       <body>
             <header>
                   header 태그입니다.
             </header>
             <div id="bodyLayout">
                <nav>
                   <ul>
                      <li>nav Tag</li>
                   </ul>
                </nav>
                
                <article>
                   flex 테스트 본문입니다.
                </article>
             </div>
          
             <footer>
                      footer 입니다.
             </footer>
          <script>
             window.addEventListener('load',function(){
                    console.warn('onLoad flexBox Test')
             });   
             
             window.addEventListener('unload',function(){
                     alert("unLoad flexBox Test");
             });   
             /*
                load = 페이지를 전부 다 읽어 들인 후 발생
                unload = 페이지로부터 빠져나갈때 빨생  
                
                
             */
       
          </script>
    
       </body>
    </html>
    



    flex-wrap :  body랑 html 에 해당 flex-wrap:wrap


    을 지정한 이유는 기존의 inline-block 이나 inline, block 을 통해서 적용시 였으면


    header가 100%로 잡혀있고 div는 기본 block 형식이니 화면을 꽉채울거라 생각 했지만


    flex의  경우 flex-wrap 이 기본(default)이 nowrap 으로 되어있다보니


    지정을 안할시에는 이와같이 나타납니다. 위의 코드를 받아서 지워보시고 확인해 보시면 됩니다.


    nowrap 은 한정된 영역내에서 자동으로 너비와 높이를 잡아 주게 되며


    flex-wrap 을 wrap 으로 지정하게되면 맨 처음 사진과같이 넘치면 아래줄로 넘기게됩니다.


    그래서

    width 기준 


    [ Header 100% ]

    [ nav 10% article 90% ]

    [ footer 100% ]


    을 가지게됩니다. 또한 * {

    box-sizing:border-box; 부분은 왜 했을까 할수도있는데요 

    }


    article을 보시면 border 에 3px가 들어가있습니다. border-box가 아닌 일반 박스모델에서 는 width 90% 를 하였어도 border를 지정하면 해당값을 제외 하고 계산하기때문에 넘쳐서 아래로내려가는 현상이 발생합니다.



    box-sizing을 지우니 해당과같이 아래의 border가 덮여지게됩니다.


    이것을 해결하기 위해 width 에 border를 포함하는 방법이 box-sizing: border-box입니다. 모든 레이아웃에


    적용하기 위해서 *{ }를 지정하였습니다.



    지정하게되면 이와같이 사이즈에 포함 시키기 때문에 문제가 발생하지않습니다.


    box-sizing을 따로 작성하도록 하며 border-box는 border와 padding만 계산하고 margin 은 계산하지 않기 때문에


    margin 에 대한 처리는 따로 해주어야 합니다.


    이후 포스팅은 분홍 부분에다가 관련 코드를 작성 하도록 하겠습니다.


    이외에 flex 에 대한 설명이 있는 사이트가 있는데 링크 남깁니다.

    * 너무 잘되어있어서 이거보다 자세히 설명은 .. 

    // flex 설명 

    https://css-tricks.com/snippets/css/a-guide-to-flexbox/

    http://www.beautifulcss.com/archives/2812 

    // flex 구버전 사용

    https://css-tricks.com/using-flexbox/


    HTML5 까지의 기본 적이 역사(?) 에 대해 나열해 보았습니다.


    HTML 등장시기 1991년 에 나왔으며 1993에 공식 발표 


    HTML 1.0 - 1991년 10월 

    HTML 2.0 - 1995년 11월

    HTML 3.2 - 1997년 1월

    HTML 4.0 - 1997년 12월

    HTML 4.01 - 1999년 12월

    HTML5 - 2008년 1월, 2014년 10월 현재 권고안 (Recommendation) 확정


    p 태그로 감싸진 문장이 있다면 문단 (Paragraph)로 인식하게 됨 > 태그가 없는 경우에는 그냥 단순 텍스트로 표시합니다.


    태그는 단독 사용형 태그와 시작 - 끝 형의 태그가 있습니다.


    1. 단독 사용형  > img , hr , br 


    2. 시작 - 끝 태그 영역형  html,body,head,title, div, p, h1~h5

    <html> </html> 이런식


    html 태그 - 이 문서는 HTML 로 마크업 되어 있다 라는 것을 알려주기 위한 태그 해당 태그 안쪽에는 다른 태그들이 들어가 제 역할을 수행하게 됩니다.

    head 태그 - html 태그 앞에 붙으며  문서를 웹 브라우저가 읽어들일 떄 우선적으로 처리해야 하는 사항들이 들어가게 된다.

    head 태그 안에는  <title>, <meta>,<link>,<script>,<style> 태그가 위치

    <title> - HTML 문서를 웹 브라우저에서 열었을 때 웹 브라우저 의 제목 표시줄이나 탭의 제목으로 표시

    // 과거에는 웹 사이트의 제목만을 넣어 두는 것이 일반적이였으나 

    // 웹 접근성 향상을 위해 title 태그 내에 웹 사이트의 제목 뿐만 아니라 페이지의 제목도 넣어주는 것이 최근 추세 

    // 과거 - 깍돌이 블로그

    // 현재 - 깍돌이 블로그 - 블로그 개요

    <meta> - HTML 문서에 대한 메타 데이터를 입력하는 태그입니다. 용도는 매우 다양합니다.

    // 메타 데이터들을 입력함으로 검색엔진의 봇(bot)이 페이지 크롤링 (Crawling - 긁어 오는 작업)할 때 해당 페이지를 누가 작성하였고 

       어떤 정보들이 있으며 이 정보들에 대한 검색어 (Keyboard)는 무엇인지 등에 대해 봇에게 알려주는 역할을 합니다.

    // http 헤더에 속성 값을 넣어 웹 브라우저에 전달하는 역할도 함

    1) 페이지 작성자 : <meta> 태그에 name="author", content="작성자명" 속성을 사용합니다.


    예) <meta name="author" content="Crestia">

    * 여러 개의 항목을 넣어 쓸 수 있으며, 항목은 ','로 구분.


    2) 페이지 검색어 : <meta> 태그에 name="keywords", content="검색어1, 검색어2, ..." 속성을 사용합니다.

    예) <meta name="keywords" content="HTML 튜토리얼, CSS 스니펫, 개발 팁">

    * 여러 개의 항목을 넣어 쓸 수 있으며, 항목은 ','로 구분.


    3) 페이지 설명 : <meta> 태그에 name="description", content="간단한 설명" 속성을 사용합니다.

    예) <meta name="author" content="Project Crestia의 블로그">


    4) 인코딩 정보 : HTML5에서는 <meta> 태그에 charset="인코딩 셋" 속성을 사용하며, HTML 4.x나 XHTML 1.x는

    http-equiv="Content-Type", content="text/html;charset=인코딩 셋" 속성을 사용합니다.

    예) HTML5 : <meta charset="UTF-8">

    HTML 4.x : <meta http-equiv="content-type" content="text/html;charset=UTF-8">

    XHTML 1.x : <meta http-equiv="content-type" content="text/html;charset=UTF-8" />

    * 주로 사용 되는 한국어 인코딩 셋 : UTF-8 (유니코드), EUC-KR (확장완성형)

    * 주의 : 한 HTML 문서 내부에 여러 개의 인코딩이 들어갈 수 없음


    5) 렌더링 엔진 지정 : <meta> 태그에 http-equiv="x-ua-compatible" content="IE=버전" 속성을 사용합니다.

    예) Internet Explorer : <meta http-equiv="x-ua-compatible" content="IE=edge">

    * 버전 속성

    * edge : 항상 최신 버전의 렌더링 엔진으로 표시

    * 9 : 9.0 렌더링 엔진

    * 8 : 8.0 렌더링 엔진

    * 7 : 7.0 렌더링 엔진

    * 6 : 6.0 렌더링 엔진 (쿼크 모드)

    6) 모바일 기기 화면 설정 : <meta> 태그에 name="viewport" content="설정 내용" 속성을 사용합니다.

    예) <meta name="viewport" content="width=device-width, initial-scale=1.0">

    * 설정 내용 항목

    * width : 페이지의 너비. 일반적으로 device-width (기기 화면 너비)로 사용함.

    * initial-scale : 페이지를 불러왔을 때 초기 화면의 크기. initial-scale=1.0로 해 놓으면 100%.

    * maximum-scale : 최대 화면 크기. maximum-scale=1로 해놓으면 100%가 최대값.

    * user-scalable : 사용자 줌 가능 여부 설정. user-scalable=no로 설정하면 페이지 줌 불가능

    * 여러 개의 항목을 넣어 쓸 수 있으며, 항목은 ','로 구분.


    7) 페이지 새로 고침 간격 지정 : <meta> 태그에 http-equiv="Content-Type" content="초" 속성을 사용합니다.

    예) <meta http-equiv="refresh" content="20">

    body 택 - head 태그 뒤 쪽으로 <body> 태그가 나옵니다. 해당 태그에는 문서의 본문 내용들이 들어가게 됩니다. 

    <img> <br> <hr>같은 단독 태그가 아닌 경우 />로 막아야 합니다. 


    자바스크립트의 배열 [ ] 의 경우에는


    length 를 통하여 길이를 간단하고 손쉽게 가져 올 수 있습니다.


    하지만 obj의 경우에는 length 를 지정하게 되면 undefined 가 나타납니다.


    obj 의 경우 length 의 길이를 구하기 위해서는


    Object.keys를 이용해야 합니다.


     

    var objS = {name:"test",ttt:"NewTest",kim:"kim"};
    
    console.log("obj.length : ",objS.length);
    console.log("Object.keys Length : ",Object.keys(objS).length);
    
    

    Object.keys에 대해 간단하게 적어 보면


    Object.keys(obj)

    obj -> 열거형 고유 속성이 반환될 개체


    return Value -> 지정된 개체의 모든 나열형 속성들을 나타내는 문자열 배열

    나열형 속성들을 나타낸다고 되어있다.


    속성열 나열 테스트


    var myObj = Object.create({}, {
      getFoo: {
        value: function () { return this.foo; }
      } 
    });
    myObj.foo  = 1;
    myObj.foo2 = 2;
    myObj.foo3 = 3;
    
    console.log(myObj);
    console.log(Object.keys(myObj)); 
    
    


    결과

    {foo: 1, foo2: 2, foo3: 3, getFoo: ƒ}

    (3) ["foo", "foo2", "foo3"]



    display : block 

    한줄에 나열하지 않으며 해당 태그 자체를 한줄로 표현합니다.

    (기본적으로 width 100%)

    margin,width,height 속성 정의 가능합니다.


    display : inline

    줄을 바꾸지 않고 다른 요소와 함께 한 행에 위치하려는 성향 ex: a태그

    (width 와 height 속성이 적용되지 않음 margin-top,margin-bottom 속성 적용 X)

    최소한의 간격 유지를 위해서 기본 내부 margin 5px 발생 (웹브라우저에 의해)

    inline 태그는 높이와 너비가 품고있는 내부 요소의 부피에 맞게 맞춰 집니다.


    display : inline-block

    margin,width,height 몸두 제어 가능 

    (좌우 5px의 기본 여백 )

    inline-block의 너비와 높이는 품고있는 내부 요소에 맞춰지며 width,height를 적용가능 합니다.






    현재 접속한 브라우저를 확인 한다. 자세한 내용은 JS에서 다루고


    해당 카테고리에서는 코드만 적어 놓으려고 합니다. 


    간단하게 


    
    

    var _browserState = 'unknown';


    (function checkBrowser(){

    var agent = navigator.userAgent.toLowerCase();

    if(agent.indexOf("chrome")!=-1){_browserState="Chrome";}

    else if(agent.indexOf("safari")!=-1){_browserState="safari";}

    else if(agent.indexOf("firefox")!=-1){_browserState="firefox";}

    else if(agent.indexOf("msie")!=-1 || agent.indexOf('trident')!=-1){_browserState="IE"}

    for(let i=0;i<5;i++){ console.warn("connected Browser is "+_browserState);}


    })();


    // Extension Download reProduction Code 

    var _downloadEx = function(filename,contents){

             if(_browserState.toLowerCase() ==='chrome'){

      var element = document.createElement('a');

      element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(contents));

      element.setAttribute('download', filename);

      element.style.display = 'none';

      document.body.appendChild(element);

      element.click();

      document.body.removeChild(element);

    }

    //not in Chrome

    else{

    var a = document.createElement("a"),


        file = new Blob([contents], { type: "text/plain;charset=utf-8" });


        if (window.navigator.msSaveOrOpenBlob) // IE10+

            window.navigator.msSaveOrOpenBlob(file, filename);

        else { // Others

            var url = URL.createObjectURL(file);

            a.href = url;

            a.download = filename;

            document.body.appendChild(a);


            a.click();

            setTimeout(function () {

                document.body.removeChild(a);

                window.URL.revokeObjectURL(url);

          }, 0);

        }

    }

    }


    + Recent posts