我已经使用了
Visual Studio Online一段时间的项目,他们在他们的在线代码查看器中选择圆形边框的方式非常有趣:
我已经尝试检查元素并寻找某种自定义CSS,但没有运气。
我有一种感觉,这需要一些复杂的“黑客”使其工作,但似乎非常有趣,因为我从来没有看过它。
他们如何能够将圆形边框应用于选择?
注意:正常选择完全隐藏在WHILE选择中,舍入选择就像常规选择一样跟随您的光标。没有选择任何东西后。
编辑:我有created a fork的@ Coma的答案应该在Firefox中工作,并选择鼠标如果移动使用:
$(document).on('mousemove',function () {
(某些情况下的边界仍然可以使用工作。)
解决方法
不完美,但它的工作:
http://jsfiddle.net/coma/9p2CT/
删除真正的选择
::selection { background-color: transparent; }
添加一些样式
span.highlight { background: #ADD6FF; } span.begin { border-top-left-radius: 5px; border-bottom-left-radius: 5px; } span.end { border-top-right-radius: 5px; border-bottom-right-radius: 5px; } pre.merge-end > span:last-child { border-bottom-right-radius: 0; } pre.merge-end + pre > span:last-child { border-top-right-radius: 0; } pre.merge-begin > span:first-child { border-bottom-left-radius: 0; } pre.merge-begin + pre > span:first-child { border-top-left-radius: 0; }
将节点元素中的每个字符包起来
var format = function () { var before = -1; var html = $.trim(editor.text()) .split("\n") .reverse() .map(function (line) { var a = line.length === before ? 'merge-end' : ''; before = line.length; return '<pre class="' + a + '"><span>' + line.split('').join('</span><span>') + '</span></pre>'; }) .reverse() .join(''); editor.html(html); };
var getSelectedNodes = function () { var i; var nodes = []; var selection = rangy.getSelection(); for (i = 0; i < selection.rangeCount; ++i) { selection .getRangeAt(i) .getNodes() .forEach(function (node) { if ($(node).is('span')) { nodes.push(node); } }); } return nodes; }; var highlight = function (nodes,beforeNode) { var currentNode = $(nodes.shift()).addClass('highlight'); var currentParent = currentNode.parent(); if (beforeNode) { var beforeParent = beforeNode.parent(); if (currentParent.get(0) !== beforeParent.get(0)) { currentNode.addClass('begin'); beforeNode.addClass('end'); beforeParent.addClass('merge-begin'); } } else { currentNode.addClass('begin'); } if (nodes.length) { highlight(nodes,currentNode); } else { currentNode.addClass('end'); } }; format(); $(document).on('mouseup',function () { $('.highlight').removeClass('highlight begin end'); highlight(getSelectedNodes()); });