我制作了一个5个图像的滑动器容器,可以预览下一个和上一个图像.我唯一的问题是我需要让图像由对角线而不是水平线分开.

这是我的代码:

const images = document.querySelectorAll(".slider-img")

function clearActiveImage() {
  images.forEach(function(image) {
    image.classList.remove("active-slider");
  });
}

images.forEach(function(image, index) {
  image.onclick = function() {
    event.stopPropagation()
    if (images[index].classList.contains("active-slider")) {
      images[index].classList.remove("active-slider")
    } else {
      clearActiveImage(index)
      images[index].classList.add("active-slider")
    }
  }
})

window.addEventListener("click", () => {
  clearActiveImage()
})
.slider-container {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  height: 150px;
  width: 50%;
  display: flex;
  justify-content: center;
  align-items: center;
}

.slider-main {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  aspect-ratio: 1.5 / 1;
  display: flex;
  overflow: hidden;
  width: 100%;
  height: 100%;
}

.slider-main:has(.img.active) .img:not(.active) {
  filter: grayscale(100%)
}

.slider-img {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  height: 100%;
  width: calc(100% / 5);
  object-fit: cover;
  overflow: hidden;
  border: none;
  transition: all 0.4s cubic-bezier(0.32, 0, 0.67, 0);
  cursor: pointer;
}

.active-slider {
  width: 200%;
}
<div class="slider-container">
  <div class="slider-main">
    <img class="slider-img active-slider" src="https://image.shutterstock.com/image-photo/mountains-fog-beautiful-night-autumn-260nw-1233564241.jpg" alt="">
    <img class="slider-img" src="https://image.shutterstock.com/image-photo/sunset-ruby-beach-260nw-35902396.jpg" alt="">
    <img class="slider-img" src="https://image.shutterstock.com/image-photo/streelights-uttakleiv-village-shine-below-260nw-2333054447.jpg" alt="">
    <img class="slider-img" src="https://image.shutterstock.com/image-photo/twilight-light-over-isolated-sandwood-260nw-2333055437.jpg" alt="">
    <img class="slider-img" src="https://image.shutterstock.com/image-photo/silhouette-young-traveler-watched-star-260nw-1730791102.jpg" alt="">
  </div>
</div>

I already tried using "transform: skewX(-20deg)" but then my whole images get distorted. I am attaching an image of how it should look like. Example

推荐答案

这就是clip-path的用例.

但这可能需要使用媒体查询将.slider-img中的css变量--ms设置为不同的值,以适应不同的屏幕大小.

const images = document.querySelectorAll(".slider-img");
const clearActiveImage = ({ target }) => images.forEach((image) => image !== target && image.classList.remove("active-slider"));
images.forEach((image) => image.addEventListener("click", ({ currentTarget }) => currentTarget.classList.toggle("active-slider")));
window.addEventListener("click", clearActiveImage);
.slider-container {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  height: 150px;
  width: 50%;
  display: flex;
  justify-content: center;
  align-items: center;
}

.slider-main {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  aspect-ratio: 1.5 / 1;
  display: flex;
  overflow: hidden;
  width: 100%;
  height: 100%;
}

.slider-main:has(.img.active) .img:not(.active) {
  filter: grayscale(100%);
}

.slider-main:has(.active-slider) .slider-img {
  width: calc(100% / 5);
}

.slider-img {
  --ms: 40px;
  position: relative;
  z-index: var(--i);
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  height: 100%;
  width: calc(100% / 5 + var(--ms));
  flex-shrink: 0;
  object-fit: cover;
  overflow: hidden;
  border: none;
  transition: all 0.4s cubic-bezier(0.32, 0, 0.67, 0);
  cursor: pointer;
  clip-path: polygon(0 0, 100% 0, calc(100% - var(--ms)) 100%, 0 100%);
}

.slider-img:not(:first-child) {
  margin-left: calc(var(--ms) * -1);
}

.slider-img:last-child {
  clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}

.slider-img.active-slider {
  width: calc(100% / 5 + var(--ms) * 4) !important;
}
<div class="slider-container">
  <div class="slider-main">
    <img style="--i: 4" class="slider-img active-slider" src="https://image.shutterstock.com/image-photo/mountains-fog-beautiful-night-autumn-260nw-1233564241.jpg" alt="">
    <img style="--i: 3" class="slider-img" src="https://image.shutterstock.com/image-photo/sunset-ruby-beach-260nw-35902396.jpg" alt="">
    <img style="--i: 2" class="slider-img" src="https://image.shutterstock.com/image-photo/streelights-uttakleiv-village-shine-below-260nw-2333054447.jpg" alt="">
    <img style="--i: 1" class="slider-img" src="https://image.shutterstock.com/image-photo/twilight-light-over-isolated-sandwood-260nw-2333055437.jpg" alt="">
    <img style="--i: 0" class="slider-img" src="https://image.shutterstock.com/image-photo/silhouette-young-traveler-watched-star-260nw-1730791102.jpg" alt="">
  </div>
</div>

Javascript相关问答推荐

jest使用useLocate测试自定义挂钩

详细更改参考价值:"

如何计算数组子级的深度- Vue.js

使用print This时, map 容器已在LeafletJS中初始化

是什么原因导致此Angular 16应用程序中类型错误时属性结果不存在?

我在这个黑暗模式按钮上做错了什么?

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

使用下表中所示的值初始化一个二维数组

将字符串UTC Date转换为ngx—counting leftTime配置值的数字

Chromium会将URL与JS一起传递到V8吗?

无法读取未定义错误的属性路径名''

XSLT处理器未运行

用JS从平面文件构建树形 struct 的JSON

覆盖加载器页面避免对页面上的元素进行操作

在不删除代码的情况下禁用Java弹出功能WordPress

为什么在函数中添加粒子的速率大于删除粒子的速率?

按什么顺序接收`storage`事件?

Next.js中的服务器端组件列表筛选

如何在和IF语句中使用||和&;&;?

将相关数据组合到两个不同的数组中