2013-03-13 3 views
5

Есть ли возможность спрятать части svg в макете печати.Скрыть svg детали на печати

я хотел специальным образом, чтобы скрыть highstock rangeSelector и навигатор воли страницу печати.

Это должно работать без кнопок js triggert. Он должен работать при использовании кнопки печати браузеров.

Есть ли возможность показать/скрыть элемент css media = print и связать это событие с jquery?

нужно скрыть на желтые части на макете печати: http://i49.tinypic.com/24mbxop.png

для этого примера:

$(function() { 

    $.getJSON('http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?', function(data) { 
     // Create the chart 
     window.chart = new Highcharts.StockChart({ 
      chart : { 
       renderTo : 'container' 
      }, 

      rangeSelector : { 
       selected : 1 
      }, 

      title : { 
       text : 'AAPL Stock Price' 
      }, 

      series : [{ 
       name : 'AAPL', 
       data : data, 
       tooltip: { 
        valueDecimals: 2 
       } 
      }] 
     }); 
    }); 

}); 

http://jsfiddle.net/gh/get/jquery/1.7.2/highslide-software/highcharts.com/tree/master/samples/stock/demo/basic-line/

+0

Да, 'display: none; visibility: hidden;' на элементах, классе или ID части svg. Этот вывод в медиа = print –

+0

Но эти элементы не имеют класса id. Это нужно сделать с помощью javascript – GreenRover

+0

С помощью jQuery это можно сделать с помощью [.hide()] (http://api.jquery.com/hide/) –

ответ

7

Что сказал @Bondye.

Создать класс что-то вроде

@media print { 
    .unprintable { 
     visibility: hidden; 
    } 
} 

и применить класс к SVG элементы, которые вы не хотите печатать

<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> 
    <circle cx="50" cy="50" r="40" fill="red" /> 
    <circle cx="150" cy="50" r="40" fill="red" /> 
    <circle cx="50" cy="150" r="40" fill="blue" class="unprintable" /> 
    <circle cx="150" cy="150" r="40" fill="red" /> 
</svg> 

И вы пытаетесь напечатать, синий круг будет невидим ,

http://jsfiddle.net/EqDGQ/

Если visibility: hidden; не работает для вас, попробуйте display: none;, а также.

EDITED

Если вы не можете добавить класс, когда они нарисованы, использовать Javascript, чтобы добавить этот класс после загрузки страницы.

Вы не можете использовать hide(), потому что он также удалит элементы с экрана. Вам нужно будет открыть новую вкладку/окно и вызвать hide(), но, как упоминается в вопросе, пользователи могут использовать меню браузера для печати. Тогда у вас нет возможности открыть новую вкладку/окно и вызвать hide().

Таким образом, вы должны добавить класс .unprintable, когда страница загружается. Затем на экране отображается все, но при печати печатные элементы не печатаются.

Если вы разместите ссылку на сайт, и скажите, что вы хотите скрыть, я могу помочь вам писать код JS, но это будет что-то вроде: http://jsfiddle.net/EqDGQ/1/

$(function() { 
    $('svg circle[fill="blue"]').attr('class', 'unprintable'); 
}); 

---- ------------

Отредактировано снова! :)

Я написал эту функцию JS (требуется jQuery), которая добавляет ".нецензурным»класс всех SVG элементов в прямоугольной области:

setUnprintableArea = function(id, xMin, yMin, xMax, yMax, rightAligned) { 
    if (rightAligned) { 
     svgWidth = $('#'+id+' .highcharts-container svg')[0].getBoundingClientRect().width; 
     xMin += svgWidth; 
     xMax += svgWidth; 
    } 
    $('#'+id+' .highcharts-container svg *').filter(function() { 
     rect = this.getBoundingClientRect(); 
     return (xMin <= rect.left && rect.right <= xMax && 
       yMin <= rect.top && rect.bottom <= yMax); 
    }).attr('class', 'unprintable'); 
}; 

и вы можете вызвать эту функцию следующим образом:

setUnprintableArea('container', 15, 45, 240, 70); // Zoom 
setUnprintableArea('container', -55, 15, 0, 40, true); // Top-right Buttons 
setUnprintableArea('container', 0, 430, Number.MAX_VALUE, Number.MAX_VALUE); // Horiz Scroll Bar 

Если вам нужно, чтобы скрыть то, что это выравнивание по правому краю, установите rightAligned парам, чтобы true установить ось ординат на правом краю (имеется в виду SVG х = 0 на правом краю) и отрегулировать Xmin и Xmax соответственно

Я положил это на скрипке:. http://jsfiddle.net/DXYne/1/

Может ли это быть решением?

+0

Хорошая идея, но не так просто решить. Попробуйте добавить непечатаемый класс для «зум-контролов», «управления диапазоном дат» и «фокуса оси x» http://jsfiddle.net/gh/get/jquery/1.7.2/highslide-software/highcharts.com/ tree/master/samples/stock/ demo/basic-line/ – GreenRover

+0

@GreenRover, я обновил свой ответ, пожалуйста, проверьте его: – haejeong87

+0

Thx haejeong, он работает, но не очень надежен. У вас есть: http://jsfiddle.net/DXYne/6/ Он работает только для половины элементов. Пожалуйста, включите/отключите DEBUG_GREEN для тестирования. – GreenRover

2

выше верно, но подход, который не вносит новый класс CSS, JavaScript (несмотря на то, что я люблю его так), или логику выполнения:

@media print { 
    svg circle[fill="blue"] { 
     display:none; 
    } 
} 

Надеется, что это помогает.

+2

хорошо пункт! Что-то простое, как скрытие синего круга, легко, но если логика о том, что скрыть, станет сложной, CSS станет такой же сложной. Также есть вещи, которые вы не сможете достичь, используя чистый CSS, например, сокрытие всех кругов, расположенных под горизонтальной линией. Но в этом примере ваше решение, безусловно, более изящно! Благодарю. – haejeong87

+0

Я думаю, вы все еще можете использовать CSS, потому что вы делаете что-то действительно сумасшедшее с макетом. hr + svg circle [fill = blue] или .class> svg circle [fill = blue] – Jesse

+1

@ Jesse мои мысли точно. OP просто хочет скрыть 2-3 элемента; меньше код, больше пива. Просто мое мнение. – couzzi