2016-12-24 43 views
0

我在包含文本的其他一些div(.textDisplay)前面有一個彩色的半透明div(.box)。其中一個背景div(左側)正確顯示,文字由於透明div覆蓋在上面而褪色。另一個,根本不會消失。我希望兩個div都像左邊那樣顯示。使用變換的背景文字的CSS透明度問題

編輯:我不能修改HTML的結構(它由Elm以嵌套方式生成)。有沒有辦法只用CSS來做到這一點?

編輯2:由於transform屬性,這是堆棧上下文問題。查看我的答案獲取更多詳情。

.textDisplay { 
 
    height: 100%; 
 
    width: 100%; 
 
    text-align: center; 
 
} 
 

 
.box { 
 
    width: 200px; 
 
    padding: 20px; 
 
    background-color: #8CA8DA; 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    margin-left: 20px; 
 
    transform: translateY(-50%); 
 
    opacity: 0.8; 
 
} 
 

 
.behind { 
 
    position: absolute; 
 
    transform: translate(-50%, -50%); 
 
}
<div class="behind" style="left: 100px; top: 100px; width: 127px; height: 127px;"> 
 
    <div class="content"> 
 
    <div> 
 
     <div class="textDisplay">Test Text 0</div> 
 
     <div class="box" style="z-index: 100;"> 
 
     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi molestie ornare ex et cursus. Donec nibh urna, bibendum nec molestie sed, condimentum ut lacus. 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div> 
 
<div class="behind" style="left: 350px; top: 150px; width: 127px; height: 127px;"> 
 
    <div class="content"> 
 
    <div> 
 
     <div class="textDisplay">Test Text 1</div> 
 
    </div> 
 
    </div> 
 
</div>

回答

0

transform屬性創建一個新的stacking context。正如鏈接文章所解釋的那樣,這個堆疊環境然後是自動的(作爲一個單獨的東西)併入它的父級堆棧上下文中。其中定義的z-index不能超越上下文。有文章說明這更好的圖表。

而不是使用transform: translate(-50%, -50%);進行居中,我們可以使用left: -50%; top: -50%;,如修改後的代碼片段所示。必須有一個具有所需寬度和高度的div(.behind),他們的左上角是我們希望目標div的中心所在的位置。有關如何實現目標div居中的示例,請參閱.content類。

一旦div以替代方法居中,所有內容都處於相同的堆棧上下文中。現在,在所需元素(或其中的一個子元素,如代碼段中)上簡單z-index: 100將使其高於其餘部分,實現所需的透明度效果。

.textDisplay { 
 
    height: 100%; 
 
    width: 100%; 
 
    text-align: center; 
 
} 
 

 
.box { 
 
    width: 200px; 
 
    padding: 20px; 
 
    background-color: #8CA8DA; 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    margin-left: 20px; 
 
    transform: translateY(-50%); 
 
    opacity: 0.8; 
 
} 
 

 
.content { 
 
    left: -50%; 
 
    top: -50%; 
 
    height: 100%; 
 
    width: 100%; 
 
    position: absolute; /* or relative */ 
 
} 
 

 
.behind { 
 
    position: absolute; 
 
    /*transform: translate(-50%, -50%); REMOVED*/ 
 
}
<div class="behind" style="left: 100px; top: 100px; width: 127px; height: 127px;"> 
 
    <div class="content"> 
 
    <div> 
 
     <div class="textDisplay">Test Text 0</div> 
 
     <div class="box" style="z-index: 100;"> 
 
     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi molestie ornare ex et cursus. Donec nibh urna, bibendum nec molestie sed, condimentum ut lacus. 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div> 
 
<div class="behind" style="left: 350px; top: 150px; width: 127px; height: 127px;"> 
 
    <div class="content"> 
 
    <div> 
 
     <div class="textDisplay">Test Text 1</div> 
 
    </div> 
 
    </div> 
 
</div>

0

喜歡這個?

.textDisplay { 
 
    height: 100%; 
 
    width: 100%; 
 
    text-align: center; 
 
} 
 

 
.box { 
 
    width: 200px; 
 
    padding: 20px; 
 
    background-color: #8CA8DA; 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    margin-left: 20px; 
 
    transform: translateY(-50%); 
 
    opacity: 0.8; 
 
} 
 

 
.behind { 
 
    position: absolute; 
 
    transform: translate(-50%, -50%); 
 
}
<div class="behind" style="left: 350px; top: 150px; width: 127px; height: 127px;"> 
 
    <div class="content"> 
 
    <div> 
 
     <div class="textDisplay">Test Text 1</div> 
 
    </div> 
 
    </div> 
 
</div> 
 
<div class="behind" style="left: 100px; top: 100px; width: 127px; height: 127px;"> 
 
    <div class="content"> 
 
    <div> 
 
     <div class="textDisplay">Test Text 0</div> 
 
     <div class="box" style="z-index: 100;"> 
 
     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi molestie ornare ex et cursus. Donec nibh urna, bibendum nec molestie sed, condimentum ut lacus. 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div>

+0

我不能重新排序HTML元素,它們的順序是任意的,由榆樹編譯器決定。查看我對其他答案的評論以及OP中的編輯。 – user2244484

0

.behind.box之外。我調整了一下CSS來演示,但你會明白。

.textDisplay { 
 
    height: 100%; 
 
    width: 100%; 
 
    text-align: center; 
 
} 
 

 
.box { 
 
    width: 200px; 
 
    padding: 20px; 
 
    background-color: #8CA8DA; 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 15%; 
 
    margin-left: 20px; 
 
    transform: translateY(-50%); 
 
    opacity: 0.8; 
 
} 
 

 
.behind { 
 
    position: absolute; 
 
    transform: translate(-50%, -50%); 
 
}
<div class="box" style="z-index: 100;"> 
 
     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi molestie ornare ex et cursus. Donec nibh urna, bibendum nec molestie sed, condimentum ut lacus. 
 
</div> 
 
<div class="behind" style="left: 100px; top: 100px; width: 127px; height: 127px;"> 
 
    <div class="content"> 
 
    <div> 
 
     <div class="textDisplay">Test Text 0</div>   
 
    </div> 
 
    </div> 
 
</div> 
 
<div class="behind" style="left: 350px; top: 150px; width: 127px; height: 127px;"> 
 
    <div class="content"> 
 
    <div> 
 
     <div class="textDisplay">Test Text 1</div> 
 
    </div> 
 
    </div> 
 
</div>

+0

我無法重新排列這樣的HTML元素。結構必須保持不變。這是因爲它們是由Elm生成的,'.content'是一個獨立的組件,包含它自己的包含'.textDisplay'和'.box'的視圖。另一個組件具有'.content'列表,將它們包裝在'.behind'中,並將它們組成它的視圖。子組件不能在其父視圖中插入div。 – user2244484