2015-08-06 4 views
0

У меня есть странная вещь, я не понимаю причину. Я создал вопрос fiddle to demonstrate.css элемент границы влияние на другие элементы странным образом

то, что я не понимаю, является то, что установка границы на одну из трех холстов делает мои два других .headerMainDiv спускающимися с их исходного положения (попробуйте сыграть с размером границы/удалить границу и увидеть эффект) ,

здесь соответствующая часть моей HTML:

<header> 
    <div class="headerMainDiv">   
     <div class="inner">   
      <canvas id="canvas1"> 

      </canvas> 
     </div>  
    </div> 
    <div class="headerMainDiv">   
     <div class="inner">   
      <canvas id="canvas2"> 

      </canvas> 
     </div>  
    </div> 
    <div class="headerMainDiv"> 
     <div class="inner">   
      <canvas id="canvas3"> 

      </canvas> 
     </div>  
    </div> 
</header> 

и вот соответствующий CSS:

#canvas2{ 
    border:10px solid black; 
} 

.inner { 
    margin-top: 2px; 
} 

.headerMainDiv { 
    height: 100%; 
    width: 30%; 
    background-color:red; 
} 

body{ 
    margin: 0;   
} 

header{ 
    height: 20%; 
    width: 100%; 
    top:0px; 
    text-align: center; 
    position: fixed; 
    z-index: 5; 
    background-color: blue; 
} 

header div { 
    display: inline-block; 
} 

canvas { 
    background-color: grey; 
    width:100%; 
    height:100%; 
} 

Я не ищу решение моей проблемы, но для объяснения того «проблема/поведение».

Большое спасибо. Jimmyboy.

ответ

2

, что я не в состоянии понять, почему установление границы в одном из трех полотен делает мои два друг .headerMainDiv идет вниз от своей первоначальной позиции (попробуйте играть с размером границы в/удалить границы и увидеть эффект).

вопроса я думаю, что вы имеете в виде это вертикальное выравнивание, то есть быть по умолчанию, установите baseline для встроенных элементов блока ... которые обруч ваших canvas элементов.

Все, что вам действительно нужно сделать, это установить:

header div { 
    display: inline-block; 
    vertical-align: top; 
} 

JSfiddle Demo

Тем не менее, с помощью border-box, вероятно, хороший вариант по умолчанию, так что я включил его в демо-версии.

1

Это потому, что вы указали ширину 100% на свой элемент холста и добавили границы поверх этого. Это приводит к тому, что ширина превышает 100%, что приводит к переполнению.

Что вы можете сделать, это заставить браузер вычислить ширину (рамки) границы как часть объявления ширины. Это может быть сделано с помощью box-sizing: border-box на холсте элементы:

#canvas2{ 
 
    border:10px solid black; 
 
} 
 

 
.inner { 
 
    margin-top: 2px; 
 
} 
 

 
.headerMainDiv { 
 
    height: 100%; 
 
    width: 30%; 
 
    background-color:red; 
 
} 
 

 
body{ 
 
    margin: 0;   
 
} 
 

 
header{ 
 
    height: 20%; 
 
    width: 100%; 
 
    top:0px; 
 
    text-align: center; 
 
    position: fixed; 
 
    z-index: 5; 
 
    background-color: blue; 
 
} 
 

 
header div { 
 
    display: inline-block; 
 
} 
 

 
canvas { 
 
    box-sizing: border-box; /* Force border widths to be part of declared width */ 
 
    background-color: grey; 
 
    width:100%; 
 
    height:100%; 
 
}
<header> 
 
    <div class="headerMainDiv">   
 
     <div class="inner">   
 
      <canvas id="canvas1"> 
 

 
      </canvas> 
 
     </div>  
 
    </div> 
 
    <div class="headerMainDiv">   
 
     <div class="inner">   
 
      <canvas id="canvas2"> 
 

 
      </canvas> 
 
     </div>  
 
    </div> 
 
    <div class="headerMainDiv"> 
 
     <div class="inner">   
 
      <canvas id="canvas3"> 
 

 
      </canvas> 
 
     </div>  
 
    </div> 
 
</header>

Однако, если вы хотите, чтобы все дивы, как представляется, такой же высоты, вам нужно будет убедиться, что дополнительная высота границы во втором полотне также добавляют к этим полотнам без границ, путем:

  1. Использование верхних и нижних прозрачных границ
  2. U петь верхнее и нижнее полей на первый и третий холсте
  3. Используя верхние и нижние Прокладки на родительском элементе первого и третьего холст

Вот решение с использованием первым раствора:

#canvas1, #canvas3 { 
 
    border: 10px solid transparent; 
 
} 
 
#canvas2{ 
 
    border: 10px solid black; 
 
} 
 
.inner { 
 
    margin-top: 2px; 
 
} 
 

 
.headerMainDiv { 
 
    height: 100%; 
 
    width: 30%; 
 
    background-color:red; 
 
} 
 

 
body{ 
 
    margin: 0;   
 
} 
 

 
header{ 
 
    height: 20%; 
 
    width: 100%; 
 
    top:0px; 
 
    text-align: center; 
 
    position: fixed; 
 
    z-index: 5; 
 
    background-color: blue; 
 
} 
 

 
header div { 
 
    display: inline-block; 
 
} 
 

 
canvas { 
 
    box-sizing: border-box; /* Force border widths to be part of declared width */ 
 
    background-color: grey; 
 
    width:100%; 
 
    height:100%; 
 
}
<header> 
 
    <div class="headerMainDiv">   
 
     <div class="inner">   
 
      <canvas id="canvas1"> 
 

 
      </canvas> 
 
     </div>  
 
    </div> 
 
    <div class="headerMainDiv">   
 
     <div class="inner">   
 
      <canvas id="canvas2"> 
 

 
      </canvas> 
 
     </div>  
 
    </div> 
 
    <div class="headerMainDiv"> 
 
     <div class="inner">   
 
      <canvas id="canvas3"> 
 

 
      </canvas> 
 
     </div>  
 
    </div> 
 
</header>

+0

это не решило (или я что-то пропустил?), Я добавил * {box-sizing: border-box} в мой css, и это поведение остается. – JimmyBoy

+0

@JimmyBoy вижу мою скрипку (в ответе выше) –

+0

@JimmyBoy Если вы хотите, чтобы вы равны по высоте для всех трех элементов, вам либо нужно (1) объявить прозрачную верхнюю границу, либо (2) объявить верхний край холста или (3) объявить верхнее дополнение для элемента '.headerMainDiv'. – Terry

1

Если вам нужно, что граница не влияет на ширину вашего ящика, необходимо указать box-sizing свойства.

#canvas2{ 
     border:10px solid black; 
     box-sizing:border-box; 
    } 

Установка размера коробки в рамку-рамку позволяет избежать прокладок и границ без ущерба для вашей ширины. Проверьте это

http://jsfiddle.net/d6tukcdz/6/

Если это не ваша проблема, пожалуйста, объясните лучше

+0

My главная проблема заключается в том, что граница влияет на положение других divs странным нетривиальным способом, который я хотел бы понять. Вы видели скрипку и играли с границей, чтобы узнать, о чем я говорю? @marcos – JimmyBoy

+1

Граница doesn 't влияет на позицию. Похоже, что остальные 2 divs находятся внизу, а средний холст - сверху. Это потому, что свойство 'vertical-align'. Возможно, вы ищете что-то вроде этого? http: // jsfiddle .net/d6tukcdz/11/ –

+0

Вам следует научиться управлять вертикальными выравниваниями с помощью встроенных элементов/встроенных элементов. Вам нужно представить невидимую высоту строки элементов встроенного блока, и в этой области будет определено вертикальное выравнивание (top = высота верхней строки; базовый уровень = высота базовой линии; bottom = внизу базовой линии; средний = в середине линии высота). Вы должны попрактиковаться в этом, чтобы лучше понять это. Удачи! –

0

Это потому, что границы увеличивают ширину элемента.Использование box-sizing: border-box будет включать границы в общую ширину элемента.

Добавление display: inline-block; vertical-align: top; в .headerMainDiv должно решить проблему выравнивания - обновлено fiddle.

canvas { 
    box-sizing: border-box; 
    background-color: grey; 
    width:100%; 
    height:100%; 
} 

.headerMainDiv { 
    display: inline-block; 
    vertical-align: top; 
    height: 100%; 
    width: 30%; 
    background-color:red; 
} 
+0

Спасибо, но это не моя проблема, посмотрите на скрипку - я пытаюсь понять, почему другие 2 погружения сходят с исходной позиции. эта вещь остается даже при применении вашего css ... – JimmyBoy

+0

Перекрывающиеся divs в примере, где наиболее заметная особенность. Я думаю, что это редактирование должно решить проблему. –

2

Это потому, что вы использовали дисплей как встроенный блок. Свойство vertical-align наследуется как baseline. Именно по этой причине вы видите все div, выровненные по полу родительского div.

enter image description here

+0

Спасибо, не могли бы вы подробнее рассказать подробнее и предложить решение? Я хотел бы сохранить его как inline-box и не плавать, как я могу избавиться от унаследованной вещи с вертикальным выравниванием? @chillvivek – JimmyBoy

+0

использовать 'vertical-align: top' to' .headerMainDiv' – chillvivek

+0

также попробуйте '# canvas2 { border: 10px solid black; размер коробки: рамка; } ' – chillvivek

Смежные вопросы