代码之家  ›  专栏  ›  技术社区  ›  maddie

将全尺寸图像的大小和比例与SVG视图框匹配

  •  0
  • maddie  · 技术社区  · 6 年前

    我有一个团队成员名单。每个成员元素都由一个图像组成,该图像被剪切到白框内的一个圆中。当您将鼠标悬停在方框上时,图像将变为全尺寸。它的灵感来源于这个网站

    我用SVG实现了同样的动画。然而,在上面的网站上,每幅图片都是300x350——与白色的容器盒大小相同。这将创建一个从蒙面图像到全尺寸图像的完美过渡-没有任何东西看起来会跳跃或移动。另一方面,我的图像有多种尺寸。因此,SVG的可见部分要么放大要么缩小图像,当您悬停时,整个图像将显示为跳转:。

    如何获得与SVG视图框中的图像匹配的全尺寸图像的比例和大小,使其看起来不移动?

    jsfiddle: http://jsfiddle.net/mzechar/afnxkt2h/2/

    HTML:。

    <li>
    <a href=“”>
    <文章>
    <DIV>
    
    <!--蒙面图像-->
    <svg xmlns=“http://www.w3.org/2000/svg”version=“1.1”viewbox=“0 0 100 100”>
    <defs>
    <clipPath id=“circle”>
    <circle cx=“50”cy=“50”r=“35”/>
    </clippath>
    </defs>
    <image width=“100%”height=“100%”preservaaspectratio=“xminymin slice”xlink:href=“team/finishedbw/cck.jpg_uuujg”clip path=“url(circle)”/>
    </svg>
    </DIV>
    
    <!--全曝光图像——>
    <img class=“img full”src=“team/finishedbw/cck.jpg_uu.jpg”alt=“>
    
    <!--圆环-->
    <svg viewbox=“0 0 100 100”class=“circle ring”>
    <circle cx=“50”cy=“50”r=“35”stroke=“white”stroke width=“5”fill=“transparent”/>gt;
    </svg>
    
    <DIV class=“bio”>
    <h2>陈春康</h2>
    <h4>文章副标题</h4>
    </DIV>
    </Article>
    </a>
    </li>
    <li>
    

    CSS:。

    团队列表{ 职位:相对; 上边距:40px; 右边距:自动; 左边距:自动; } .团队列表li{ 显示:内联块; 溢出:隐藏; 浮动:左; 高度:340px; 列表样式位置:内部; 利润率:1px 1px 1px; 背景色:fff; } .团队列表{ 显示器:柔性; 柔性包装:包装; 调整内容:中心; 弯曲方向:行; 弹性流:行缠绕; 弯曲收缩:1; 弹性增长:1; 浮动:左; 最小宽度:0; 最大宽度:100%; 职位:相对; 滤镜:投影(5px 5px 5px rgba(2,2,22,0.1)); } A{ 显示:内联块; } 文章{ 职位:相对; 宽度:300px; 高度:350px; /*防止缩放圆环触发悬停*/ 溢出:隐藏; } /*创建颜色覆盖*/ 文章:之后{ 内容:“”; 位置:绝对; 顶部:0; 右:0; 底部:0; 左:0; 显示:无; 背景:RGBA(0,255,255,.2); Z指数:3; } /*将完整图像置于SVG上方*/ .img已满{ 位置:绝对; 顶部:0; 右:0; Z指数:2; /*最初隐藏完整图像*/ 显示:无; } .圆环{ 位置:绝对; 顶部:0; Z指数:3; /*最初用不透明度隐藏,因此可以设置动画*/ 不透明度:0; 变换原点:50%50%; 变换:比例(1.8); 转换:转换。3秒容易,不透明。4秒容易; } A:悬停。img已满, A:悬停文章:之后{ 位置:绝对; 显示:块; } A:悬停。圆圈。{ 不透明度:1; 变换:比例(1); } .生物{ 位置:绝对; 底部:0; 填充:1REM 2REM; 颜色:000; /*将文本保持在SVG、完整图像和覆盖之上*/ Z指数:4; } A:盘旋生物{ 颜色:fff; } /*概述*/ 氢气, H4型{ 边距:0; 字体系列:无衬线; } H4型{ 字体粗细:300; } this website以下内容:

    enter image description here enter image description here

    我用SVG实现了同样的动画。然而,在上面的网站上,每幅图片都是300x350——与白色的容器盒大小相同。这将创建一个从蒙面图像到全尺寸图像的完美过渡-没有任何东西看起来会跳跃或移动。另一方面,我的图像大小不一。因此,SVG的可见部分要么放大要么缩小图像,当您悬停时,整个图像看起来会跳跃。以下内容:

    enter image description here enter image description here

    enter image description here enter image description here

    如何获得与SVG视图框中的图像匹配的全尺寸图像的比例和大小,使其看起来不移动?

    J小提琴:http://jsfiddle.net/mzechar/afnxkt2h/2/

    HTML:

     <li>
                <a href="#">
                  <article>
                    <div>
    
                      <!-- The masked image -->
                      <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 100 100">
                            <defs>
                                    <clipPath id="circle">
                                            <circle cx="50" cy="50" r="35"/>
                                    </clipPath>
                            </defs>
                            <image width="100%" height="100%" preserveAspectRatio="xMinYMin slice" xlink:href="team/finishedBW/CCK.jpg__.jpg" clip-path="url(#circle)"/>
                    </svg>
                    </div>
    
                    <!-- The full revealed image -->
                    <img class="img-full" src="team/finishedBW/CCK.jpg__.jpg" alt="">
    
                    <!-- The circle ring -->
                    <svg viewBox="0 0 100 100" class="circle-ring">
            <circle cx="50" cy="50" r="35" stroke="white" stroke-width=".5" fill="transparent" />
        </svg>
    
                    <div class="bio">
                      <h2>Chun-Kang Chen</h2>
                      <h4>Article Subtitle</h4>
                    </div>
                  </article>
                </a>
              </li>
              <li>
    

    CSS(中文):

    .team-listing{
        position:relative;
        margin-top:40px;
        margin-right:auto;
        margin-left:auto;
    }
    
    .team-listing li{
        display:inline-block;
        overflow: hidden;
        float:left;
        height: 340px;
        list-style-position:inside;
        margin: 1px 1px 1px 1px;
        background-color:#fff;
    }
    
    .team-listing ul{
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
        flex-direction: row;
        flex-flow: row wrap;
        flex-shrink: 1;
        flex-grow: 1;
        float: left;
        min-width: 0;
        max-width: 100%;
        position: relative;
        filter: drop-shadow(5px 5px 5px rgba(2,2,22,0.1));
    }
    
    a {
      display: inline-block;
    }
    
    article {
      position: relative;
      width: 300px;
      height: 350px;
      /* prevent scaled circle ring from triggering hover */
      overflow: hidden;
    }
    
    
    /* create the colour overlay */
    article:after {
      content: '';
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      display: none;
      background: rgba(0, 255, 255, .2);
      z-index: 3;
    }
    
    
    /* place full image above SVG */
    .img-full {
      position: absolute;
      top: 0;
      right:0;
      z-index: 2;
      /* hide the full image initially */
      display: none;
    }
    
    .circle-ring {
      position: absolute;
      top: 0;
      z-index: 3;
      /* initially hidden with opacity so it can be animated */
      opacity: 0;
      transform-origin: 50% 50%;
      transform: scale(1.8);
      transition: transform .3s ease, opacity .4s ease;
    }
    
    a:hover .img-full,
    a:hover article:after {
      position:absolute;
      display: block;
    }
    
    a:hover .circle-ring {
      opacity: 1;
      transform: scale(1);
    }
    
    .bio {
      position: absolute;
      bottom: 0;
      padding: 1rem 2rem;
      color: #000;
      /* keep text above SVG, full image and overlay */
      z-index: 4;
    }
    
    a:hover .bio {
      color: #FFF;
    }
    
    
    /* general */
    h2,
    h4 {
      margin: 0;
      font-family: sans-serif;
    }
    
    h4 {
      font-weight: 300;
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   ccprog    6 年前

    对SVG内容有信心。不需要定义两个 <svg> <img> 中间。只需将图像放置在 <image> <高级副总裁

    剪辑路径本身保留在单独的,但隐藏的 < 因此,它可以重复用于多个图像。

    preserveAspectRatio 但绝对要设置它们。(设置 overflow:hidden < 元素是一个预防措施,因为规范已经改变了一点,不管这是否是默认值。)

    a {
        display: inline-block;
    }
    article {
        position: relative;
        width: 300px;
        height: 350px;
        overflow: hidden;
    }
    article::after {
        content: '';
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        display: none;
        background: rgba(0, 255, 255, .2);
        z-index: 3;
    }
    .portrait {
        position: relative;
        width: 300px;
        height: 300px;
        overflow: hidden;
    }
    .portrait image {
        clip-path: url(#circle);
    }
    a:hover .portrait image {
        clip-path: none;
    }
    a:hover article:after {
      position: absolute;
      display: block;
    }
    .ring {
        fill: none;
        stroke: white;
        stroke-width: 1;
        opacity: 0;
        transform-origin: 50% 50%;
        transform: scale(1.8);
        transition: transform .3s ease, opacity .4s ease;
    }
    a:hover .ring {
        opacity: 1;
        transform: scale(1);
    }
    .bio {
        position: absolute;
        bottom: 0;
        padding: 1rem 2rem;
        color: #000;
    }
    h2 {
        font-size: 1.5em;
        font-weight: bold;
    }
    h4 {
        font-weight: 300;
    }
    h2, h4 {
        margin: 0;
        font-family: sans-serif;
    }
    <svg width="0" height="0">
      <clipPath id="circle">
        <circle cx="150" cy="150" r="100"/>
      </clipPath>
    </svg>
    <a href="#">
      <article>
        <svg class="portrait" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
          <!-- no automatic sizing for SVG image, width and height must be set -->
          <image width="400" height="300" x="-100" y="0"
                 xlink:href="http://api.leafsnap.com/v1/team/images/columbia/Neeraj.jpg?h=300"/>
          <circle class="ring" cx="150" cy="150" r="100" />
        </svg>
        <div class="bio">
          <h2>Chun-Kang Chen</h2>
          <h4>Article Subtitle</h4>
        </div>
      </article>
    </a>
        2
  •  1
  •   leonheess    6 年前

    希望这有助于:

    section.team {
      margin: auto;
      background: #fefefe;
    }
    
    .team-listing {
      position: relative;
      margin: 40px auto 0;
      display: flex;
      filter: drop-shadow(5px 5px 5px rgba(2, 2, 22, 0.1));
    }
    
    .team-listing li {
      overflow: hidden;
      height: 350px;
      list-style: none;
      margin: 1px;
      background-color: #fff;
    }
    
    article {
      position: relative;
      top: 0;
      width: 300px;
      height: 300px;
      overflow: hidden;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    
    .img-full {
      -webkit-clip-path: circle(30% at 50% 50%);
      clip-path: circle(30% at 50% 50%);
      width: 500px;
    }
    
    a:hover .img-full {
      -webkit-clip-path: none;
      clip-path: none;
      filter: sepia(100%);
    }
    
    .circle-ring {
      position: absolute;
      top: 0;
      z-index: 3;
      opacity: 0;
      transform-origin: 50% 50%;
      transform: scale(1.8);
      transition: transform 0.3s ease, opacity 0.4s ease;
    }
    
    a:hover .circle-ring {
      opacity: 1;
      transform: scale(1);
    }
    
    .bio {
      position: absolute;
      bottom: 0;
      margin: 2rem;
      color: #000;
    }
    
    a:hover .bio > h2 {
      color: #fff;
    }
    
    h2,
    h4 {
      margin: 0;
      font-family: sans-serif;
    }
    
    h4 {
      font-weight: 300;
    }
    <section class="content-wrapper team">
      <ul class="team-listing">
        <li>
          <a href="#">
            <article>
              <img class="img-full" src="https://i.imgur.com/6eRLJ4I.jpg" alt="">
              <svg viewBox="0 0 100 100" class="circle-ring">
                  <circle cx="50" cy="50" r="35" stroke="white" stroke-width=".5" fill="transparent" />
              </svg>
            </article>
            <div class="bio">
              <h2>Article Title</h2>
              <h4>Article Subtitle</h4>
            </div>
          </a>
        </li>
        <li>
          <a href="#">
            <article>
              <img class="img-full" src="https://i.imgur.com/6eRLJ4I.jpg" alt="">
              <svg viewBox="0 0 100 100" class="circle-ring">
                      <circle cx="50" cy="50" r="35" stroke="white" stroke-width=".5" fill="transparent" />
                  </svg>
            </article>
            <div class="bio">
              <h2>Article Title</h2>
              <h4>Article Subtitle</h4>
            </div>
          </a>
        </li>
      </ul>
    </section>