Как увеличить SVG при наведении?

Как сделать каждый раздел 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() без успеха.

КОДЕПЕН ДЕМО

2 ответа

Решение

Вы можете настроить таргетинг на отдельный элемент SVG с помощью class='section' используя CSS и примените к нему необходимое масштабное преобразование. Добавление 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 (или) ключевой кадр 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%;
}
<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>


Firefox, кажется, не уважает transform-origin установка, когда ему дается процентное значение, и поэтому мы должны будем использовать конкретные значения пикселей для каждого дочернего элемента. Отдельные значения рассчитываются как x позиция + width / 2 и y позиция + height / 2.

.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;
}
<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>

Следует также отметить, что CSS-преобразования в элементах SVG не работают в IE, как упомянуто в этой статье CodePen Аны Тюдор.


matrix эквивалент этого transform: scale(1.2) и 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);
}
<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>

Вы можете добиться следующего -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";
}

Другие вопросы по тегам