this是否適合您?
var borderProps='2px solid #f00',borderRadius='5px',boxMeAttr='data-boxme';
var spans=document.querySelectorAll('span'),boxMeArrays=[],dummyArray=null,iterator=0;
var currSpan=null,prevSpan=null;
var i,length=spans.length,adjacentSpans=0;
for(i=0; i<length; i+=1){
prevSpan=currSpan;
currSpan=spans[i];
if(currSpan.hasAttribute(boxMeAttr)){
if(prevSpan!==null&&prevSpan.hasAttribute(boxMeAttr)){
dummyArray[dummyArray.length]=currSpan;
}else{
dummyArray=[currSpan];
boxMeArrays[iterator]=dummyArray;
iterator+=1;
}
}
}
length=boxMeArrays.length;
for(i=0; i<length; i+=1){
adjacentSpans=boxMeArrays[i].length;
for(var j=0; j<adjacentSpans; j+=1){
currSpan=boxMeArrays[i][j];
if(adjacentSpans>1){
if(j===0){
currSpan.innerText+=' ';
currSpan.style.borderLeft=currSpan.style.borderTop=currSpan.style.borderBottom=borderProps;
currSpan.style.borderTopLeftRadius=currSpan.style.borderBottomLeftRadius=borderRadius;
}else if(j===adjacentSpans-1){
currSpan.style.borderTop=currSpan.style.borderBottom=currSpan.style.borderRight=borderProps;
currSpan.style.borderTopRightRadius=currSpan.style.borderBottomRightRadius=borderRadius;
}else{
currSpan.innerText+=' ';
currSpan.style.borderTop=currSpan.style.borderBottom=borderProps;
}
}else{
currSpan.style.border=borderProps;
currSpan.style.borderRadius=borderRadius;
}
}
}
絕對不是直截了當,但我認爲它足夠好。如果你確定,只修改你的HTML:使用innerText
增加一個額外的空間,所以邊界可以很好地相互連接。
看看jsFiddle上的實現。希望我沒有錯過任何細節,真正希望這個解決方案適合你。
爲什麼你的元素不能被後面的代碼放在一個'span'中? – bytecode77
@bytecode77他們每個人都需要在一個單獨的跨度,因爲我需要處理每個跨度上的點擊事件。 – user108471
這不一定是一個純粹的設計決定。 CSS圍繞頁面的邏輯HTML結構工作。儘管對這個特定問題(@Hashem Qolami)有一個純粹的CSS答案,但我認爲圍繞內容的包裝div有助於解釋內容在邏輯上是分組的。 – smcjones