微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过元素宽度定义图像高度

如何解决通过元素宽度定义图像高度

问题: 我目前正在尝试生成带有幻灯片的灯箱/模式,在我的情况下,我使用光滑的轮播幻灯片并使用 barba.js 生成内容

幻灯片中的每个图像的高度必须为 100vh 减去 HTML 中的一些填充。但是我只能通过父 div 宽度来控制图像的高度,因为 js 轮播和我需要让它在一个宽度可控的模态中工作。

Wacko 解决方案: 如果我只有具有相同大小/纵横比的图像,那么类似的东西会起作用:

.content--detail {
  width: 100%;
  max-width: calc((100vh - 120px) / 1.6);
  height: auto;
  max-height: calc(100vh - 150px);
}
.content--detail img {
  width: 100%;
  height: auto;
}

我还尝试获取图像的纵横比并尝试以这种方式设置宽度:

$('.slider').on('afterChange',function(){
  var ratio = $('.slick-current').height() / $('.slick-current').width();
  $('.content--detail').css('maxWidth','calc((100vh - 120px) /' + ratio + ')');
});

但这也不合适,所以有人知道我如何才能做到这一点吗? 是否有可能的公式来控制动态图像到视口高度到宽度? 我没有想法,真的:)

非常感谢!

代码笔示例:https://codepen.io/qubism/pen/ExNgyyy

$(".splide").slick({
  lazyLoad: "ondemand",slidesToShow: 1,slidesToScroll: 1,infinite: false,adaptiveHeight: true
});
html,body {
  overflow: hidden;
  background: #ccc
}

.contrainer-wrap {
  width: 100%;
  height: 100%;
  position: relative;
}

.content {
  font-size: 24px;
  line-height: 29px;
  color: #000;
  background: #fff;
  right: 320px;
  position: absolute;
  z-index: 101;
  overflow-x: auto;
  opacity: 1;
}

.content--detail {
  width: 100%;
  max-width: calc((100vh - 120px) / 1.7);
  height: auto;
  max-height: -webkit-calc(100vh - 150px);
  max-height: calc(100vh - 150px);
  max-height: 100%;
  top: 0;
  padding: 30px 30px 20px 30px;
  margin-left: auto;
  margin-right: auto;
}

.slick-slide img {
  width: 100%;
  height: auto;
}

.gallery-img__detail__desc * {
  font-size: 12px;
  line-height: 18px;
  padding-bottom: 0;
}

.slick-prev,.slick-next {
  font-size: 0;
  line-height: 0;
  color: transparent;
  width: 30%;
  height: 70%;
  top: 10%;
  transform: none;
  z-index: 9;
  display: none !important;
}

.slick-next:before {
  content: " ";
  background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1Ni4wMyAzNi42NyI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLXdpZHRoOjYuOTVweDt9PC9zdhlsZT48L2RlZnM+PGcgaWQ9IkViZW5lXzIiIGRhdGEtbmFtZT0iRWJlbmUgMiI+PGcgaWQ9IkViZW5lXzEtMiIgZGF0YS1uYW1lPSJFYmVuZSAxIj48bgluZSBjbGFzcz0iY2xzLTEiIHkxPSIxOC4zNCIgeDI9IjQ2LjY4IiB5Mj0iMTguMzQiLz48cG9seWxpbmUgY2xhc3M9ImNscy0xIiBwb2ludHM9IjM1LjYxIDIuNDMgNTEuMTcgMTguMzQgMzUuNjEgMzQuMjQiLz48L2c+PC9nPjwvc3ZnPg==") no-repeat;
  width: 50px;
  height: 50px;
  display: block;
  background-repeat: none;
  opacity: 0;
  float: right;
}

.slick-next:hover:before {
  opacity: 1;
}

.slick-next {
  right: -24px;
}

.slick-prev.slick-disabled:before,.slick-next.slick-disabled:before,.slick-prev.slick-disabled:hover:before,.slick-next.slick-disabled:hover:before {
  opacity: 0;
}

.slick-prev:before {
  content: " ";
  background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1Ni4wMyAzNi42NyI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLXdpZHRoOjYuOTVweDt9PC9zdhlsZT48L2RlZnM+PGcgaWQ9IkViZW5lXzIiIGRhdGEtbmFtZT0iRWJlbmUgMiI+PGcgaWQ9IkViZW5lXzEtMiIgZGF0YS1uYW1lPSJFYmVuZSAxIj48bgluZSBjbGFzcz0iY2xzLTEiIHkxPSIxOC4zNCIgeDI9IjQ2LjY4IiB5Mj0iMTguMzQiLz48cG9seWxpbmUgY2xhc3M9ImNscy0xIiBwb2ludHM9IjM1LjYxIDIuNDMgNTEuMTcgMTguMzQgMzUuNjEgMzQuMjQiLz48L2c+PC9nPjwvc3ZnPg==") no-repeat;
  width: 50px;
  height: 50px;
  display: block;
  background-repeat: none;
  transform: rotate(-180deg);
  margin-top: -25px;
  opacity: 0;
}

.slick-prev:hover:before {
  opacity: 1;
}

.slick-left {
  left: -24px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js"></script>
<section>
  <div class="container-wrap">
    <div class="content content--detail" data-title="" data-barba="container" data-barba-namespace="detail">
      <div class="splide">
        <div class='splide__slide'>
          <img src="https://via.placeholder.com/900x1600">
          <div class='gallery-img__detail__desc'>Description</div>
        </div>
        <div class='splide__slide'>
          <img src="https://via.placeholder.com/800x1300">
          <div class='gallery-img__detail__desc'>Description</div>
        </div>
        <div class='splide__slide'>
          <img src="https://via.placeholder.com/1000x1600">
          <div class='gallery-img__detail__desc'>Description</div>
        </div>
      </div>
    </div>
  </div>
</section>

TLDR;如何使用父级的宽度控制图像的高度?

解决方法

我并没有错。 它现在可以使用:

var ratio = $('.slick-current img').get(0).naturalHeight / $('.slick-current img').get(0).naturalWidth;
var elHeight = $(window).height() - 120;
$('.content--detail').css({ width: elHeight / ratio });

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。