CSSκ° ν¬ν¨λ νλ μ€ μ»¨ν
μ΄λκ° μλ κ²½μ°
λμ€νλ μ΄: νλ μ€;
νλ μ€ λ°©ν₯: ν;
κ·Έλ¦¬κ³ 4λͺ
μ μμ΄λ€κ³Ό
νλ μ€ μ±μ₯: 1;
νλ μ€ κΈ°μ€: 25%;
κ° ν¬κΈ°κ° μμμ 25%μΈ 4κ°μ μ°¨νΈκ° μλ νλμ νμ΄ μμ κ²μΌλ‘ μμν©λλ€.
μ€μ νλμ λΆλͺ¨μ ν¬κΈ°μ λ°λΌ λ¬λΌμ§ μ μμ΅λλ€.
25%λ‘ ν νμ 4κ° νλͺ©(μμ λμ)
ν μ€μ μμ ν¬κΈ°μ νλͺ© 3κ°μ λ€μ μ€μ 100% νλͺ©.
λ΄λΆμ 100% νλͺ©μ΄ μλ 4κ°μ ν.
http://jsfiddle.net/xLz8tcrc/1/
ν¬λ‘¬
νμ΄μ΄νμ€
λ°λͺ¨μμ νλ μ€ μμμ ν¬κΈ°λ₯Ό μ‘°μ ν ν chart.reflow()
λ₯Ό μ€ννλ μ€λν«μ μΆκ°νμ΅λλ€. μ΄κ²μ _window_ ν¬κΈ°κ° μ‘°μ λ λλ§ μ°¨νΈκ° μλμΌλ‘ 리νλ‘μ°λκΈ° λλ¬Έμ νμν©λλ€.
λν μ°¨νΈ μ»¨ν
μ΄λμ overflow: hidden
λ₯Ό μΆκ°νλ©΄ 컨ν
μ΄λκ° μ°¨νΈλ³΄λ€ μμμ§ μ μμΌλ―λ‘ μΆμν λ 컨ν
μ΄λκ° λ무 λμ΄μ§λ κ²μ λ°©μ§ν μ μμ΅λλ€.
μ΄λ κ² νλ©΄ λ¬Έμ κ° ν΄κ²°λ©λκΉ? http://jsfiddle.net/xLz8tcrc/2/
λ΅μ₯μ λ³΄λ΄ μ£Όμ
μ κ°μ¬ν©λλ€.
chart.reflow()λ₯Ό μ¬μ©νλ κ²μ μλ λ¬Έμ μ λν μμ λ³΄λ€ ν΄κ²° λ°©λ²μ²λΌ 보μ
λλ€. HighChartsκ° μμ μμμ CSS κ·μΉμ λ°λΌ μ μ νκ² ν¬κΈ°κ° μ‘°μ λλ€λ©΄ ν¨μ¬ κ°λ¨ν κ²μ
λλ€.
λλ λ¨μ§ μλ₯Ό κ²μνμ΅λλ€. μ€μ μ¬μ© μ¬λ‘μμ μ°λ¦¬λ μ°½ ν¬κΈ° μ‘°μ λλ μμ μμ ν¬κΈ° μ‘°μ μ μ°¨νΈ ν¬κΈ°λ₯Ό μ‘°μ νκΈ°λ₯Ό μνλ―λ‘ chart.reflow()λ₯Ό νΈμΆν μ μλ λ
Όλ¦¬λ₯Ό ꡬννλ κ²μ΄ 그리 μ½μ§ μμ΅λλ€. μ°½ ν¬κΈ° μ‘°μ μ κ²½μ° μ°½ ν¬κΈ° μ‘°μ μ΄λ²€νΈλ₯Ό μ¬μ©νλ κ²μ΄ λ κ°λ¨ν©λλ€.
λ€λ₯Έ κ΅¬μ± μμμ κ²½μ° μμ κ΅¬μ± μμμ λν΄ μΌμ’
μ ν¬κΈ° μ‘°μ κ°λ₯ν μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ―λ‘ ν¬κΈ° μ‘°μ μ chart.reflowλ₯Ό νΈμΆν μ μμ΅λλ€. μΌλΆ κ²½μ°μλ μλνμ§λ§ λͺ¨λ κ΅¬μ± μμμ λν΄μλ νμ ν μ μμ΅λλ€.
μ§κΈμ ν°μΌμ λ«μ§ μμΌμ λ λ©λλ€. κ·νμ μ κ·Ό λ°©μμ ꡬννλ €κ³ νκ±°λ λ€λ₯Έ μμ΄λμ΄κ° μλ μ¬λμ΄ μμ μ μμ΅λλ€.
λΉμ μ΄ μ€λͺ νλ κ²μ κΈ°λ³Έμ μΌλ‘ μ°λ¦¬κ° Highchartsμμ λ΄λΆμ μΌλ‘ κ°μ§κ³ μλ κ²κ³Ό κ°μ λ¬Έμ μ λλ€. νμ¬ μ°½ ν¬κΈ° μ‘°μ μ λν μλ 리νλ‘μ°λ₯Ό μνν©λλ€. μ΄μμ μΌλ‘λ ν¬ν¨νλ μμ ν¬κΈ° μ‘°μ μ λν μλ 리νλ‘μ°λ μννκ³ μΆμ§λ§ νμ¬ DOM μμ ν¬κΈ° λ³κ²½μ μμ νλ ν¨κ³Όμ μΈ λ°©λ²μ΄ μμ΅λλ€.
ν λ‘ μ http://stackoverflow.com/questions/6492683/how-to-detect-divs-dimension-changed λ₯Ό μ°Έμ‘° setTimeout
λλ requestAnimationFrame
, λ λ€ CPUλ₯Ό λλΉνλ κ² κ°μ΅λλ€.
λ§ν¬ν StackOverflow κ²μλ¬Ό(https://github.com/marcj/css-element-queries)μ μΈκΈλ ResizeSensorλ₯Ό 보μ
¨λμ? λ κ°μ μΆκ° DOM μμμ scroll
μ΄λ²€νΈ 리μ€λλ₯Ό μ¬μ©νμ¬ ν¬κΈ° μ‘°μ μ κ°μ§ν©λλ€. requestAnimationFrame
λ§ μ¬μ©νμ¬ μ μ‘λλ ν¬κΈ° μ‘°μ μ΄λ²€νΈ μλ₯Ό μ νν©λλ€(νλ μλΉ μ΅λ 1κ°).
object
νκ·Έλ₯Ό μ¬μ©νμ¬ μ΄λ₯Ό μννλ λ°©λ²μ μ€λͺ
νλ http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/ λ μμ΅λλ€ resize
μ΄λ²€νΈκ° λ°μν©λλ€.
λ―Έλμλ λΈλΌμ°μ μ ResizeObserver
ꡬνλ κ²μ΄μ§λ§ μ§κΈμ μ€ν κ°λ₯νμ§ μμ΅λλ€. https://github.com/WICG/ResizeObserver/issues/3μ λμ΄λ ν΄λ¦¬νμ΄ λͺ κ°μ§ μμ§λ§ MutationObeserver
λ° ν΄λ§ λλ κΈ°ν λλΉμ μΈ μ κ·Ό λ°©μμ μμ‘΄νλ κ² κ°μ΅λλ€.
λ΄ μκ°μ Highchartsλ ν΅μ¬μμ μ΄μ κ°μ νΈλ¦μ ꡬνν΄μλ μλ©λλ€. μ°½ ν¬κΈ° μ‘°μ μμ κΈ°λ λλΆλΆμ κ²½μ°λ₯Ό μ²λ¦¬νλ©°, μ°½ ν¬κΈ° μ‘°μ μμ΄ μμ ν¬κΈ°κ° μ‘°μ λλ κ²½μ° κ΅¬νμκ° λ€λ₯Έ κ²½μ°λ₯Ό μ²λ¦¬ν μ μλλ‘ chart.reflow
νν¬κ° μμ΅λλ€. λ°λΌμ μμ μ κ·Ό λ°©μ μ€ νλλ₯Ό ν
μ€νΈνκ³ κ·νμ κ²½μ°μ ν¨κ³Όκ° μλ€λ©΄ chart.reflow
μ ν¨κ» μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
+1 μ°λ¦¬λ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκ³ λ¬Έμ κ° flexboxλΌλ κ²μ κΉ¨λ«λ λ° μμν κ±Έλ Έμ΅λλ€.
λ΄κ° νλ μ€ μ¬μ©μ μ€λ¨νλ μ΄μ μ€ νλ ... ν¬κΈ° μ‘°μ μ΄ μμλλ‘ μλνμ§ μκ³ λμ€νλ μ΄ κ·Έλ¦¬λμ λν΄ λμΌν λ₯
λμ€νλ μ΄ μΈλΌμΈ λΈλ‘μ΄ ν¨μ¬ λ«μ΅λλ€.
λ΄κ° νλ μ€ μ¬μ©μ μ€λ¨νλ μ΄μ μ€ νλ ... ν¬κΈ° μ‘°μ μ΄ μμλλ‘ μλνμ§ μκ³ λμ€νλ μ΄ κ·Έλ¦¬λμ λν΄ λμΌν λ₯
μ΄κ²μ λ λ€λ₯Έ ν΄κ²° λ°©λ²μΌ λΏμ λλ€.
μ΄μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? μ΄ @TorsteinHonsi λ₯Ό μμ ν κ³νμ΄
μ λ Angular νλ‘μ νΈμμ Highchartsλ₯Ό μ¬μ©νκΈ° μμνκ³ μ΄κ² μμ κ²½ννμ΅λλ€.
λ΄κ° μ»μ§ λͺ»νλ κ²μ μ°¨νΈκ° μ€μ λ‘ SVG
μ
λλ€. λ°λΌμ 100% ν¬κΈ°λ‘ λ£μ΄λ λ¬Έμ κ° μμ κ²μ
λλ€. λμ λλΉμ λμ΄κ° λͺ
μμ μΌλ‘ svgλ‘ μ§μ μ€μ λλ κ²μ²λΌ 보μ
λλ€.
μλ νμΈμ @GeorgeKnap
Highcharts λ° λΉ Highcharts SVGκ° ν¬ν¨λ λΌμ΄λΈ λ°λͺ¨λ₯Ό μ 곡νμ¬ μΌλμ λ λ΄μ©μ 보μ¬μ€ μ μμ΅λκΉ? μ΄κ²μ΄ μ€ν λ λλ§μ μ€μΌμΌλ§ λ° ν½μ μ λ°λμ μ΄λ€ μν₯μ μ€λκΉ?
@KacperMadej
μ, svgλ λ²‘ν° κ·Έλν½μ
λλ€. μ¦, SVG λλΉμ λμ΄λ₯Ό 100%λ‘ μ€μ ν΄λ λ λλ§μ λμ μν₯μ λ―ΈμΉμ§ μμμΌ ν©λλ€. λ΄κ° νλ Έλ€λ©΄ μμ ν΄ μ£ΌμΈμ.
λ΄λΆ svg
μμ λλΉ CSSλ₯Ό μ¬μ μν μ μμμ΅λλ€.
highcharts-chart::ng-deep {
.highcharts-container,
.highcharts-container svg {
width: 100% !important;
height: 100% !important;
}
}
κ·Έκ²μ μ§κΈ ν©λ¦¬μ μΌλ‘ μ μλν©λλ€.
μ루μ μ 곡μ ν΄ μ£Όμ μ κ°μ¬ν©λλ€.
SVG ν¬κΈ° μ‘°μ μ λ¬Έμ λ ν½μ μ λ°λκ° μμ€λ μ μμΌλ―λ‘ νλ¦Ών λ λλ§μ΄ λ°μν μ μλ€λ κ²μ λλ€. μΌλ° Highcharts μ루μ μ λν λ λ€λ₯Έ λ¬Έμ λ λ κ±°μ λΈλΌμ°μ μ λν μ§μμ λλ€(μ°¨λ¨κΈ°κ° μλλΌ μ μ ν ν΄λ¦¬νμ΄ μλμ§ νμΈνκΈ°λ§ νλ©΄ λ©λλ€).
μ΄ λ¬Έμ μ λν΄ μμΈν μ‘°μ¬ν κ²°κ³Ό μΈ κ°μ§ λ¬Έμ λ₯Ό λ°κ²¬νμ΅λλ€.
컨ν
μ΄λμ ν¬κΈ°λ₯Ό κ²°μ ν λ Highchartsλ scrollWidth
λ₯Ό μ¬μ©νλλ°, μ€μ λλΉκ° νμ ν½μ
μΈ κ²½μ° λ°μ¬λ¦Όλ©λλ€. μλ λ°μ΄μ¬λ¦°μμλ 첫 λ²μ§Έ μ°¨νΈκ° λ무 λμ ν½μ
λ‘ κ·Έλ €μ§κ³ νλ μ€ λ μ΄μμμ΄ 4μ΄μμ 3μ΄λ‘ μ ννκ² λ©λλ€. μ΄κ²μ Math.floor
λ° element.getBoundingClientRect
λ₯Ό μ¬μ©νμ¬ μμ 컀λ°μμ μμ λμμ΅λλ€.
νμ΄μ§ λλ 컨ν
μ΄λμ λλΉλ₯Ό μΆμνλ©΄ μ°¨νΈκ° ν λΉλ 25%λ³΄λ€ λμ΄μ Έ λ μ΄μμμ΄ κΉ¨μ§λλ€. μ΄κ²μ μ΅μμ μ°¨νΈ μ»¨ν
μ΄λμ overflow:hidden
λ₯Ό μΆκ°νμ¬ μμ 컀λ°μμ μμ λμμ΅λλ€.
μ°½μ ν¬κΈ°λ₯Ό μ‘°μ νμ§ μκ³ νλ μ€ μ»¨ν
μ΄λλ₯Ό νλ λλ μΆμν λ μ°¨νΈμ ν¬κΈ°κ° μ‘°μ λμ§ μμ΅λλ€. κ·Έλ€μ μ¬μ ν ββκ·Έλ μ§ μμ§λ§ μ μ΄λ μ§κΈμ λ μ΄μμμ κΉ¨λ¨λ¦¬μ§ μμ΅λλ€. @GeorgeKnap μ μ루μ
μ μΌλΆμμλ μλν μ μμ§λ§ Kacperκ° λ§νλ―μ΄ νλ¦Ών μ°¨νΈκ° μμ±λ μ μμΌλ©° λμ΄μ ν¬κΈ°λ μ‘°μ λκ³ κΈκΌ΄ ν¬κΈ° λ±μ 무μλ©λλ€. http://jsfiddle.net/highcharts/xLz8tcrc/219 μ°Έμ‘° chart.reflow
νΈμΆκ³Ό λμΌν μ€μ : http://jsfiddle.net/highcharts/xLz8tcrc/221/. μνλ μ루μ
μ 컨ν
μ΄λ divμ ν¬κΈ°κ° μ‘°μ λ λ μ΄λ²€νΈλ₯Ό μμ νλ κ²μ΄μ§λ§ νμ¬λ‘μλ μ΄λ¬ν μ΄λ²€νΈκ° Chromeμ ResizeObserver
λΏμ
λλ€.
μμ CSS μ¬μ μ μ루μ
μΌλ‘ μΈν΄ λ§μ°μ€ μ€λ²(λꡬ μ€λͺ
) μμΉμ ν° λ¬Έμ κ° λ°μνμ΅λλ€. μ΄λ₯Ό μμ νκΈ° μν΄ CSS μ¬μ μλ₯Ό μμ ν μ κ±°νκ³ ResizeObserver
ꡬννμ΅λλ€. μμ μμμ ν¬κΈ°λ₯Ό κ΄μ°°νκ³ μ°¨νΈ μ΅μ
μμ μ§μ width
λ° height
μμ±μ λ³κ²½ν©λλ€.
μ΄κ²μ Angular μ루μ
μ΄λ―λ‘ κΈ°λ³Έ DOM μμμ μ‘μΈμ€νκΈ° μν΄ ElementRef
λ₯Ό μ¬μ©νκ³ λ³κ²½ νμΈμ νΈλ¦¬κ±°νκΈ° μν΄ ChangeDetectorRef
λ₯Ό μ¬μ©ν©λλ€.
const resizeObserver = new ResizeObserver(debounce((data: Array<ResizeObserverEntry>) => {
if (this.chartOptions) {
const options = { ...this.chartOptions } as Highcharts.Options;
options.chart!.height = data[0].contentRect.height;
options.chart!.width = data[0].contentRect.width;
this.chartOptions = options;
this.cd.markForCheck();
}
}, 200));
resizeObserver.observe(this.elementRef.nativeElement.children[0]);
곡μ ν΄ μ£Όμ
μ κ°μ¬ν©λλ€! λ€μμ chart.reflow
μ΅μ
μ μλ΅νκ³ ResizeObserver
κ° μ§μλλ κ²½μ° λ΄μ₯λ window.onresize
νΈλ€λ¬μ λ°μΈλ©μ ν΄μ νλ μΌλ° νλ¬κ·ΈμΈμ
λλ€.
// Generic plugin that adds support for listening to container resize rather than
// window resize. As of 2018 only Chrome supports ResizeObserver.
Highcharts.wrap(Highcharts.Chart.prototype, 'setReflow', function(proceed, reflow) {
var chart = this;
proceed.call(this, reflow);
if (reflow !== false && typeof ResizeObserver === 'function') {
// Unbind window.onresize handler so we don't do double redraws
if (this.unbindReflow) {
this.unbindReflow();
}
var ro = new ResizeObserver(function () {
chart.reflow();
});
ro.observe(this.renderTo);
}
});
μλ
,
μ λ νμ΄ μ°¨νΈλ₯Ό μ²μ μ¬μ©ν©λλ€. 첨λΆλ μ€ν¬λ¦°μ·μμ μ°¨νΈκ° 컨ν
μ΄λμ λλΉλ₯Ό μ΄κ³Όνκ³ μμμ λΆλͺ
ν μ μ μμ΅λλ€. μμ½λμΈμ ν΄λ¦νλ©΄ μ΄λ¦¬λ λμΌν νμ΄μ§μ λ§μ μ°¨νΈκ° μμ΅λλ€. λͺ¨λ μ΄κΈ° λ‘λμμ μ°¨νΈ λλΉκ° 컨ν
μ΄λ λλΉλ₯Ό μ΄κ³Όν©λλ€.
μ΄ λ¬Έμ μ λν ν΄κ²° λ°©λ²μ΄ μμ΅λκΉ?
μλλ μμ½λμΈμ λν μ½λμ λλ€.
ν¨μ initsectionclicks(컨ν
μ΄λ) {
$('.fe-section-accordion-header', 컨ν
μ΄λ).click(ν¨μ() {
var λΆλͺ¨ 컨ν
μ΄λ = $(this).parent();
var accordioncontainer = $(parentcontainer).find('.fe-section-accordion-container');
if (accordioncontainer != null)
{
var accordioncontainerOpen = accordioncontainer.is(':visible');
accordioncontainer[accordioncontainerOpen ? 'slideUp' : 'slideDown'](400, "swing", function() {
ToolkitUI.Common.ResizeIFrame();
var highChartsWrapper = $('.fe-section-chart-wrap', accordioncontainer);
if (highChartsWrapper.length) {
$.each(highChartsWrapper,
function(index, obj) {
var hcObj = $(obj).highcharts();
if (hcObj)
hcObj.reflow();
});
}
});
if (!accordioncontainerOpen)
{
$(accordioncontainer).ShowLoadingInsideContainer();
}
$(parentcontainer).find('.fe-expandcollapse').toggleClass("fe-icon-expand", accordioncontainerOpen).toggleClass("fe-icon-collapse", !accordioncontainerOpen);
$('.fe-section-accordion-header', parentcontainer).toggleClass('highlight', !accordioncontainerOpen);
}
$(window).resize();
});
//we have to unbind any click event handlers before attaching a new one, as without unbind we will be attaching the same handler multiple times.
//this is because we are binding the data from the start for each tab when it is clicked, which rebinds the same method again and again.
$('.fe-accordion-expandcollapse-all', container).unbind('click').click(function () {
var isallopen = $(this).hasClass('fe-accordion-collapse');
var counter = 1;
$(this).toggleClass('fe-accordion-expand', isallopen).toggleClass('fe-accordion-collapse', !isallopen);
$('.fe-expandcollapse', container).toggleClass('fe-icon-expand', isallopen).toggleClass('fe-icon-collapse', !isallopen);
$('.fe-section-accordion-header', container).toggleClass('highlight', !isallopen);
$('.fe-section-accordion-container')[isallopen ? 'slideUp' : 'slideDown'](400, "swing", function () {
if (counter == $('.fe-section-accordion-container').length) {
ToolkitUI.Common.ResizeIFrame();
}
counter++;
});
if (!isallopen)
{
$('.fe-section-accordion-container').ShowLoadingInsideContainer();
}
$(window).resize();
});
};
@Nagaraj2106
λ¬Έμ μ λν λΌμ΄λΈ λ°λͺ¨λ₯Ό μΆκ°νμ¬ λ¬Έμ λ₯Ό μ¬ννκ³ λλ²κ·Ένκ³ κ°λ₯ν μ루μ κ³Ό ν΄κ²° λ°©λ²μ ν μ€νΈν μ μλλ‘ νμμμ€. λν μ΄ μ£Όμμμ μ μλ ν΄κ²° λ°©λ²μ νμΈνμμμ€. https://github.com/highcharts/highcharts/issues/6427#issuecomment -438212322
μ°½ ν¬κΈ° μ‘°μ μ reflow()λ₯Ό νΈμΆνκ±°λ νλ¬κ·ΈμΈμ μ¬μ©νμ§ μμλ λ¬Έμ κ° ν΄κ²°λμ§ μμμ΅λλ€. κ·Έλ¬λ SOμμ΄ λ΅λ³μ κ·Έλ κ²νμ΅λλ€ .
λΆνΈμ€νΈλ© 4 νλ μ€ μ»¨ν μ΄λμμ νμ΄ μ°¨νΈλ₯Ό μ¬μ©νκ³ μμ΅λλ€. μ°¨νΈμ ν¬κΈ°λ μλ‘(λκ²) μ‘°μ λμ§λ§ 컨ν μ΄λλ₯Ό μ λμ μΌλ‘ λ§λ€μ§ μλ ν μλλ‘ μ‘°μ λμ§ μμ΅λλ€.
<div id="chart-container">
<div id="chart"></div>
</div>
CSSλ‘:
#chart-container {
position: relative;
width: 100%;
height: 280px;
}
#chart {
position: absolute;
width: 100%;
}
renderTo: 'chart'
νμ¬ μ°¨νΈλ₯Ό #chartμ 첨λΆνμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
@KacperMadej
μ, svgλ λ²‘ν° κ·Έλν½μ λλ€. μ¦, SVG λλΉμ λμ΄λ₯Ό 100%λ‘ μ€μ ν΄λ λ λλ§μ λμ μν₯μ λ―ΈμΉμ§ μμμΌ ν©λλ€. λ΄κ° νλ Έλ€λ©΄ μμ ν΄ μ£ΌμΈμ.
λ΄λΆ
svg
μμ λλΉ CSSλ₯Ό μ¬μ μν μ μμμ΅λλ€.κ·Έκ²μ μ§κΈ ν©λ¦¬μ μΌλ‘ μ μλν©λλ€.