2017-04-21 13 views
0

私は最近、コラムを使用して石造りのレイアウトを行うためのきちんとした方法を発見しました。ここではhttp://w3bits.com/css-masonry/です。私は、このレイアウトを、ホバー上の各項目にテキストでオーバーレイを追加することで拡張しました。これは、2つの問題を除いてかなりうまくいきます。CSSメーソンリーの問題

  1. オーバーレイは、下の画像よりわずかに大きいです。これは、異なる画像が使用されている場合でも存続します。
  2. トランジションは機能しません。ホバー効果が表示され、突然隠されます。私のコードについて

いくつかの説明:

  1. 私は無駄に、この1つだけのような問題を防ぐための試みで、ドキュメント全体にmargin: 0; border:0; padding:0を追加しました。 .itemmargin: 0 0 20pxで、各項目間に垂直方向の間隔を設けています。
  2. .item-overlayにはposition:absoluteが必要で、position:absoluteには親要素が配置されている必要があるため、position:relative.itemに追加しました。これは、私が知る限り、オーバーレイが正しく表示されること以外には何も影響しません。
  3. .item-overlayは、内容を縦横に集中させるためにdisplay:flexを使用しますが、レイアウトには影響しません。

誰かがコードの何が間違っているのか理解できますか? JSFiddle:https://jsfiddle.net/nattanyz/sfn47me9/1/

答えて

0

img遷移opacityに使用vertical-align: top代わりにdisplay

html { 
 
    box-sizing: border-box; 
 
} 
 

 
*, 
 
*:before, 
 
*:after { 
 
    box-sizing: inherit; 
 
} 
 

 
body { 
 
    background-color: honeydew; 
 
    font-size: 16px; 
 
    line-height: 120%; 
 
    color: #333; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
.wrapper { 
 
    min-height: 100vh; 
 
    width: 80vw; 
 
    max-width: 1200px; 
 
    margin: auto; 
 
    border: 0; 
 
    padding: 0; 
 
    column-count: 3; 
 
    column-gap: 20px; 
 
} 
 

 
.item { 
 
    display: block; 
 
    margin: 0 0 20px; 
 
    border: 0; 
 
    width: 100%; 
 
    position: relative; 
 
} 
 

 
.item-overlay { 
 
    position: absolute; 
 
    top: 0; 
 
    left: 0; 
 
    bottom: 0; 
 
    width: 100%; 
 
    background-color: rgb(51, 51, 51, 0.6); 
 
    color: white; 
 
    opacity: 0; 
 
    display: flex; 
 
    flex-direction: column; 
 
    justify-content: center; 
 
    align-items: center; 
 
    background-color: rgba(51, 51, 51, 0.6); 
 
    transition: opacity 300ms ease; 
 
} 
 

 
.item:hover .item-overlay { 
 
    opacity: 1; 
 
} 
 

 
.project-img { 
 
    width: 100%; 
 
    margin: 0; 
 
    border: 0; 
 
    padding: 0; 
 
    vertical-align: top; 
 
} 
 

 
.project-name { 
 
    font-weight: bold; 
 
} 
 

 
.project-category { 
 
    font-size: 0.75em; 
 
    text-transform: uppercase;
<body> 
 
    <div class="wrapper"> 
 
    <div class="item"> 
 
     <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb" /> 
 
     <div class="item-overlay"> 
 
     <p class="project-name">Project Name</p> 
 
     <p class="project-category">Commercial</p> 
 
     </div> 
 
    </div> 
 
    <div class="item"> 
 
     <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb" /> 
 
     <div class="item-overlay"> 
 
     <p class="project-name">Project Name</p> 
 
     <p class="project-category">Commercial</p> 
 
     </div> 
 
    </div> 
 
    <div class="item"> 
 
     <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb" /> 
 
     <div class="item-overlay"> 
 
     <p class="project-name">Project Name</p> 
 
     <p class="project-category">Commercial</p> 
 
     </div> 
 
    </div> 
 
    <div class="item"> 
 
     <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb" /> 
 
     <div class="item-overlay"> 
 
     <p class="project-name">Project Name</p> 
 
     <p class="project-category">Commercial</p> 
 
     </div> 
 
    </div> 
 
    <div class="item"> 
 
     <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb" /> 
 
     <div class="item-overlay"> 
 
     <p class="project-name">Project Name</p> 
 
     <p class="project-category">Commercial</p> 
 
     </div> 
 
    </div> 
 
    <div class="item"> 
 
     <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb" /> 
 
     <div class="item-overlay"> 
 
     <p class="project-name">Project Name</p> 
 
     <p class="project-category">Commercial</p> 
 
     </div> 
 
    </div> 
 
    <div class="item"> 
 
     <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb" /> 
 
     <div class="item-overlay"> 
 
     <p class="project-name">Project Name</p> 
 
     <p class="project-category">Commercial</p> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</body>

+0

ありがとう! 'vertical-align:top'で修正しました。しかし、なぜ元のコードはそれなしで動作しませんでしたか? –

+0

イメージはインラインコンテンツとして扱われ、インラインコンテンツの一番下には文字の小さな軌跡(p、j、qなど)のためのスペースがあります。 'vertical-align:top'または' display:block'はそのスペースを削除します。 @NatTan –

0
  1. オーバーレイが下の画像よりも僅かに大きいです。これは、異なる画像が使用されている場合でも存続します。

問題は画像そのものにあり、それはコンテナよりも小さいです。 background-colorをコンテナに配置しようとすると、オーバーレイの高さがその親と同じであることがわかります。

  1. 遷移は機能しません。ホバー効果が表示され、突然隠されます。

あなたはCSS displayの移行を実装することができない、他の代替はopacityを使用することでしょう。あなたのコードを修正しました。試してみてください。

html { 
 
\t box-sizing:border-box; 
 
} 
 

 
*, *:before, *:after { 
 
\t box-sizing:inherit; 
 
} 
 

 
body { 
 
\t background-color:honeydew; 
 
\t font-size: 16px; 
 
\t line-height: 120%; 
 
\t color: #333; 
 
\t margin: 0; 
 
\t padding: 0; 
 
} 
 

 
.wrapper { 
 
\t min-height: 100vh; 
 
\t width: 80vw; 
 
\t max-width:1200px; 
 
\t margin: auto; 
 
\t border: 0; 
 
\t padding: 0; 
 
\t column-count: 3; 
 
\t column-gap: 20px; 
 
} 
 

 
.item { 
 
\t display:block; 
 
\t margin: 0 0 20px; 
 
\t border:0; 
 
\t width:100%; 
 
\t position:relative; 
 
    background-color: black; 
 
} 
 

 
.item-overlay { 
 
\t position:absolute; 
 
\t top:0; 
 
\t left:0; 
 
\t bottom:0; 
 
\t width:100%; 
 
\t background-color: rgba(51,51,51,0.6); 
 
\t color:white; 
 
\t opacity:0; 
 
\t transition:300ms ease opacity; 
 
    
 
    display: flex; 
 
\t flex-direction:column; 
 
\t justify-content:center; 
 
\t align-items:center; 
 
} 
 

 
.item:hover .item-overlay { 
 
\t opacity: 1; 
 
\t background-color: rgba(51,51,51,0.6); 
 
} 
 

 
.project-img { 
 
\t width:100%; 
 
\t margin:0; 
 
\t border:0; 
 
\t padding:0; 
 
} 
 

 
.project-name { 
 
\t font-weight:bold; 
 
} 
 

 
.project-category { 
 
\t font-size:0.75em; 
 
\t text-transform:uppercase;
<body> 
 
\t <div class="wrapper"> 
 
\t \t <div class="item"> 
 
\t \t \t <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb"/> 
 
\t \t \t <div class="item-overlay"> 
 
\t \t \t \t <p class="project-name">Project Name</p> 
 
\t \t \t \t <p class="project-category">Commercial</p> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="item"> 
 
\t \t \t <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb"/> 
 
\t \t \t <div class="item-overlay"> 
 
\t \t \t \t <p class="project-name">Project Name</p> 
 
\t \t \t \t <p class="project-category">Commercial</p> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="item"> 
 
\t \t \t <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb"/> 
 
\t \t \t <div class="item-overlay"> 
 
\t \t \t \t <p class="project-name">Project Name</p> 
 
\t \t \t \t <p class="project-category">Commercial</p> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="item"> 
 
\t \t \t <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb"/> 
 
\t \t \t <div class="item-overlay"> 
 
\t \t \t \t <p class="project-name">Project Name</p> 
 
\t \t \t \t <p class="project-category">Commercial</p> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="item"> 
 
\t \t \t <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb"/> 
 
\t \t \t <div class="item-overlay"> 
 
\t \t \t \t <p class="project-name">Project Name</p> 
 
\t \t \t \t <p class="project-category">Commercial</p> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="item"> 
 
\t \t \t <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb"/> 
 
\t \t \t <div class="item-overlay"> 
 
\t \t \t \t <p class="project-name">Project Name</p> 
 
\t \t \t \t <p class="project-category">Commercial</p> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t \t <div class="item"> 
 
\t \t \t <img class="project-img" src="https://images.pexels.com/photos/297755/pexels-photo-297755.jpeg?w=1260&h=750&auto=compress&cs=tinysrgb"/> 
 
\t \t \t <div class="item-overlay"> 
 
\t \t \t \t <p class="project-name">Project Name</p> 
 
\t \t \t \t <p class="project-category">Commercial</p> 
 
\t \t \t </div> 
 
\t \t </div> 
 
\t </div> 
 
</body>

+0

ありがとう!うーん、画像はコンテナよりも小さいのはなぜですか?デフォルトでautoに設定してはいけませんか? –

+0

幅が '100%'に設定されているので、比率に応じて自動的に拡大/縮小されるため、画像は比例サイズになります – nvl