3

Суть вопроса в заголовке, добавлю только, что не важно какие теги и css будет использован(или даже js, но лучше без него), главное фрагменты картинок можно было перемещать.

Что-то похожее есть, но это решение не подходит

Alexandr_TT
  • 110,146
  • 23
  • 114
  • 384
  • 2
    CSS - background-position: X Y ; – Air Jan 24 '19 at 13:29
  • А если тег <img /> то почти так же CSS - img{position:relative | absolute; left: n-px; top:n-px;.......} – Air Jan 24 '19 at 13:32
  • 3
    Возможный дубликат вопроса: Как разбить картинку на секции в CSS? – Air Jan 24 '19 at 13:35
  • @Air нет, это другое. Почему? Возможно ли передвигать части изображения в разные позиции? Мне, кажется по тем методикам нет, потому что картинка там по сути одна, просто представляется сегментированной. Мне же надо чтобы каждый объект показывал картинку(вернее её фрагмент) – BrainSwitch Jan 24 '19 at 15:39
  • Это именно то.... – Air Jan 24 '19 at 15:41
  • @Air 1-й ответ это таблица, а на заднем фоне картинки, вот и все, это решение не годится. Далее во 2-м ответе два решения - это сути опять же картинка, на которую налагаются span чтобы сделать сетку, это также не годится. В этих решения невозможно перемещать фрагменты картинок, потому что там не фрагменты, а одна картинка. Или я не прав? – BrainSwitch Jan 24 '19 at 15:46
  • Ещё раз говорю, мне по надо много картинок, несолько image, просто каждый из них(image) будет показывать определенный фрагмент своей картинки, то есть картинок по сути много, просто показаны они не полностью будут. – BrainSwitch Jan 24 '19 at 15:48
  • Перечитай первый комментарии – Air Jan 24 '19 at 15:49
  • @Air почитаю, но мой вопрос вовсе не дубликат. – BrainSwitch Jan 24 '19 at 15:51
  • @SonicMyst что-то я не пойму в вашем примере использован тег <image> но это тег svg / в Html для вывода картинок служит тег <img src="url"> в css для вывода картинок служит background-image Вы в каком виде хотите получить ответ? – Alexandr_TT Jan 24 '19 at 16:55

2 Answers2

6

Находим картинку по вкусу

Габаритные размеры - 813 x 514px

введите сюда описание изображения

<!-- Необходимо подобрать значения background-position при сильном отличии габаритных размеров вашей картинки от оригинала --> .imgWrap .left { left: 0; background-position: 3% 0; } .imgWrap .center{ left:34.83%; background-position: -87% 0; } .imgWrap .right { left:69.66%; background-position:-157% 0; }

За придания объема картинке отвечают:

.imgWrap > div:before{ content:''; position:absolute; top:0;right:100%; width:10%; height:100%; background:inherit; transform-origin:100% 50%; transform:rotateY(-90deg); }

body{perspective:1000px;}
.imgWrap{
  position:relative;
  width:80%;
  margin:5% auto;
  padding-bottom:39%;
  transform: rotateY(25deg);
  transform-style:preserve-3d;
}
.imgWrap > div{
  position:absolute;
  top:20%;
  width:30.3%;height:100%;
  float:left;
  background-image:url('https://i.stack.imgur.com/ZE0fb.jpg');
  background-size:auto 100%;
  transform-style:preserve-3d;
  outline: 2px solid transparent; */
}

.imgWrap .left { left: 0; background-position: 3% 0; } .imgWrap .center{ left:34.83%; background-position: -87% 0; } .imgWrap .right { left:69.66%; background-position:-157% 0; }

.imgWrap > div:before{ content:''; position:absolute; top:0;right:100%; width:10%; height:100%; background:inherit; transform-origin:100% 100%; transform:rotateY(-90deg); } .imgWrap .left:before { background-position: 0% 0; } .imgWrap .center:before{ background-position: -1001.3% 0; } .imgWrap .right:before { background-position: -2001.4% 0; }

<div class="imgWrap">
  <div class="left"></div>
  <div class="center"></div>
  <div class="right"></div>
</div>
</style> 

<div class="imgWrap">
  <div class="left"></div>
  <div class="center"></div>
  <div class="right"></div>
</div>
Alexandr_TT
  • 110,146
  • 23
  • 114
  • 384
  • Боюсь, что с таким примером ты его вообще запутаешь...)))) Но пример хорош... – Air Jan 24 '19 at 20:05
  • Ну именно этого и хотел... – Air Jan 24 '19 at 20:08
  • да всё верно только вопрос о img а не о background – Резидент Казахстана Jan 25 '19 at 01:43
  • @Alexandr_TT вообщем-то годится, для интереса спрошу: с тегом img можно проделать подобное или не получится? – BrainSwitch Jan 25 '19 at 07:22
  • @SonicMyst с <img>(html), получится с (svg) получится То есть чем лучше владеете, то и используйте. Хотите ещё один пример сделаю на svg? – Alexandr_TT Jan 25 '19 at 07:28
  • @Alexandr_TT да, было бы хорошо увидеть другой пример. – BrainSwitch Jan 25 '19 at 07:32
  • Давно задавался вопросом, как это сделать. Никто задачи такой не ставил и всё руки не доходили, и вот я просматривая очередные шедевры Александра, увидел как это реализовать, причём ещё и несколькими путями. Спасибо! –  Jan 29 '19 at 18:05
5

SVG решение

SVG решение - должно быть по определению, - адаптивно.

введите сюда описание изображения

Чтобы приложение было адаптивно и не разрушались пропорции между фрагментами изображения необходимо сделать следующее:

  • Изображение добавляется внутрь svg с помощью команды <image> и задаются размеры его в процентах width="100%" height="100"
  • Окна вырезать комбинированной маской. При присвоении одним частям маски fill="white" она будет прозрачна и в вырезанных окошках будут видны фрагменты изображения. Закраска fill="black" делает участок маски непрозрачным - это белые перемычки между окнами.
    Более подробно и просто о масках здесь
  • Обернуть svg <div class="container"> в родительский контейнер. Изменяя проценты ширины и высоты контейнера можно регулировать начальные размеры блока.

.container {
width:100%;
height:100%;
}
<div class="container">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"
       width="100%" height="100%" viewBox="0 0 1375 800" preserveAspectRatio="xMinYMin meet" > 
 <defs>
    <mask id="modular">
      <rect width="100%" height="100%"  fill="black" /> 
  <g fill="white">
      <rect x="0" y="0" width="190" height="500" />
      <rect x="210" y="0" width="180" height="500" />
      <rect x="410" y="0" width="180" height="500" />
      <rect x="610" y="0" width="180" height="500" />
      <rect x="810" y="0" width="190" height="500" />  
   </g>
    </mask>
  </defs>

<image xlink:href="https://i.stack.imgur.com/Se35c.jpg" width="100%" height="100%" mask="url(#modular)" /> </svg>
</div>

Анимация фрагментов изображения

  • При наведении курсора на картинку фрагменты изображения сливаются в целое изображение.

Это обеспечивает команда анимации добавленная в маску:

<animate attributeName="x" values="210;189" dur="1s" begin="img1.mouseover" restart="whenNotActive" fill="freeze" />

Реализация смещения фрагмента изображения (секции маски) осуществляется изменением координаты левого верхнего угла прямоугольника - X values="210;189"

  • При уходе курсора с картинки, изображение возвращается к исходному состоянию :

    <animate attributeName="x" values="189;210" dur="1s" begin="img1.mouseout" restart="whenNotActive" fill="freeze" />

.container {
width:100%;
height:100%;
}
<div class="container">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"
       width="100%" height="100%" viewBox="0 0 1000 500" preserveAspectRatio="xMinYMin meet"  > 
 <defs>
    <mask id="modular">
      <rect width="100%" height="100%"  fill="black" /> 
  <g fill="white">
      <rect x="0" y="0" width="190" height="500" />
      <rect x="210" y="0" width="180" height="500" >
    <animate attributeName="x" values="210;189" dur="1s" begin="img1.mouseover" restart="whenNotActive"  fill="freeze" />
    <animate attributeName="x" values="189;210" dur="1s" begin="img1.mouseout" restart="whenNotActive" fill="freeze" />
   </rect>
      <rect x="410" y="0" width="180" height="500" >
   <animate attributeName="x" values="410;360" dur="1s" begin="img1.mouseover" restart="whenNotActive" fill="freeze" />
   <animate attributeName="x" values="360;410" dur="1s" begin="img1.mouseout" restart="whenNotActive" fill="freeze" />
    </rect>
      <rect x="610" y="0" width="180" height="500" >
   <animate attributeName="x" values="610;535" dur="1s" begin="img1.mouseover" restart="whenNotActive"  fill="freeze" /> 
    <animate attributeName="x" values="535;610" dur="1s" begin="img1.mouseout" restart="whenNotActive" fill="freeze" />
    </rect>
      <rect x="810" y="0" width="190" height="500" >
<animate attributeName="x" values="810;710" dur="1s" begin="img1.mouseover" restart="whenNotActive" fill="freeze" />
 <animate attributeName="x" values="710;810" dur="1s" begin="img1.mouseout" restart="whenNotActive" fill="freeze" />
    </rect>   
   </g>
    </mask>
  </defs>

<image id="img1" xlink:href="https://i.stack.imgur.com/Se35c.jpg" width="100%" height="100%" mask="url(#modular)" /> </svg>
</div>

Alexandr_TT
  • 110,146
  • 23
  • 114
  • 384
  • @Sonic Myst Смотрите вариант решения SVG. Приложение полностью адаптивно – Alexandr_TT Jan 25 '19 at 08:26
  • 1
    Спасибо за ещё один пример. – BrainSwitch Jan 25 '19 at 18:41
  • Шикарный вариант с SVG. Спасибо! –  Jan 29 '19 at 18:06
  • 1
    @L.F.C. благодарю, смотрите, какая лаконичность кода в SVG по сравнению c CSS и этот язык практически не изменился за последние 20 лет. Хотя в остальной IT год равен веку по количеству нововведений. Если будет желание по изучать SVG, пишите в чат https://chat.stackexchange.com/rooms/70612/svg-chat и просто задавайте вопросы на SO/ Лично я не понимаю, почему люди так боятся SVG, это хоть и математика, но математика в основном за 5 класс :)) – Alexandr_TT Jan 29 '19 at 18:14