如何在悬停时使每个SVG部分变大。我试图复制这个交互式地图的方式:http://goo.gl/orvyYI
我在这里创建了一个基本的交互式地图,用于测试:
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="800px"
height="600px" viewBox="0 0 800 600" style="enable-background:new 0 0 800 600;" xml:space="preserve">
<style type="text/css">
.st0{fill:#C1C1C0;}
.st1{fill:#0FB5CB;}
.st2{fill:#46B649;}
</style>
<g id="Layer_1">
<polygon class="st0" points="76.6,96.1 745.6,96.1 745.6,543.7 188.3,543.7 "/>
</g>
<g id="landmarks-test">
<rect id="1" x="495.2" y="130.6" class="section" width="233.1" height="83.4"/>
<rect id="2" x="495.2" y="235.4" class="section" width="233.1" height="95.9"/>
<rect id="3" x="495.2" y="345.8" class="section" width="233.1" height="84.1"/>
</g>
</svg>
我尝试使用transform: matrix()
实现他们的方式,并尝试了transform: scale()
但没有成功。
答案 0 :(得分:15)
您可以使用CSS将单个SVG元素与class='section'
对齐,并对其应用所需的缩放变换。向元素添加transition
可使其平滑增长。
transform-origin
设置对整个部分至关重要,因为它指定了应该用作变换原点的点。
.section:hover {
transform: scale(1.2);
}
.section {
transition: all 1s;
transform-origin: 50% 50%;
}
$(document).ready(function() {
$('.section').on('click', function(event) {
var sectionID = $(this).attr('id');
// Select the relevant popup window that has the same ID as the sectionID
var popupWindow = $('.popup-window.lot-' + sectionID);
$('.popup-window').not(popupWindow).hide();
var leftPos = $(this).position().left;
var topPos = $(this).position().top;
popupWindow.css('top', topPos - 200).css('left', leftPos - 100).show();
});
$('.close-button').click(function(event) {
$('.popup-window').hide();
});
});
body {
position: relative;
margin: 0, padding: 0;
}
.section:hover {
fill: yellow;
}
.popup-window {
width: 400px;
height: 200px;
background: #accee2;
display: none;
position: absolute;
z-index: 100;
top: 0;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, .2);
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
padding: 20px;
}
.section:hover {
transform: scale(1.2);
}
.section {
transition: all 1s;
transform-origin: 50% 50%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="popup-window lot-1">
<a href="/for-sale/show/1">Lot Number: 1</a>
<h5>Section Size: 500</h5>
<button class="close-button">Close</button>
</div>
<div class="popup-window lot-2">
<a href="/for-sale/show/2">Lot Number: 2</a>
<h5>Section Size: 600</h5>
<button class="close-button">Close</button>
</div>
<div class="popup-window lot-3">
<a href="/for-sale/show/3">Lot Number: 3</a>
<h5>Section Size: 450</h5>
<button class="close-button">Close</button>
</div>
<?xml version="1.0" encoding="utf-8" ?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="800px" height="600px" viewBox="0 0 800 600" style="enable-background:new 0 0 800 600;" xml:space="preserve">
<style type="text/css">
.st0 {
fill: #C1C1C0;
}
.st1 {
fill: #0FB5CB;
}
.st2 {
fill: #46B649;
}
</style>
<g id="Layer_1">
<polygon class="st0" points="76.6,96.1 745.6,96.1 745.6,543.7 188.3,543.7 " />
</g>
<g id="landmarks-test">
<rect id="1" x="495.2" y="130.6" class="section" width="233.1" height="83.4" />
<rect id="2" x="495.2" y="235.4" class="section" width="233.1" height="95.9" />
<rect id="3" x="495.2" y="345.8" class="section" width="233.1" height="84.1" />
</g>
</svg>
您链接的网站上看到的效果有点复杂,因为最后有一个混蛋,它需要transition-timing-function
(或)关键帧{{1}的立方贝塞尔曲线}。
animation
transition-timing-function: cubic-bezier(.87,1,.6,.19);
$(document).ready(function() {
$('.section').on('click', function(event) {
var sectionID = $(this).attr('id');
// Select the relevant popup window that has the same ID as the sectionID
var popupWindow = $('.popup-window.lot-' + sectionID);
$('.popup-window').not(popupWindow).hide();
var leftPos = $(this).position().left;
var topPos = $(this).position().top;
popupWindow.css('top', topPos - 200).css('left', leftPos - 100).show();
});
$('.close-button').click(function(event) {
$('.popup-window').hide();
});
});
body {
position: relative;
margin: 0, padding: 0;
}
.section:hover {
fill: yellow;
}
.popup-window {
width: 400px;
height: 200px;
background: #accee2;
display: none;
position: absolute;
z-index: 100;
top: 0;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, .2);
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
padding: 20px;
}
.section:hover {
transform: scale(1.2);
}
.section {
transition: all 1s;
transition-timing-function: cubic-bezier(.87,1,.6,.19);
transform-origin: 50% 50%;
}
Firefox在给定百分比值时似乎不尊重<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="popup-window lot-1">
<a href="/for-sale/show/1">Lot Number: 1</a>
<h5>Section Size: 500</h5>
<button class="close-button">Close</button>
</div>
<div class="popup-window lot-2">
<a href="/for-sale/show/2">Lot Number: 2</a>
<h5>Section Size: 600</h5>
<button class="close-button">Close</button>
</div>
<div class="popup-window lot-3">
<a href="/for-sale/show/3">Lot Number: 3</a>
<h5>Section Size: 450</h5>
<button class="close-button">Close</button>
</div>
<?xml version="1.0" encoding="utf-8" ?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="800px" height="600px" viewBox="0 0 800 600" style="enable-background:new 0 0 800 600;" xml:space="preserve">
<style type="text/css">
.st0 {
fill: #C1C1C0;
}
.st1 {
fill: #0FB5CB;
}
.st2 {
fill: #46B649;
}
</style>
<g id="Layer_1">
<polygon class="st0" points="76.6,96.1 745.6,96.1 745.6,543.7 188.3,543.7 " />
</g>
<g id="landmarks-test">
<rect id="1" x="495.2" y="130.6" class="section" width="233.1" height="83.4" />
<rect id="2" x="495.2" y="235.4" class="section" width="233.1" height="95.9" />
<rect id="3" x="495.2" y="345.8" class="section" width="233.1" height="84.1" />
</g>
</svg>
设置,因此我们必须为每个子项使用特定的像素值。单个值的计算方式为transform-origin
位置+ x
/ 2和width
位置+ y
/ 2。
height
.section:nth-child(1){
transform-origin: 612px 172px;
}
.section:nth-child(2){
transform-origin: 612px 283px;
}
.section:nth-child(3){
transform-origin: 612px 388px;
}
$(document).ready(function() {
$('.section').on('click', function(event) {
var sectionID = $(this).attr('id');
// Select the relevant popup window that has the same ID as the sectionID
var popupWindow = $('.popup-window.lot-' + sectionID);
$('.popup-window').not(popupWindow).hide();
var leftPos = $(this).position().left;
var topPos = $(this).position().top;
popupWindow.css('top', topPos - 200).css('left', leftPos - 100).show();
});
$('.close-button').click(function(event) {
$('.popup-window').hide();
});
});
body {
position: relative;
margin: 0, padding: 0;
}
.section:hover {
fill: yellow;
}
.popup-window {
width: 400px;
height: 200px;
background: #accee2;
display: none;
position: absolute;
z-index: 100;
top: 0;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, .2);
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
padding: 20px;
}
.section:hover {
transform: scale(1.2);
}
.section {
transition: all 1s;
transition-timing-function: cubic-bezier(.87, 1, .6, .19);
}
.section:nth-child(1) {
transform-origin: 612px 172px;
}
.section:nth-child(2) {
transform-origin: 612px 283px;
}
.section:nth-child(3) {
transform-origin: 612px 388px;
}
需要注意的另一件事是,如this CodePen Article by Ana Tudor中所述,SVG元素上的CSS转换在IE中不起作用。
此<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="popup-window lot-1">
<a href="/for-sale/show/1">Lot Number: 1</a>
<h5>Section Size: 500</h5>
<button class="close-button">Close</button>
</div>
<div class="popup-window lot-2">
<a href="/for-sale/show/2">Lot Number: 2</a>
<h5>Section Size: 600</h5>
<button class="close-button">Close</button>
</div>
<div class="popup-window lot-3">
<a href="/for-sale/show/3">Lot Number: 3</a>
<h5>Section Size: 450</h5>
<button class="close-button">Close</button>
</div>
<?xml version="1.0" encoding="utf-8" ?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="800px" height="600px" viewBox="0 0 800 600" style="enable-background:new 0 0 800 600;" xml:space="preserve">
<style type="text/css">
.st0 {
fill: #C1C1C0;
}
.st1 {
fill: #0FB5CB;
}
.st2 {
fill: #46B649;
}
</style>
<g id="Layer_1">
<polygon class="st0" points="76.6,96.1 745.6,96.1 745.6,543.7 188.3,543.7 " />
</g>
<g id="landmarks-test">
<rect id="1" x="495.2" y="130.6" class="section" width="233.1" height="83.4" />
<rect id="2" x="495.2" y="235.4" class="section" width="233.1" height="95.9" />
<rect id="3" x="495.2" y="345.8" class="section" width="233.1" height="84.1" />
</g>
</svg>
和matrix
设置的transform: scale(1.2)
等效值如下:(Logic is explained here)
transform-origin
.section:nth-child(1):hover {
transform: matrix(1.2, 0, 0, 1.2, -122.4, -34.46);
}
.section:nth-child(2):hover {
transform: matrix(1.2, 0, 0, 1.2, -122.4, -56.67);
}
.section:nth-child(3):hover {
transform: matrix(1.2, 0, 0, 1.2, -122.4, -77.57);
}
$(document).ready(function() {
$('.section').on('click', function(event) {
var sectionID = $(this).attr('id');
// Select the relevant popup window that has the same ID as the sectionID
var popupWindow = $('.popup-window.lot-' + sectionID);
$('.popup-window').not(popupWindow).hide();
var leftPos = $(this).position().left;
var topPos = $(this).position().top;
popupWindow.css('top', topPos - 200).css('left', leftPos - 100).show();
});
$('.close-button').click(function(event) {
$('.popup-window').hide();
});
});
body {
position: relative;
margin: 0, padding: 0;
}
.section:hover {
fill: yellow;
}
.popup-window {
width: 400px;
height: 200px;
background: #accee2;
display: none;
position: absolute;
z-index: 100;
top: 0;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, .2);
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
padding: 20px;
}
.section {
transition: all 1s;
transition-timing-function: cubic-bezier(.87, 1, .6, .19);
}
.section:nth-child(1):hover {
transform: matrix(1.2, 0, 0, 1.2, -122.4, -34.46);
}
.section:nth-child(2):hover {
transform: matrix(1.2, 0, 0, 1.2, -122.4, -56.67);
}
.section:nth-child(3):hover {
transform: matrix(1.2, 0, 0, 1.2, -122.4, -77.57);
}
答案 1 :(得分:0)
您可以实现如下 - https://codepen.io/jsomai/pen/GRNNvYV
此处 SVG 在悬停时展开
// SVG HTML
<svg id="right">
<path d="M0.5 9.35772H20.9956L14.2001 2.29941L16.4134 0L27 11L16.4134 22L14.2001 19.7006L20.9956 12.6423H0.5V9.35772Z" fill="#000"></path>
</svg>
// SCSS
svg {
height: 22px;
width: 60px;
opacity: 0.5;
transition: 250ms all ease;
cursor: pointer;
display:flex;
align-items:center;
path {
transition: 250ms all ease;
height:100%;
}
&:hover {
opacity: 1;
}
}
svg#left{
transform:rotate(180deg);
}
svg#left:hover path {
d: path(
"M0 9.35772H50.9956L44.2001 2.29941L46.4134 0L57 11L46.4134 22L44.2001 19.7006L50.9956 12.6423H0V9.35772Z"
);
d: "M0 9.35772H50.9956L44.2001 2.29941L46.4134 0L57 11L46.4134 22L44.2001 19.7006L50.9956 12.6423H0V9.35772Z";
}
svg#right:hover path {
d: path(
"M0 9.35772H50.9956L44.2001 2.29941L46.4134 0L57 11L46.4134 22L44.2001 19.7006L50.9956 12.6423H0V9.35772Z"
);
d: "M0 9.35772H50.9956L44.2001 2.29941L46.4134 0L57 11L46.4134 22L44.2001 19.7006L50.9956 12.6423H0V9.35772Z";
}