2013-02-11 2 views
13

Я видел что-то странное сегодня. Посмотрите на фотографии, связанные с сообщением (ниже). Я сделал ввод [type = "text"]. Его «1» на экране. Это css выглядит примерно так;Тень корень div внутри вход

table tbody input { 
    width: 40px; 
    border: none; 
    height: 16px; 
} 

Просто обычный ввод, кроме этого у него нет границ.

Затем я посмотрел на инструменты dev, и я увидел то, чего я никогда раньше не видел. «# Shadow-root» и div внутри входа.

Я знаю, что dev-tools добавляет что-то от себя, чтобы отображать подсказки на исходной веб-странице. Тем не менее, мне очень интересно, почему он добавляет div внутри ввода, и как это вообще возможно сделать что-то подобное на движке webkit.

Хром-dev-tools как-то странный в прошлый раз, у меня были некоторые проблемы с ним. Например, он удвоил файл style.css и забыл загрузить другой, что стало причиной ужасного вида jquery-календаря (только при загрузке в моем браузере).

Это, вероятно, не ошибка, а особенность, но я хотел бы знать больше об этом

Input visible in browser (it's not straight, adhoc screen)

This input visible from the dev-tools side

ответ

9

Это Shadow DOM.

Просто нажмите на опции и выключить "показать Shadow DOM" варианты ..

w3c проект можно найти на https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html

и относительно Chrome см http://chemicaloliver.net/programming/inspecting-the-shadow-dom-in-google-chrome-inspector/

+0

Привет, вроде поздно здесь, но я имею вопрос где Shadow DOM (# shadow-root) добавляет bre aking в верхней части страницы. Я уже отключил опцию Shadow DOM, какие-то идеи? – andufo

+0

@andufo the shadow DOM, обсуждаемая здесь, относится только к инструментам разработчика. Откуда вы знаете, что ваша проблема связана с теневым DOM, а не с фактическим HTML/CSS? –

+0

@ gaby-aka-g-petrioli Я уже провел несколько проверок, это определенно происходит только в Chrome. Что-то добавляет 5 пустых строк после – andufo

5

Как показала Габи Петриоли, это Тень DOM. Он создается браузером для предоставления интерфейса инкапсуляции в HTML, для сторонних библиотек и т. Д.

Инкапсуляция представляет собой концепцию ООП, в которой объекты могут ограничивать доступ к их собственным данным, чтобы сторонний код не мог произвольно стереть его.

В HTML отсутствуют возможности инкапсуляции, что особенно важно для сторонних библиотек (jQuery, твиттер-кнопок и т. Д.). Shadow DOM был изобретен для обеспечения функциональной инкапсуляции для различных поддеревьев DOM. Это достигается за счет сохранения функциональных поддеревьев отдельно от дерева документов (и друг друга). Это разделение теневых поддеревьев DOM называется границей тени. правила CSS и запросы DOM не пересекают границы тени, и, таким образом, обеспечивают герметизацию (1)

Как Доминик Куни выразился:. Вот фундаментальная проблема, которая делает виджеты, построенные из HTML и JavaScript трудно use: Дерево DOM внутри виджета не инкапсулировано из остальной части страницы. Отсутствие инкапсуляции означает, что ваша таблица стилей документов может случайно применяться к частям внутри виджета; ваш JavaScript может случайно изменить части внутри виджета; ваши идентификаторы могут пересекаться с идентификаторами внутри виджета; и так далее.(2)

Дополнительная литература:

Basic introductory description of the Shadow DOM

(1) A more complete technical description - the second part of this article explains how to use the Shadow DOM yourself

(2) Dominic Cooney's article: Shadow DOM 101

Shadow DOM - W3C Working Draft 17 June 2014