2016-10-11 86 views
7

我需要爲此「形狀」添加邊框。這很難,因爲和之前的僞元素的形狀是由製成的。我找不到正確的方法。爲此「形狀」添加邊框

我需要實現:

enter image description here

的代碼,我到目前爲止有:

https://jsfiddle.net/jimmyadaro/xfcjfz3d/

#octagon { 
    width: 300px; 
    height: 200px; 
    background: red; 
    position: relative; 
    -webkit-box-sizing: content-box; 
    -moz-box-sizing: content-box; 
    box-sizing: content-box; 
    display: block; 
} 

#octagon:before, 
#octagon:after { 
    content: ""; 
    position: absolute; 
    left: 0; 
    right: 0; 
} 

#octagon:before { 
    top: 0; 
    border-bottom: 30px solid red; 
    border-left: 30px solid #fff; 
    border-right: 30px solid #fff; 
} 

#octagon:after { 
    bottom: 0; 
    border-top: 30px solid red; 
    border-left: 30px solid #fff; 
    border-right: 30px solid #fff; 
} 

<div id="octagon"></div> 

我試着用陰影和沒有成功的輪廓。

感謝您的閱讀。

注:如果有問題,我將使用純色背景色。

+2

此鏈接可以幫助你http://stackoverflow.com/questions/34641588/how-do-i-give-a-css-octagon-shape-一個全國性的 – Geeky

+0

謝謝@geeky,我已經看到,但看起來不可擴展。我的意思是,它不能是600x200px。至少在我嘗試過的方式中。 –

+0

相關 - http://stackoverflow.com/questions/34644437/how-do-i-add-a-border-to-an-8-point-star-css-shape但SVG在這裏是最優的。 –

回答

2

好了,這是我能想到的純CSS接近它的唯一途徑:

的jsfiddle這裏:https://jsfiddle.net/xfcjfz3d/7/

body { 
 
    background:#fff; 
 
} 
 

 
#octagon { 
 
    position:relative; 
 
\t width: 300px; 
 
\t height: 200px; 
 
\t background: green; 
 
\t position: relative; 
 
\t -webkit-box-sizing: content-box; 
 
\t -moz-box-sizing: content-box; 
 
\t box-sizing: content-box; 
 
\t display: block; 
 
} 
 

 
#octagon:before, 
 
#octagon:after { 
 
\t content: ""; 
 
\t position: absolute; 
 
\t left: 0; 
 
\t right: 0; 
 
} 
 

 
#octagon:before { 
 
\t top: 0; 
 
\t border-bottom: 30px solid green; 
 
\t border-left: 30px solid #fff; 
 
\t border-right: 30px solid #fff; 
 
} 
 

 
#octagon:after { 
 
\t bottom: 0; 
 
\t border-top: 30px solid green; 
 
\t border-left: 30px solid #fff; 
 
\t border-right: 30px solid #fff; 
 
} 
 

 
.tall { 
 
    position:absolute; 
 
    background:red; 
 
    width:230px; 
 
    height:190px; 
 
    left:35px; 
 
    top:5px; 
 
    z-index:1; 
 
} 
 

 
.wide { 
 
    position:absolute; 
 
    background:red; 
 
    width:290px; 
 
    height:130px; 
 
    left:5px; 
 
    top:35px; 
 
    z-index:1; 
 
} 
 

 
.corner { 
 
    position:absolute; 
 
    background:red; 
 
    width:45px; 
 
    height:43px; 
 
    
 
    z-index:1; 
 
    transform: rotate(45deg); 
 
} 
 

 
.topleft { 
 
    left:14px; 
 
    top:14px; 
 
} 
 

 
.topright { 
 
    //background:black; 
 
    left:241px; 
 
    top:13px; 
 
} 
 

 
.bottomleft { 
 
    background:red; 
 
    left:13px; 
 
    top:143px; 
 
} 
 

 
.bottomright { 
 
    background:red; 
 
    left:241px; 
 
    top:143px; 
 
}
<div id="octagon"> 
 
    <div class="tall"></div> 
 
    <div class="wide"></div> 
 
    <div class="corner topleft"></div> 
 
    <div class="corner topright"></div> 
 
    <div class="corner bottomleft"></div> 
 
    <div class="corner bottomright"></div> 
 
</div>

+0

謝謝,@varin好的方法,但似乎不可擴展。另外,我需要在形狀(文本,圖像等)內添加元素。無論如何,非常感謝。 –

+0

嗯。我認爲這可以通過使用不同的單位進行擴展。如果你需要內部元素,你可以隨時在內容和更高的z-index中添加另一個div。 – Varin

6

這裏是我的解決方案。沒有固定的背景顏色是必需的。這可能會或可能不適合您的實際使用情況。

JSFiddle

#octagon { 
 
    display: flex; 
 
    justify-content: center; 
 
    align-items: center; 
 
    
 
    width: 300px; 
 
    height: 200px; 
 
    overflow: hidden; 
 
    position: relative; 
 
} 
 

 
#octagon:before, 
 
#octagon:after { 
 
    content: ""; 
 
    display: block; 
 
    width: 300px; 
 
    padding-top: 100%; 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    transform: translate(-50%, -50%) rotate(45deg); 
 
    z-index: -1; 
 
} 
 
#octagon:before { 
 
    background: red; 
 
} 
 
#octagon:after { 
 
    background: 
 
     linear-gradient(
 
    \t \t 45deg, 
 
\t  \t #0e0 calc(50% - 150px + 10px), transparent 0, 
 
    \t \t transparent calc(50% + 150px - 10px), #0e0 0%), 
 
    \t linear-gradient(
 
    \t \t -45deg, 
 
    \t \t #0e0 calc(50% - 100px + 10px), transparent 0, 
 
    \t \t transparent calc(50% + 100px - 10px), #0e0 0); 
 
    box-shadow: 0 0 0 10px #0e0 inset; 
 
}
<div id="octagon">Hello World!</div>

+0

哇@darrylyeo感謝您的奉獻!對此,我真的非常感激!如果我需要更薄的邊框(如2像素),我該如何改變它? –

+0

很高興幫助,我喜歡挑戰!查看最後一個規則集「#octagon:after」。對角線由'box-shadow'控制,其餘邊由'線性梯度'中的百分比控制。我有點着眼它,但我相信有一個更加數學的方法來計算這些值('calc()'會派上用場)。 – darrylyeo

+0

明白了!你現在只需要替換'10px'的所有實例。 – darrylyeo