2017-05-19 11 views
9

Używam GetOrgChart do tworzenia schematu organizacyjnego dla mojej firmy, ale napotkałem mały problem.Dodaj pasek przewijania do svg kontenera

Jeśli rozmiar jest większy niż kontener, chcemy dodać pasek przewijania, aby można było go używać do przewijania, ponieważ będzie to znacznie szybsze niż przeciąganie go za pomocą myszy.

Próbowałem tego example, ale nie mogłem go uruchomić.

Czy jest jakiś sposób osiągnięcia tego, czego szukam?

Poniższy przykład jest znacznie mniejszy niż nasz aktualny wykres, ale powinien być wystarczająco dobry, aby przedstawić problem.

var peopleElement = document.getElementById("people"); 
 
var orgChart = new getOrgChart(peopleElement, { 
 
    primaryFields: ["name", "title", "phone", "mail"], 
 
    photoFields: ["image"], 
 
    scale: 0.4, 
 
    dataSource: [{ 
 
     id: 1, 
 
     parentId: null, 
 
     name: "Amber McKenzie", 
 
     title: "CEO", 
 
     phone: "678-772-470", 
 
     mail: "[email protected]", 
 
     adress: "Atlanta, GA 30303", 
 
     image: "images/f-11.jpg" 
 
    }, 
 
    { 
 
     id: 2, 
 
     parentId: 1, 
 
     name: "Ava Field", 
 
     title: "Paper goods machine setter", 
 
     phone: "937-912-4971", 
 
     mail: "[email protected]", 
 
     image: "images/f-10.jpg" 
 
    }, 
 
    { 
 
     id: 3, 
 
     parentId: 1, 
 
     name: "Evie Johnson", 
 
     title: "Employer relations representative", 
 
     phone: "314-722-6164", 
 
     mail: "[email protected]", 
 
     image: "images/f-9.jpg" 
 
    }, 
 
    { 
 
     id: 4, 
 
     parentId: 1, 
 
     name: "Paul Shetler", 
 
     title: "Teaching assistant", 
 
     phone: "330-263-6439", 
 
     mail: "[email protected]", 
 
     image: "images/f-5.jpg" 
 
    }, 
 
    { 
 
     id: 11, 
 
     parentId: 1, 
 
     name: "Paul Shetler", 
 
     title: "Teaching assistant", 
 
     phone: "330-263-6439", 
 
     mail: "[email protected]", 
 
     image: "images/f-5.jpg" 
 
    }, 
 
    { 
 
     id: 12, 
 
     parentId: 1, 
 
     name: "Paul Shetler", 
 
     title: "Teaching assistant", 
 
     phone: "330-263-6439", 
 
     mail: "[email protected]", 
 
     image: "images/f-5.jpg" 
 
    }, 
 
    { 
 
     id: 5, 
 
     parentId: 2, 
 
     name: "Rebecca Francis", 
 
     title: "Welding machine setter", 
 
     phone: "408-460-0589", 
 
     image: "images/f-4.jpg" 
 
    }, 
 
    { 
 
     id: 6, 
 
     parentId: 2, 
 
     name: "Rebecca Randall", 
 
     title: "Optometrist", 
 
     phone: "801-920-9842", 
 
     mail: "[email protected]", 
 
     image: "images/f-8.jpg" 
 
    }, 
 
    { 
 
     id: 7, 
 
     parentId: 2, 
 
     name: "Spencer May", 
 
     title: "System operator", 
 
     phone: "Conservation scientist", 
 
     mail: "[email protected]", 
 
     image: "images/f-7.jpg" 
 
    }, 
 
    { 
 
     id: 8, 
 
     parentId: 6, 
 
     name: "Max Ford", 
 
     title: "Budget manager", 
 
     phone: "989-474-8325", 
 
     mail: "[email protected]", 
 
     image: "images/f-6.jpg" 
 
    }, 
 
    { 
 
     id: 9, 
 
     parentId: 7, 
 
     name: "Riley Bray", 
 
     title: "Structural metal fabricator", 
 
     phone: "479-359-2159", 
 
     image: "images/f-3.jpg" 
 
    }, 
 
    { 
 
     id: 10, 
 
     parentId: 7, 
 
     name: "Callum Whitehouse", 
 
     title: "Radar controller", 
 
     phone: "847-474-8775", 
 
     image: "images/f-2.jpg" 
 
    } 
 
    ] 
 
}); 
 

 
$('.get-left,.get-down,.get-up,.get-right').remove(); 
 

 
$(document).ready(function() { 
 
    $(".get-oc-c").css("overflow","scroll"); 
 
})
#people { 
 
    width: 90%; 
 
    height: 90%; 
 
    border:1px solid #000; 
 
}
<link href="http://www.getorgchart.com/GetOrgChart/getorgchart/getorgchart.css" rel="stylesheet" /> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="http://www.getorgchart.com/GetOrgChart/getorgchart/getorgchart.js"></script> 
 
<div id="people"></div>

Odpowiedz

6

Można przyjrzeć this jsfiddle. Pojemnik .get-oc-c pokazuje pasek przewijania, jeżeli:

.get-oc-c { 
    overflow: auto !important; 
} 

i element wykresu SVG jest zawinięty w div, który jest zmieniany do pomieścić pełną wykresu:

function wrapChart() { 
    ... 
    $("svg").wrap("<div id='svgContainer'></div>"); 
    ... 
} 

#svgContainer { 
    overflow: visible; 
} 

Sposób wrapChart nazywa się w updatedEvent. Opcja wykres ruch jest wyłączona, aby usunąć strzałki po bokach i zapobiec panoramowanie:

var orgChart = new getOrgChart(peopleElement, { 
    enableMove: false, 
    ... 
}); 

Oryginalny wyświetlacz wydaje się działać, ale uzyskanie prawidłowych wartości rozmiarów elementu otoki jest trudne (wyrażenie używane w jsfiddle jest bardzo empiryczny), a staje się jeszcze bardziej skomplikowany, gdy okno jest zmieniane, gdy łącza są rozwijane/zwinięte i kiedy wykres jest powiększany. Niektóre zmiany rozmiaru używają animacji, więc obliczenia będą musiały uwzględniać opóźnienie przed uzyskaniem ostatecznych wartości.

Jsfiddle pokazuje prosty kod, aby przywrócić pozycję przewijania po rozwinięciu/zwinięciu węzłów, ale wymagałoby to poprawienia. Nie napisałem kodu uwzględniającego zmiany rozmiaru okna i powiększania.

Biorąc pod uwagę ilość pracy wymaganej do poprawnego zachowania pasków przewijania, lepiej jest użyć funkcji przesuwania i przesuwania dostarczanych przez komponent. Możesz również skontaktować się z twórcami komponentu i poprosić go o dodanie opcji paska przewijania.

2

Ważnymi CSS brakuje tutaj:

max-height i overflow-y

overflow-y powinny być ustawione na auto i max-height do wysokości SVG powinien nigdy krzyż (który jest wysokość będziemy wyzwalać przewijania)

"Statyczne" podejście polega na użyciu zapytań o media w celu ustawienia oczekiwanych rozmiarów dla różnych ekranów, które będą odpowiednio wyzwalać pasek przewijania odpowiednio dla tych rozmiarów. Oczywiście może nie działać dobrze, jeśli klient ma rozmiar, o którym nie myślałeś.

Osobiście polecam używanie wtyczki przewijania do obsługi reakcji/automatycznej zmiany rozmiaru w celu wyświetlenia pasków przewijania w razie potrzeby.CSS był tradycyjnie zbudowany w celu obsługi statycznych treści HTML, ale obecnie mamy dużo dynamicznej zawartości (nie tylko od strony serwera) i zawsze jest bóle głowy, aby złapać i naprawić wszystkie problemy. na przykład pojawienie się paska przewijania może spowodować zmianę szerokości DOM, ale nie można go oglądać za pomocą CSS. Również w niektórych przeglądarkach tradycyjny pasek przewijania jest niepotrzebnie gruby.

Niektóre przykłady wtyczki obejmują: