css+js实现手风琴折叠图片文字标题效果代码

代码语言:html

所属分类:其他

代码描述:css+js实现手风琴折叠图片文字标题效果代码

代码标签: css js 手风琴 折叠 图片 文字 标题

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  

<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/normalize.css">
  
  
<style>


*,
*:after,
*:before {
	box-sizing: border-box;
}

:root {
	--transition: 0.5s;
	--container-width: clamp(300px, 80vw, 960px);
	--brand-hue: 230;
	--size-1: calc(var(--container-width) * 0.48);
	--size-2: 0.10;
	--size-3: calc(var(--container-width) * 0.04);
}

body {
	padding: 4rem 0;
	display: grid;
	place-items: center;
	min-height: 100vh;
	font-family:  'Google Sans', sans-serif, system-ui;
}

ul {
	aspect-ratio: 16 / 9;
	width: var(--container-width);
	overflow: hidden;
	display: flex;
	gap: 0.5rem;
	padding: 0;
/*	padding-left: 0.5rem;*/
	margin: 0;
	position: relative;
	list-style-type: none;
	display: flex;
	justify-content: center;
/*	border-radius: 1rem;*/
}

label {
	cursor: pointer;
}

.sr-only, [type=radio] {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border-width: 0;
}

li {
	border-radius: 1rem;
	transition: all var(--transition) ease;
	position: relative;
	-webkit-clip-path: inset( 0 0 0 0);
	        clip-path: inset( 0 0 0 0);
	z-index: 1;
	overflow: hidden;
	width: 0;
	position: absolute;
	flex-shrink: 1;
}


/* Set the display */
/*li:has(+ li + li + li + li + li :checked),*/
li:has(+ li + li + li + li :checked),
li:has(+ li + li + li :checked),
li:has(+ li + li :checked),
li:has(+ li :checked),
li:has(:checked),
li:has(:checked) + li,
li:has(:checked) + li + li,
li:has(:checked) + li + li + li,
li:has(:checked) + li + li + li + li {
/*li:has(:checked) + li + li + li + li + li {*/
	width: var(--size-3);
	position: static;
}

li:has(:checked) {
	--active: 1;
	--content: 1;
	--width: var(--size-1);
	width: var(--width);
	z-index: 3;
	flex: 1 0 var(--size-1);
}

/* Edge cases for when some elements should be visible */
li:nth-of-type(1):has(:checked) + li + li + li + li,
li:nth-of-type(1):has(:checked) + li + li + li + li + li,
li:nth-of-type(1):has(:checked) + li + li + li + li + li + li,
/* Plus one for the outsider and translater? */
li:nth-of-type(1):has(:checked) + li + li + li + li + li + li + li,
li:nth-of-type(1):has(:checked) + li + li + li + li + li + li + li + li,
/* Now for the others... */
li:nth-of-type(2):has(:checked) + li + li + li + li,
li:nth-of-type(2):has(:checked) + li + li + li + li + li,
li:nth-of-type(2):has(:checked) + li + li + li + li + li + li,
li:nth-of-type(2):has(:checked) + li + li + li + li + li + li + li,
/*li:nth-of-type(2):has(:checked) + li + li + li + li + li + li + li + li,*/
li:nth-of-type(3):has(:checked) + li + li + li + li + li,
li:nth-of-type(3):has(:checked) + li + li + li + li + li + li,
/*li:nth-of-type(3):has(:checked) + li + li + li + li + li + li + li,*/
li:nth-of-type(4):has(:checked) + li + li + li + li + li,
/* If the last item is checked */
li:has(+ li + li + li + li + li:nth-of-type(24) :checked),
li:has(+ li + li + li + li + li + li:nth-of-type(24) :checked),
li:has(+ li + li + li + li + li + li + li:nth-of-type(24) :checked),
li:has(+ li + li + li + li + li + li + li + li:nth-of-type(24) :checked),
li:has(+ li + li + li + li + li:nth-of-type(23) :checked),
li:has(+ li + li + li + li + li + li:nth-of-type(23) :checked),
li:has(+ li + li + li + li + li + li + li:nth-of-type(23) :checked),
li:has(+ li + li + li + li + li:nth-of-type(22) :checked),
li:has(+ li + li + li + li + li + li:nth-of-type(22) :checked),
li:has(+ li + li + li + li + li:nth-of-type(21) :checked) {
	width: var(--size-3);
	position: static;
}

/* Translate out the first/last outer elements */
li:first-of-type:has(:checked) ~ li:nth-of-type(24),
li:first-of-type:has(~ li:nth-of-type(24) :checked),
/*li:has(+ li + li + li + li + li :checked),*/
li:has(+ li + li + li + li + li:not(:nth-of-type(24)):not(:nth-of-type(23)):not(:nth-of-type(22)):not(:nth-of-type(21)) :checked),
li:not(:nth-of-type(1)):not(:nth-of-type(2)):not(:nth-of-type(3)):not(:nth-of-type(4)):not(:nth-of-type(24)):not(:nth-of-type(23)):not(:nth-of-type(22)):has(:checked) + li + li + li + li + li {
	width: 0;
	position: static;
}
li:not(:nth-of-type(1)):not(:nth-of-type(2)):not(:nth-of-type(3)):not(:nth-of-type(4)):has(+ li + li + li + li + li:not(:nth-of-type(24)):not(:nth-of-type(23)):not(:nth-of-type(22)):not(:nth-of-type(21)) :checked) {
	translate: -100% 0;
}
li:not(:nth-of-type(1)):not(:nth-of-type(2)):not(:nth-of-type(3)):not(:nth-of-type(4)):has(:checked) + li + li + li + li + li {
	translate: 100% 0;
}

/* Do this but move the first and last ones out with a translation :D */


/* What about the ones that come before it being last */
/* Grow the 4th back if checked is last? */
/*li:has(+ li + li + li + li :checked):has(~ li:nth-of-type(24) :checked ),
li:has(+ li + li + li + li + li :checked):has(~ li:nth-of-type(24) :checked ),
li:has(+ li + li + li + li + li + li :checked):has(~ li:nth-of-type(24) :checked ),*/
li:has(+ li :checked),
li:has(+ li + li :checked),
li:has(+ li + li + li :checked),
li:has(:checked) + li,
li:has(:checked) + li + li,
li:has(:checked) + li + li + li,
/* Edge cases such as one of the first 3 has a checked */
li:nth-of-type(1):has(:checked) + li + li + li + li,
li:nth-of-type(1):has(:checked) + li + li + li + li + li,
li:nth-of-type(1):has(:checked) + li + li + li + li + li + li,
li:nth-of-type(2):has(:checked) + li + li + li + li,
li:nth-of-type(2):has(:checked) + li + li + li + li + li,
li:nth-of-type(3):has(:checked) + li + li + li + li,
/* The tail end */
li:has(+ li + li + li + li:nth-of-type(24) :checked),
li:has(+ li + li + li + li + li:nth-of-type(24) :checked),
li:has(+ li + li + li + li + li + li:nth-of-type(24) :checked),
li:has(+ li + li + li + li:nth-of-type(23) :checked),
li:has(+ li + li + li + li + li:nth-of-type(23) :checked),
li:has(+ li + li + li + li:nth-of-type(22) :checked)
 {
 	--content: 1;
	--width: calc(var(--container-width) * (var(--size-2) + (var(--hover, 0) * (var(--size-2) * 1.5))));
	width: var(--width);
	z-index: 2;
	translate: 0 0;
}

/* Theming stuff goes down here */
label {
	display: block;
	height: 100%;
	width: 100%;
}

[type=radio] {
/*	display: none;*/
}

li:hover {
	--hover: 1;
}

.slide__wrapper {
	display: block;
	position: relative;
	height: 100%;
	width: 100%;	
	transition: background var(--transition) ease;
	background:
		radial-gradient(circle at center, hsl(var(--brand-hue, 210) 80% 70% / calc(var(--active, 0) * 0.75)), transparent 75%),
		hsl(0 0% calc((66 + (var(--active, 0) * 12)) * 1%));

}

.speaker {
	position: absolute;
	inset: 0;
}

.speaker__info {
	position: absolute;
	left: 1.5rem;
	top: 1.5rem;
	display: grid;
	gap: 0.5rem;
	width: var(--size-1);
	max-width: calc(var(--size-1) - 3rem);
	opacity: var(--active, 0);
	transition: opacity var(--transition) ease-out;
}

.speaker__image:after {
	content: "";
	position: absolute;
	inset: 0;
	transition: opacity var(--transition) ease;
	opacity: var(--active, 0);
	background: radial-gradient(circle at 35% 0%, hsl(0 0% 100% / 0.65) 25%, hsl(var(--brand-hue) 80% 80% / 0.35) 50% 75%, hsl(0 0% 100% / 0.25));
}

/*.speaker__info > * {
	white-space: nowrap;
}*/

.speaker__title {
	text-transform: uppercase;
	font-weight: bold;
	color: hsl(var(--brand-hue) 80% 70%);
	background: linear-gradient(65deg, hsl(var(--brand-hue) 80% 80%), hsl(var(--brand-hue) 80% 70%));
	-webkit-background-clip: text;
	        background-clip: text;
	color: transparent;
	font-size: 0.875rem;
	font-family: sans-serif;
}

.speaker__name {
	font-size: 1.75rem;
	font-family: sans-serif;
}

li:has(:checked) .slide__content {
	width: 100%;
}

img {
	position: absolute;
	bottom: 0;
	left: 50%;
	translate: -50% 0%;
	height: var(--size-1);
	width: var(--size-1);
	scale: calc(1 + (var(--active, 0) * 0.25));
	transform-origin: 50% 25%;
	-o-object-fit: cover;
	   object-fit: cover;
	transition: filter var(--transition) ease, width var(--transition) ease, scale var(--transition) ease;
	filter: grayscale(calc(2 - var(--active, 0)))
}

.slide__content {
	transition: width var(--transition) ease;
	opacity: var(--content, 0);
	position: absolute;
	top: 50%;
	left: 50%;
	height: 100%;
	width: var(--size-1);
	display: grid;
	place-items: center;
	transform: translate(-50%, -50%);
	transition: opacity var(--transition) ease;
}

ul {
  display: none;
}
</style>

  
  
  
</head>

<body >
  <ul>
  <li>
    <span class="speaker__details sr-only"></span>
    <label aria-hidden="true" for="speaker--1">
      <input type="radio" aria-hidden="true" name="speakers" id="speaker--1">
      <span class="slide__wrapper">
        <span class="slide__content">
          <span class="speaker">
            <span class="speaker__image">
              <img src="./andrea-piacquadio.png" alt="" width="720" height="720" />
            </span>
            <span class="speaker__info">
              <span class="speaker__title">President, Product and Business, Stripe</span>
              <span class="speaker__name">Joe Bloggs</span>
            </span>
          </span>
        </span>
      </span>
    </label>
  </li>
  <li>
    <span class="speaker__details sr-only"></span>
    <label aria-hidden="true" for="speaker--2">
      <input type="radio" aria-hidden="true" name="speakers" id="speaker--2">
      <span class="slide__wrapper">
        <span class="slide__content">
          <span class="speaker">
            <span class="speaker__image">
              <img src="./andrea-piacquadio.png" alt="" width="720" height="720" />
            </span>
            <span class="speaker__info">
              <span class="speaker__title">President, Product and Business, Stripe</span>
              <span class="speaker__name">Joe Bloggs</span>
            </span>
          </span>
        </span>
      </span>
    </label>
  </li>
  <li>
    <span class="speaker__details sr-only"></span>
    <label aria-hidden="true" for="speaker--3">
      <input type="radio" aria-hidden="true" name="speakers" id="speaker--3">
      <span class="slide__wrapper">
        <span class="slide__content">
          <span class="speaker">
            <span class="speaker__image">
              <img src="./andrea-piacquadio.png" alt="" width="720" height="720" />
            </span>
            <span class="speaker__info">
              <span class="speaker__title">President, Product and Business, Stripe</span>
              <span class="speaker__name">Joe Bloggs</span>
            </span>
          </span>
        </span>
      </span>
    </label>
  </li>
  <li>
    <span class="speaker__details sr-only"></span>
    <label aria-hidden="true" for="speaker--4">
      <input type="radio" aria-hidden="true" name="speakers" id="speaker--4">
      <span class="slide__wrapper">
        <span class="slide__content">
          <span class="speaker">
            <span class="speaker__image">
              <img src="./andrea-piacquadio.png" alt="" width="720" height="720" />
            </span>
            <span class="speaker__info">
              <span class="speaker__title">President, Product and Business, Stripe</span>
              <span class="speaker__name">Joe Bloggs</span>
            </span>
          </span>
        </span>
      </span>
    </label>
  </li>
  <li>
    <span class="speaker__details sr-only"></span>
    <label aria-hidden="true" for="speaker--5">
      <input type="radio" aria-hidden="true" name="speakers" id="speaker--5">
      <span class="slide__wrapper">
        <span class="slide__content">
          <span class="speaker">
            <span class="speaker__image">
              <img src="./andrea-piacquadio.png" alt="" width="720" height="720" />
            </span>
            <span class="speaker__info">
              <span class="speaker__title">President, Product and Business, Stripe</span>
              <span class="speaker__name">Joe Bloggs</span>
            </span>
          </span>
        </span>
      </span>
    </label>
  </li>
  <li>
    <span class="speaker__details sr-only"></span>
    <label aria-hidden="true" for="speaker--6">
      <input type="radio" aria-hidden="true" name="speakers" id="speaker--6">
      <span class="slide__wrapper">
        <span class="slide__content">
          <span class="speaker">
            <span class="speaker__image">
              <img src="./andrea-piacquadio.png" alt="" width="720" height="720" />
            </span>
            <span class="speaker__info">
              <span class="speaker__title">President, Product and Business, Stripe</span>
              <span class="speaker__name">Joe Bloggs</span>
            </span>
          </span>
        </span>
      </span>
    </label>
  </li>
  <li>
    <span class="speaker__details sr-only"></span>
    <label aria-hidden="true" for="speaker--7">
      <input type="radio" aria-hidden="true" name="speakers" id="speaker--7">
      <span class="slide__wrapper">
        <span class="slide__content">
          <span class="speaker">
            <span class="speaker__image">
              <img src="./andrea-piacquadio.png" alt="" width="720" height="720" />
            </span>
            <span class="speaker__info">
              <span class="speaker__title">President, Product and Business, Stripe</span>
              <span class="speaker__name">Joe Bloggs</span>
            </span>
          </span>
        </span>
      </span>
    </label>
  </li>
  <li>
    <span class="speaker__details sr-only"></span>
    <label aria-hidden="true" for="speaker--8">
      <input type="radio" aria-hidden="true" name="speakers" id="speaker--8">
      <span class="slide__wrapper">
        <span class="slide__content">
          <span class="speaker">
            <span class="speaker__image">
              <img src="./andrea-piacquadio.png" alt="" width="720" height="720" />
            </span>
            <span class="speaker__info">
              <span class="speaker__title">President, Product and Business, Stripe</span>
              <span class="speaker__name">Joe Bloggs</span>
            </span>
          </span>
        </span>
      </span>
    </label>
  </li>
  <li>
    <span class="speaker__details sr-only"></span>
    <label aria-hidden="true" for="speaker--9">
      <input type="radio" aria-hidden=&qu.........完整代码请登录后点击上方下载按钮下载查看

网友评论0