2011-07-28 40 views
11

Thật dễ dàng để tạo cửa sổ bật lên với thuộc tính "tiêu đề" trong SVG. Nhưng làm thế nào để bạn đạt được hiệu quả tương tự với CSS.Làm cách nào để tạo "tiêu đề" (chú giải công cụ, cửa sổ bật lên, văn bản thay thế) trong CSS được sử dụng với SVG, không có JavaScript

Đây là minh họa tôi đang làm cho Wikimedia và tôi cố gắng để có hầu hết những thứ mà những người theo đuôi khác muốn sửa trong một bản định kiểu được nhúng, với các thuộc tính kiểu được nhóm theo chủ đề thực tế. Hầu hết các biên tập viên wikipedia là những người mù chữ máy tính, bạn không thể mong đợi họ săn lùng rất nhiều mã để sửa đổi và nếu họ phải thay đổi bất kỳ thứ gì ngoài các giá trị CSS đơn giản trong mã, thì có thể bạn sẽ gặp phải một mớ hỗn độn khó chịu . Nếu tôi làm cho điều này trở nên khó khăn cho bộ não kém của họ, thì sớm hay muộn ai đó sẽ làm cho tập tin không thể duy trì được bằng cách sử dụng Inkscape, Illustrator hoặc một số trình soạn thảo vector khác không kém kinh khủng.

Tôi có thể sử dụng Javascript, nhưng điều đó sẽ làm cho hình minh họa ít tiếp cận hơn và làm cho mã trở nên khó hiểu hơn đối với những người cần chỉnh sửa nó. Ngoài ra, một số tệp SVG sử dụng Javascript đã bị xóa khỏi Wikimedia vì điều đó, nhưng tôi không chắc đó có phải là một quy tắc tuyệt đối hay không.


Tôi vừa phát hiện khi tôi xác thực tệp của mình rằng thuộc tính tiêu đề trong SVG không được phép ở nơi tôi đã sử dụng, nhưng nó hoạt động với hầu hết các trình duyệt. Theo tiêu chuẩn, bạn nên sử dụng phần tử tiêu đề, nhưng điều đó dường như không hoạt động với bất kỳ trình duyệt nào. Ngoài ra, theo tiêu chuẩn, tôi có thể cung cấp thuộc tính title cho một phần tử kiểu, nhưng điều đó dường như không hoạt động với bất kỳ trình duyệt nào và nó sẽ yêu cầu tôi sử dụng 180 phần tử kiểu thay vì chỉ một (mã là được tạo ra bởi một kịch bản, do đó, nó không phải là một vấn đề đối với tôi để tạo ra chúng, nó chỉ là nó sẽ làm cho mã lớn hơn nhiều và khó hiểu hơn).


Hai "câu trả lời" mà tôi chưa nhận được cho câu hỏi tôi đã hỏi và thậm chí không hữu ích từ xa.

I không quan tâm nếu hình ảnh có thể chỉnh sửa được trong Inkscape. Inkscape là một công cụ tốt để tạo ra hình ảnh bitmap (ngay cả khi bạn phải chạy chúng thông qua một số chương trình khác để có được nén tốt hơn sau đó). Inkscape tạo các tệp SVG (hoặc bất kỳ tệp hình ảnh dựa trên vector nào dành cho đối tượng, các tệp hình ảnh dựa trên vector mà Inkscape tạo ra chỉ thực sự hữu ích với Inkscape), Inkscape thực sự là một công cụ rất nghèo để chọn tạo SVG hình ảnh được dùng như một sản phẩm cuối cùng; Sodipodi là một công cụ tốt cho điều đó, nhưng Inkscape không phải là Sodipodi, chỉ dựa trên Sodipodi (không may, phiên bản C cũ của Sodipodi không chạy tốt trên các hệ thống máy tính hiện đại và phiên bản C++ chưa bao giờ kết thúc). Tôi muốn làm cho hình ảnh của tôi dễ dàng chỉnh sửa bằng trình soạn thảo văn bản, do đó không có người dùng Wikipedia nào bị cám dỗ sử dụng Inkscape và làm cho tệp không thể quét được (và trong quá trình này tăng kích thước từ ít hơn 2 MB đến hơn 60 MB, nếu bạn lưu nó trong Inkscape dưới dạng hình ảnh SVG "chuẩn" (không phải lúc nào cũng cung cấp tệp tuân thủ chuẩn), thì định dạng tệp dựa trên svg có định dạng tệp lớn hơn).

Tôi không nghĩ rằng wikipedia cho phép javascript trong hình ảnh SVG, do đó, Javascript nằm ngoài câu hỏi.

Tôi đã biết cách tạo chú giải công cụ bằng javascript và hai phương pháp khác nhau để tạo chú giải công cụ trong SVG (nhưng không phải trong CSS được nhúng trong SVG).Lý do, ngoài câu hỏi đã được đề cập trong câu hỏi ban đầu, tôi không muốn sử dụng mã SVG cho chú giải công cụ là không có trình duyệt web hỗ trợ chuẩn, nhưng SVG-người xem thực hiện (nhưng không phải là tiêu chuẩn không chú giải công cụ làm việc với trình duyệt), vì vậy người nào đó sẽ tự sửa lỗi chú giải công cụ trong tệp (với trình chỉnh sửa văn bản), sẽ phải thay đổi văn bản ở hai vị trí khác nhau, rất có thể, theo thời gian, dẫn đến các chú giải công cụ khác nhau khi xem trong các trình duyệt/người xem khác nhau.

+12

Hầu hết các biên tập viên wikipedia là người mù chữ máy tính [cần dẫn nguồn] –

Trả lời

1

Theo như tôi có thể nói bạn không thể. Phần tử SVG có vẻ hoạt động kỳ quặc.

tôi nghĩ bạn có thể áp dụng một khái niệm tương tự như thế này sử dụng CSS3:

<style type="text/css"> 
acronym{ 
    position:relative 
} 
acronym:after { 
    content:attr(title); 
    position:absolute; 
    position:absolute; 
    left:100%; 
    margin-left:-10px; 
    top:-0.5em; 
    z-index:2; 
    padding:0.25em; 
    width:200px; 
    background-color:#f1f1f1; 
    text-align:center; 
    display:none; 
} 
acronym:hover:after{ 
    display:block; 
} 
</style> 

<acronym title="Keep It Simple Stupid"><a href="/">KISS</a></acronym> 

Nhưng :after Selector dường như không làm việc trên các yếu tố SVG

Tôi nghĩ rằng đặt cược tốt nhất của bạn là một jQuery kịch bản chạy trên $(document).ready() và thực hiện tất cả việc nâng hạng nặng cho bạn.

+1

Tôi đã cố gắng một cái gì đó tương tự như CSS của bạn, thậm chí trước khi tôi hỏi những câu hỏi (và nó không phải là một phần của tiêu chuẩn có). Tôi đã thực sự đọc các tiêu chuẩn SVG và CSS, tôi đã chỉ hy vọng rằng tôi đã bỏ lỡ một cái gì đó hoặc rằng các trình duyệt theo một tiêu chuẩn de-facto tôi không biết về. Nếu các trình duyệt hỗ trợ JavaScript trong SVG (không nhiều người làm), nó là khá đơn giản để thực hiện điều này ngay cả khi không có jQuery. Tuy nhiên, jQuery có hữu ích trong ngữ cảnh Wikipedia hay không, tôi không chắc điều gì sẽ giúp Wikipedia tiếp tục. Như đã đề cập trong câu hỏi, tôi thậm chí không chắc rằng Wikimedia cho phép JavaScript bên trong mã SVG. – mja

4

Tôi thường sử dụng thuộc tính (không hợp lệ) title = "" trên các phần tử SVG vì nó đơn giản và dường như hoạt động trong hầu hết các trình duyệt. Tôi hiểu yêu cầu của bạn là nó tuân thủ các tiêu chuẩn và mọi người có thể chỉnh sửa đồ họa trong InkScape một cách minh bạch và không phá vỡ các chú giải công cụ - vì điều này bạn sẽ phải sử dụng một số JavaScript. Dưới đây là ví dụ nhanh, tôi hy vọng bạn sẽ thấy hữu ích, nó sẽ đính kèm sự kiện di chuột vào mỗi phụ huynh trực tiếp của phần tử và tải nội dung văn bản trong chú giải công cụ được hiển thị bên cạnh con trỏ. Điều này trong khi vẫn giữ được khả năng tương thích của InkScape và khả năng sử dụng hộp thoại "Object Properties" của InkScape để đặt văn bản chú giải công cụ.

Với ví dụ SVG sau:

<svg xmlns="http://www.w3.org/2000/svg"> 
    <title>Main Title</title> 
    <g id="group1"> 
    <title>Title One</title> 
    <circle cx="120" cy="60" r="40" fill="#993333" /> 
    </g> 
    <g id="group2"> 
    <title>Title Two</title> 
    <circle cx="60" cy="60" r="40" fill="#339933" /> 
    <g id="group3"> 
     <circle cx="180" cy="60" r="40" fill="#333399" /> 
     <title>Title Three</title> 
    </g> 
    </g> 
</svg> 

Đầu tiên thêm một yếu tố tooltip giả:

<g id="toolTip" transform="translate(0,0)"> 
    <rect width="150" height="25" /> 
    <text x="5" y="18"> </text> 
</g> 

Give it một số phong cách:

<style> 
g#toolTip { 
visibility: hidden; 
} 
    g#toolTip rect { 
    fill: #FFCC00; 
    } 
    g#toolTip text { 
    font-size: 16px; 
    } 
</style> 

Sau đó chèn một rảy JS:

<script> 
    <![CDATA[ 
    var toolTip = document.getElementById('toolTip'); 
    var titles = document.getElementsByTagName('title'); 
    for (var i = 0; i < titles.length; i++) { 
    titles.item(i).parentNode.addEventListener('mouseover', function(e) { 
     showTip(this,xy(e)); 
    }, true); 
    titles.item(i).parentNode.addEventListener('mouseout', function() { 
     hideTip(); 
    }, true); 
    } 
    function showTip(element,pos) { 
    var text = element.getElementsByTagName('title')[0].childNodes[0].nodeValue; 
    toolTip.getElementsByTagName('text')[0].childNodes[0].nodeValue = text; 
    toolTip.setAttribute('transform', 'translate(' + pos + ')'); 
    toolTip.style.visibility = 'visible'; 
    } 
    function hideTip() { 
    toolTip.style.visibility = 'hidden'; 
    } 
    function xy(e) { 
    if (!e) var e = window.event; 
    if (e.pageX || e.pageY) { 
     return [e.pageX,e.pageY] 
    } else if (e.clientX || e.clientY) { 
     return [e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,e.clientY + document.body.scrollTop + document.documentElement.scrollTop]; 
    } 
    return [0,0] 
    } 
    ]]> 
</script> 

Cần lưu ý: Khối JS cần phải ở cuối tệp SVG - và nếu bạn sử dụng trình soạn thảo XML trong InkScape (hiếm) nó sẽ làm hỏng tập lệnh (điều này có thể được giải quyết bằng cách chuyển sang tệp JS bên ngoài) và thêm một số phát hiện sẵn sàng DOM).

Phương pháp này cũng hy vọng rằng a) tất cả < tiêu đề > yếu tố nên được trả lại như tooltips và b) rằng chỉ có bao giờ một < tiêu đề > yếu tố mỗi cha mẹ (kỳ quặc, spec SVG cho phép nhiều) - ở đây tôi đã khó mã hóa nó để chỉ đơn giản là sử dụng các phần tử con > đầu tiên gặp phải, bỏ qua bất kỳ những cái tiếp theo.

Lưu ý: chức năng xy (e) chỉ cần thiết để có được những mâu thuẫn trong trình duyệt khi nói đến vị trí con trỏ - bạn có thể không cần đến nó, hoặc bạn có thể muốn tự cuộn.

Phần thưởng: Điều này có thể dễ dàng được mở rộng để sử dụng phần tử <desc>, nếu bạn cần chú giải công cụ phức tạp hơn với các bit văn bản dài hơn.

+1

Sigh, không ai đọc câu hỏi. – mja

+0

Thở dài, tại sao không ai đọc câu hỏi. Tôi đã biết cách làm điều này. Tôi KHÔNG muốn hình ảnh chỉnh sửa trong Inkscape, tôi muốn nó dễ dàng chỉnh sửa trong một trình soạn TEXT. Và javascript là ra câu hỏi, vì wikipedia, có khả năng, tôi không cho phép javascript trong hình ảnh SVG. – mja

+1

Xin lỗi, xấu của tôi. Nhưng ít nhất bây giờ bạn biết rằng câu trả lời duy nhất là sử dụng _both_ và title = "" - và hy vọng ai đó tìm thấy câu trả lời hữu ích! – <span class="text-secondary"> <small> <span></span> </small> </span> </p> </div> </div> </div> </div> </div> </article> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">0<i class="fa fa-thumbs-up"></i></span> </div> <div class="post-offset"> <div class="answer fmt"> <p>Bài viết này: <a href="http://codepen.io/recursiev/pen/zpJxs" rel="nofollow">http://codepen.io/recursiev/pen/zpJxs</a> minh họa một số loại chú giải công cụ với SVG.</p> <p>Bao gồm những gì bạn đã yêu cầu: SVG + CSS.</p> <p>Về cơ bản:</p> <pre><code class="prettyprint-override"><g class="tooltip css" transform="translate(200,50)"> <rect x="-3em" y="-45" width="6em" height="1.25em"/> <text y="-45" dy="1em" text-anchor="middle" fill="LightSeaGreen"> SVG/CSS Tip</text> </g> </code></pre> <p>Với một số CSS thích hợp cũng như:</p> <pre><code class="prettyprint-override">.tooltip { pointer-events:none; /*let mouse events pass through*/ opacity:0; transition: opacity 0.3s; text-shadow:1px 1px 0px gray; } g.tooltip:not(.css) { fill:currentColor; } g.tooltip rect { fill: lightblue; stroke: gray; } </code></pre> <p>bài viết này: <a href="http://www.scientificpsychic.com/etc/css-mouseover.html" rel="nofollow">http://www.scientificpsychic.com/etc/css-mouseover.html</a> chứng tỏ CSS chỉ tooltips.</p> <p>cơ bản:</p> <pre><code class="prettyprint-override"><span class="dropt" title="Title for the pop-up">Hot Zone Text <span style="width:500px;">Pop-up text</span> </span> </code></pre> <p>với CSS này:</p> <pre><code class="prettyprint-override">span.dropt {border-bottom: thin dotted; background: #ffeedd;} span.dropt:hover {text-decoration: none; background: #ffffff; z-index: 6; } span.dropt span {position: absolute; left: -9999px; margin: 20px 0 0 0px; padding: 3px 3px 3px 3px; border-style:solid; border-color:black; border-width:1px; z-index: 6;} span.dropt:hover span {left: 2%; background: #ffffff;} span.dropt span {position: absolute; left: -9999px; margin: 4px 0 0 0px; padding: 3px 3px 3px 3px; border-style:solid; border-color:black; border-width:1px;} span.dropt:hover span {margin: 20px 0 0 170px; background: #ffffff; z-index:6;} </code></pre> <p>giữa này, bạn sẽ có thể để có được chính xác những gì bạn muốn.</p> <p>CẬP NHẬT: Tính năng này phù hợp với tôi trong Chrome v44, nhưng không hoạt động trong Internet Explorer v9. IE chỉ cung cấp cho tôi tiêu đề của cửa sổ bật lên chứ không phải chính quảng cáo.</p> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/31839153">Nguồn</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2015-08-05 17:32:46</span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> </div> </article> </div> <div class="clearfix"> </div> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1575177025"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img.uwenku.com/uwenku/script/side.js?t=1644592049017"></script> <script type="text/javascript" src="http://img.uwenku.com/uwenku/plugin/highlight/highlight.pack.js"></script> <link href="http://img.uwenku.com/uwenku/plugin/highlight/styles/docco.css" media="screen" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $('pre').each(function(i, e) { hljs.highlightBlock(e, "<span class='indent'> </span>", false) }); </script> <div class="col-lg-3 col-md-4 col-sm-5"> <div id="rightTop"> <div class="row"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="5415218910" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> Câu hỏi mới nhất </div> <div class="m-b-sm m-t-sm clearfix"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://vi.uwenku.com/question/p-avqnpzcj-s.html" target="_blank" title="Hoàn tác không hoạt động trong IB (Bộ dựng giao diện) trong Xcode 5"> Hoàn tác không hoạt động trong IB (Bộ dựng giao diện) trong Xcode 5 </a> </li> <li class="side_article_list_item"> 2. <a href="http://vi.uwenku.com/question/p-clmjdtml-t.html" target="_blank" title="Làm sao để tuần tự hóa các cấu trúc bằng cách sử dụng bộ đệm giao thức và sử dụng chúng trong Dart trên Ajax"> Làm sao để tuần tự hóa các cấu trúc bằng cách sử dụng bộ đệm giao thức và sử dụng chúng trong Dart trên Ajax </a> </li> <li class="side_article_list_item"> 3. <a href="http://vi.uwenku.com/question/p-xecxrcov-r.html" target="_blank" title="serialization JSON.NET nếu ghi đè ToString"> serialization JSON.NET nếu ghi đè ToString </a> </li> <li class="side_article_list_item"> 4. <a href="http://vi.uwenku.com/question/p-fvtjjfmk-k.html" target="_blank" title="Xuất hiện văn bản không có cấu trúc trong NLTK"> Xuất hiện văn bản không có cấu trúc trong NLTK </a> </li> <li class="side_article_list_item"> 5. <a href="http://vi.uwenku.com/question/p-rkqftevb-bn.html" target="_blank" title="Làm cách nào để kiểm soát tên công việc của tổ chức nhưng giữ thông tin về giai đoạn?"> Làm cách nào để kiểm soát tên công việc của tổ chức nhưng giữ thông tin về giai đoạn? </a> </li> <li class="side_article_list_item"> 6. <a href="http://vi.uwenku.com/question/p-evpsmunh-bn.html" target="_blank" title="Cách tốt nhất để thêm khoảng thời gian trong PHP là gì?"> Cách tốt nhất để thêm khoảng thời gian trong PHP là gì? </a> </li> <li class="side_article_list_item"> 7. <a href="http://vi.uwenku.com/question/p-redvxicq-r.html" target="_blank" title="cách từ chối người dùng truy cập các thư mục con và tệp?"> cách từ chối người dùng truy cập các thư mục con và tệp? </a> </li> <li class="side_article_list_item"> 8. <a href="http://vi.uwenku.com/question/p-wfgoxtlj-q.html" target="_blank" title="ios7 cử chỉ pan mới để quay trở lại trong ngăn xếp điều hướng không xóa lựa chọn xem bảng"> ios7 cử chỉ pan mới để quay trở lại trong ngăn xếp điều hướng không xóa lựa chọn xem bảng </a> </li> <li class="side_article_list_item"> 9. <a href="http://vi.uwenku.com/question/p-vofhaxyh-e.html" target="_blank" title="htaccess mật khẩu bảo vệ tập tin với người dùng khác nhau"> htaccess mật khẩu bảo vệ tập tin với người dùng khác nhau </a> </li> <li class="side_article_list_item"> 10. <a href="http://vi.uwenku.com/question/p-avwpafgq-bg.html" target="_blank" title="Reindexing một mức độ của một MultiIndex đến trật tự tùy ý trong Pandas"> Reindexing một mức độ của một MultiIndex đến trật tự tùy ý trong Pandas </a> </li> </ul> </div> </div> </div> <p class="article-nav-bar"></p> <div class="row sidebar article-nav"> <div class="row box_white visible-sm visible-md visible-lg margin-zero"> <div class="top"> <h3 class="title"><i class="glyphicon glyphicon-th-list"></i> Các vấn đề liên quan</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item">Không có vấn đề liên quan^_^</li> </ul> </div> </div> </div> </div> </div> </div> </div><!-- wrap end--> <!-- footer --> <footer id="footer"> <div class="bg-simple lt"> <div class="container"> <div class="row padder-v m-t"> <div class="col-xs-8"> <ul class="list-inline"> <li><a href="http://vi.uwenku.com/contact">Liên lạc với chúng tôi</a></li> <li>© 2020 VI.UWENKU.COM</li> <li><a target="_blank" href="https://beian.miit.gov.cn/">沪ICP备13005482号-4</a></li> <li><script type="text/javascript" src="https://v1.cnzz.com/z_stat.php?id=1280101193&web_id=1280101193"></script></li> <li><a href="http://www.uwenku.com/" target="_blank" title="优文库">简体中文</a></li> <li><a href="http://hk.uwenku.com/" target="_blank" title="優文庫">繁體中文</a></li> <li><a href="http://ru.uwenku.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.uwenku.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.uwenku.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.uwenku.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.uwenku.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.uwenku.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.uwenku.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.uwenku.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.uwenku.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.uwenku.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.uwenku.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f78a970f17b19a79fc477a3378096f29"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>