2017-02-22 8 views

ответ

4

Поскольку вы не можете выбирать текстовые узлы с помощью CSS, один из них - установить font-size родительского элемента на 0, что эффективно скроет весь текст. Затем вы можете сбросить текст для нужного элемента.

.target { 
 
    font-size: 0; 
 
} 
 
.target > :first-child { 
 
    font-size: 16px; 
 
}
<p class="target"> 
 
    <span>First node</span> 
 
    Second node 
 
    More text nodes... 
 
</p>


В качестве альтернативы, вы можете также использовать visibility property, а также (так как вы можете установить дочерний элемент к visibility: visible даже тогда, когда родительский элемент установлен в visibility: hidden:

.target { 
 
    visibility: hidden; 
 
} 
 

 
.target > :first-child { 
 
    visibility: visible; 
 
}
<p class="target"> 
 
    <span>First node</span> 
 
    Second node 
 
    More text nodes... 
 
</p>


В качестве примечания, если вы хотите альтернативу, можно обернуть текстовые узлы с <span> элементов с помощью JavaScript, а затем установить display из всех дочерних элементов, которые не первый ребенок none используя селектор:

.target > :not(:first-child) { 
    display: none; 
} 

Здесь фрагмент демонстрирует это:

var target = document.querySelector('.target'); 
 
Array.from(target.childNodes).forEach(function (node, index) { 
 
    if (node.nodeType === 3 && node.nodeValue.trim()) { 
 
    var span = document.createElement('span'); 
 
    span.textContent = node.nodeValue; 
 
    target.replaceChild(span, node); 
 
    } 
 
});
.target > :not(:first-child) { 
 
    display: none; 
 
}
<p class="target"> 
 
    <span>First node</span> 
 
    Second node 
 
    More text nodes... 
 
</p>


Если вы используете JQuery, это было бы еще короче:

$('.target').contents() 
 
    .filter(function() { 
 
    return this.nodeType === 3 && this.nodeValue.trim(); 
 
    }).wrap('<span />');
.target > :not(:first-child) { 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p class="target"> 
 
    <span>First node</span> 
 
    Second node 
 
    More text nodes... 
 
</p>

+0

Было бы здесь, но видимость не всегда будет работать, так как пространство еще принято. Является ли 'font-size: 0' ОК, чтобы сделать? Мне показалось, что я читал, что некоторые браузеры плохо себя ведут. – JPM

+0

@JPM - Да, это будет занимать место при использовании 'видимость: hidden', поэтому я бы лично пошел с опцией' font-size', так как он будет работать последовательно. Все зависит от того, чего вы пытаетесь достичь, я думаю. –

+0

: «Некоторые браузеры позволяют пользователю устанавливать минимальный размер шрифта, который не может быть запущен таблицей стилей любого веб-сайта, и есть даже браузеры с таким минимальным значением, установленным по умолчанию (так что пользователь делает не нужно активно выбирать) ... так что ваши ярлыки могут появиться в конце концов. » – JPM

0

Вы можете использовать visibility скрыть родителя и показать дочерний элемент.

p { 
 
    visibility: hidden; 
 
} 
 
p > :first-child { 
 
    visibility: visible; 
 
}
<p><span>*</span>Here lies a note.</p>

+0

Изначально это задумано, что это не сработает. Приятно удивлен. Ухоженная. Насколько хорошо поддерживается 'видимость'? (Похоже, я не единственный, кто ошибочно занижен) – Eamonn

+0

Вы можете увидеть совместимость браузера в конце https://developer.mozilla.org/en-US/docs/Web/CSS/visibility –

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

  • Нет связанных вопросов^_^