2015-11-30 4 views
1

content свойства вместе с :before и :after псевдо-элементами предлагает удобный способ создания малых и полезные деталей, как this one, где я генерировать пунктирный, книги в стиле список содержимого журнала.CSS функция содержания подстроки

Для вставки динамически созданного содержимого существуют функции, такие как attr() или counter(). В настоящее время, это требует размещения фактического содержания в отдельном атрибуте, то, что часто вызывает дублирование (например, когда я хочу content держать innerHTML значения узла-) мой код выглядит следующим образом

<a data-page="148" href="/archive/70/2/148"></a> 

Есть ли способ, что я мог устранить атрибут data-page, разобрав его из href? Было бы здорово иметь что-то вроде этого в CSS:

content: substr(attr(href), lastIndexOf(attr(href), '/')); 

или даже лучше с регулярным выражением:

content: match(attr(href), /\d+$/); 
+0

Restructure ваш сайт так, что 'href' является' 148' используйте 'атр (HREF)': P –

+0

@divinecomedian, гм, это вариант, хотя, похоже, много хлопот для мелких деталей. – bobo

+0

Вы не можете использовать JavaScript? –

ответ

0

Как вы заметили, CSS не является (в настоящее время) достаточно сложное для динамического извлечения подстроки из атрибутов ,

Тем не менее, JavaScript позволит вам устранить атрибут data-page от ваших якорей, так что они просто читать:

<a href="/archive/70/2/148"> 

Кроме того, следующий CSS:

h4>a { 
border-bottom: 1px dotted black; 
} 

будет, (наряду с несколько других настроек здесь и там), позволяют пропустить жесткое кодирование многоточия как ::after.

Смотрите пример ниже:

var pageHref = []; 
 
var pageNumber = []; 
 

 
function assignPageNumbers() { 
 
    var pages = document.querySelectorAll("h4>a"); 
 

 
    for (var i = 0; i < pages.length; i++) { 
 
     pageHref[i] = pages[i].getAttribute("href"); 
 
     pageNumber[i] = pageHref[i].substr((pageHref[i].lastIndexOf("/")+1)); 
 
     document.styleSheets[0].insertRule("h4:nth-of-type(" + (i + 1) + ")>a::after {content: '" + pageNumber[i] + "'}", 0); 
 
     } 
 
    } 
 

 
window.addEventListener('load',assignPageNumbers,false);
body { 
 
width: 500px; 
 
} 
 

 
h4 { 
 
position: relative; 
 
} 
 

 
h4>a { 
 
color: black; 
 
display: block; 
 
font: 16px sans-serif; 
 
text-decoration: none; 
 
border-bottom: 1px dotted black; 
 
} 
 

 
h4>a span { 
 
position: relative; 
 
background:#fff; 
 
top: 4px; 
 
padding-right: 2px; 
 
} 
 

 
h4>a:after { 
 
position: absolute; 
 
right: 0; 
 
margin-top: 4px; 
 
background-color: rgb(255,255,255); 
 
text-decoration: none; 
 
} 
 

 
h4>a:hover { 
 
color: slategray; 
 
border-bottom: 1px dotted slategray; 
 
}
<h4> 
 
    <a href="/archive/70/2/144"> 
 
     <span>A short title</span> 
 
    </a> 
 
</h4> 
 
<h4> 
 
    <a href="/archive/70/2/148"> 
 
     <span>Very long and incredibly verbose title that should, at the very least, span several lines or more to demonstrate wrapping</span> 
 
    </a> 
 
</h4>

+0

Спасибо, ваш пример действительно выглядит очень хорошо для этого конкретного сценария. Причина, по которой я жестко закодирован, - это то, что она соответствует правилам стиля текста, например, размеру, цвету и т. Д., В то время как «border-bottom» нужно отдельно указывать – bobo

+0

Нет проблем. Вы всегда можете использовать одинаковые стили 'CSS' для тех, что были выше, и просто отредактировать одну строку javascript, чтобы она читала (а не):' document.styleSheets [0] .insertRule ("h4: nth-of-type (" + (i + 1) + ")> a :: after {content: '............... .................................................. .................................................. .................................................. .................................................. .............................................. "+ pageNumber [ i] + "'}", 0); ' – Rounin

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