깨알 개념/기타

display 속성 값 block, inline, inline-block의 차이

interfacer_han 2023. 12. 6. 15:56

#1 웹 페이지

inline-block.html
0.01MB

뒤에 나올 모든 코드를 하나의 파일에 합쳐 넣었다.

 

백문이 불여일견. 여러 개의 div를 나열하고 각각의 displayㆍwidthㆍheight 스타일 속성을 동적으로 변경할 수 있는 프로그램을 만들었다. 장난감처럼 마음대로 다루어보면서 감을 익히자.
 

#2 알고리즘

 

#3 코드

#3-1 HTML

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>display 속성 값 block, inline, inline-block의 차이</title>
    <link rel="stylesheet" href="./inline-block.css">

</head>
<body>
    <div id="display_panels">
        <div id="abcd">abcd</div>
        <div id="efgh">efgh</div>
        <div id="ijkl">ijkl</div>
        <div id="mnop">mnop</div>
        <div id="qrst">qrst</div>
        <div id="uvwx">uvwx</div>
        <div id="yz">yz</div>
    </div>

    <hr>

    <div id="control_panels"></div>

    <script src="./inline-block.js"></script>
</body>
</html>

 

#3-2 CSS

#display_panels * {
    /* css iniciation */
    padding: 0;
    margin: 0;
    box-sizing: border-box;
}

#display_panels {height: 200px;}

#abcd {background-color: aquamarine;}
#efgh {background-color: burlywood;}
#ijkl {background-color: blueviolet}
#mnop {background-color: bisque}
#qrst {background-color:coral}
#uvwx {background-color:greenyellow}
#yz {background-color:dodgerblue}

hr {
    margin: 40px 0 20px 0;
}

#control_panels .name {display: inline-block; width: 44px;}
#control_panels .check_symbol {color: transparent;}
#control_panels .check_symbol.block {color: black;}
#control_panels .width_value {display: inline-block; width: 54px;}
#control_panels .height_value {display: inline-block; width: 44px;}
#control_panels * > * {height: 24px; margin: 2px 0 2px 0;}

#abcd_control .name {background-color: aquamarine;}
#efgh_control .name {background-color: burlywood;}
#ijkl_control .name {background-color: blueviolet}
#mnop_control .name {background-color: bisque}
#qrst_control .name {background-color:coral}
#uvwx_control .name {background-color:greenyellow}
#yz_control .name {background-color:dodgerblue}

 

#3-3 JavaScript

function sizeIniciate(elementsId) {
    let selector = document.getElementById(elementsId)
    selector.style.width = selector.offsetWidth + 'px';
    selector.style.height = selector.offsetHeight + 'px';
}

function changeDisplay(elementsId, displayType) {
    let selectorForDisplayPanel = document.getElementById(elementsId);
    selectorForDisplayPanel.style.display = displayType;

    /* 체크 기호 처리 */ 
    let selectorForControlPanel = document.getElementById(`${elementsId}_control`);
    let checkSymbols = selectorForControlPanel.querySelectorAll('button > span.check_symbol');
    for(let i = 0; i < checkSymbols.length; i++) {
        checkSymbols[i].style.color = 'transparent';
    }
    let selectedCheckSymbol = selectorForControlPanel.querySelector(`button > span.${displayType}`);
    selectedCheckSymbol.style.color = 'black'

    /* inline일 때 취소선 처리 */
    let widthValueElement = selectorForControlPanel.querySelector('.width_value');
    let heightValueElement = selectorForControlPanel.querySelector('.height_value');
    if(displayType == 'inline') {
        widthValueElement.style.textDecoration = 'line-through';
        heightValueElement.style.textDecoration = 'line-through';
    } else {
        widthValueElement.style.textDecoration = 'none';
        heightValueElement.style.textDecoration = 'none';
    }

}

function changeSize(elementsId, sizeType, increment) {
    let selectorForDisplayPanel = document.getElementById(elementsId);
    let previousValue = parseInt(selectorForDisplayPanel.style[sizeType]);
    let updatedValue = Number(previousValue) + Number(increment)
    if(updatedValue < 0) {
        selectorForDisplayPanel.style[sizeType] = '0px';
    } else {
        selectorForDisplayPanel.style[sizeType] = updatedValue + 'px';
    }

    let selectorForControlPanel = document.getElementById(`${elementsId}_control`);
    let sizeValueElement = selectorForControlPanel.querySelector(`.${sizeType}_value`);
    sizeValueElement.textContent = selectorForDisplayPanel.style[sizeType];
}

let divElements = [
    document.getElementById('abcd'),
    document.getElementById('efgh'),
    document.getElementById('ijkl'),
    document.getElementById('mnop'),
    document.getElementById('qrst'),
    document.getElementById('uvwx'),
    document.getElementById('yz')
];

for (let i = 0; i < divElements.length; i++) {
    let s = '';
    s += `<div id="${divElements[i].id}_control">\n`; // ''가 아니라 ``을 사용했다. 이 둘은 다르다.
    s += `  <span class="name">${divElements[i].id}</span>\n`;
    s += `  <button onclick="changeDisplay('${divElements[i].id}', 'block')">block <span class="check_symbol block">✓</span></button>\n`;
    s += `  <button onclick="changeDisplay('${divElements[i].id}', 'inline')">inline <span class="check_symbol inline">✓</span></button>\n`;
    s += `  <button onclick="changeDisplay('${divElements[i].id}', 'inline-block')">inline-block <span class="check_symbol inline-block">✓</span></button>\n`;
    s += `  <span>|</span>\n`;
    s += `  <button onclick="changeSize('${divElements[i].id}', 'width', '-200')">-200 width</button>\n`;
    s += `  <span class="width_value">${divElements[i].offsetWidth}px</span>\n`;
    s += `  <button onclick="changeSize('${divElements[i].id}', 'width', '+200')">+200 width</button>\n`;
    s += `  <span>|</span>\n`;
    s += `  <button onclick="changeSize('${divElements[i].id}', 'height', '-10')">-10 height</button>\n`;
    s += `  <span class="height_value">${divElements[i].offsetHeight}px</span>\n`;
    s += `  <button onclick="changeSize('${divElements[i].id}', 'height', '+10')">+10 height</button>\n`;
    s += `</div>\n`;

    document.getElementById('control_panels').innerHTML += s;

    sizeIniciate(divElements[i].id);
}

 

#4 요약

inline이 붙으면 줄바꿈이 없다. block은 크기 조절이 가능한 덩어리다.
 

#5 이 개념이 사용된 글

-