CSS флип-карта: Как я могу активировать флип через вкладку, чтобы он был доступен с клавиатуры? - PullRequest
4 голосов
/ 17 июня 2020

Я нашел несколько отличных советов о том, как сделать флип-карту с CSS. У меня вопрос, как сделать эту клавиатуру доступной. Другими словами, для пользователя с ограниченными возможностями, который использует только клавиатуру, мы надеемся, что он сможет просто использовать кнопку вкладки (таким образом, фокус), и карточка будет перевернута, чтобы показать задний контент и позволить табуляцию для выбора ссылок на обратной стороне карты.

Я погуглил и нашел несколько предложений (см. jsfiddle ниже, где я их пробовал), но мне не удалось добиться успеха.

Вот отличный веб-сайт, который имеет эту функцию, но я не знаю, как они заставили ее работать: https://businessexpress.maryland.gov/

Обратите внимание, что если вы удерживаете вкладку на вышеуказанной странице, в конечном итоге ваши карты перевернутся, и затем вы можете переходить по ссылкам на них. Например, для первой флип-карты есть ссылка «/ plan», а затем есть дополнительные ссылки типа «/ plan / create-business-plan» и т. Д. c.

Обратите внимание, что я пытался добавить CSS в строку 21, что повлияет на псевдоклассы «активный» и «фокус». Но только при наведении курсора карта переворачивается. Я сказал sh, что переход к любой из ссылок перевернет карту, как в примере выше с maryland.gov.

Я включил здесь jsfiddle (есть небольшой элемент ввода, чтобы вы могли начать табуляции из него): https://jsfiddle.net/anrbhcmv/

HTML:

    <div id="content">
        <h1>Small Business Resources</h1>

    <input type="text">
    <br><br>

        <div class="flip-card">
            <div class="flip-card-inner">
                <a href="#" id="flip-card-inner">
                    <div class="flip-card-front">
                        <div>Card-front content</div>
                    </div>
                </a>
                <div class="flip-card-back">
                    <a href="https://www.google.com">Google</a>
                    <div>Text</div>
                </div>
            </div>
        </div>

    </div><!-- end #content -->

CSS:

/* The flip card container - set the width and height to whatever you want. We have added the border property to demonstrate that the flip itself goes out of the box on hover (remove perspective if you don't want the 3D effect */
.flip-card {
    background-color: transparent;
    width: 300px;
    height: 200px;
    // border: 1px solid #f1f1f1;
    // perspective: 1000px; /* Remove this if you don't want the 3D effect */
}

/* This container is needed to position the front and back side */
.flip-card-inner {
    position: relative;
    width: 100%;
    height: 100%;
    text-align: center;
    transition: transform 0.8s;
    transform-style: preserve-3d;
}

/* Do an horizontal flip when you move the mouse over the flip box container */
.flip-card:hover .flip-card-inner, .flip-card:active .flip-card-inner, .flip-card:focus .flip-card-inner{
    transform: rotateY(180deg);
}

/* Position the front and back side */
.flip-card-front, .flip-card-back {
    position: absolute;
    width: 100%;
    height: 100%;
    -webkit-backface-visibility: hidden; /* Safari */
    backface-visibility: hidden;
}

/* Style the front side (fallback if image is missing) */
.flip-card-front {
    background-color: #008CCC;
    background-color: azure;
    color: white;
    color: black;
}

/* Style the back side */
.flip-card-back {
    background-color: #99CC66;
    color: white;
    transform: rotateY(180deg);
}

Ответы [ 2 ]

4 голосов
/ 17 июня 2020

Вы можете использовать :focus-within псевдокласс :

.flip-card:focus-within .flip-card-inner

/* The flip card container - set the width and height to whatever you want. We have added the border property to demonstrate that the flip itself goes out of the box on hover (remove perspective if you don't want the 3D effect */

.flip-card {
  background-color: transparent;
  width: 300px;
  height: 200px;
  // border: 1px solid #f1f1f1;
  // perspective: 1000px; /* Remove this if you don't want the 3D effect */
}


/* This container is needed to position the front and back side */

.flip-card-inner {
  position: relative;
  width: 100%;
  height: 100%;
  text-align: center;
  transition: transform 0.8s;
  transform-style: preserve-3d;
}


/* Do an horizontal flip when you move the mouse over the flip box container */

.flip-card:hover .flip-card-inner,
.flip-card:focus-within .flip-card-inner,
.flip-card:active .flip-card-inner,
.flip-card:focus .flip-card-inner {
  transform: rotateY(180deg);
}


/* Position the front and back side */

.flip-card-front,
.flip-card-back {
  position: absolute;
  width: 100%;
  height: 100%;
  -webkit-backface-visibility: hidden;
  /* Safari */
  backface-visibility: hidden;
}


/* Style the front side (fallback if image is missing) */

.flip-card-front {
  background-color: #008CCC;
  background-color: azure;
  color: white;
  color: black;
}


/* Style the back side */

.flip-card-back {
  background-color: #99CC66;
  color: white;
  transform: rotateY(180deg);
}
<div id="content">
  <h1>Small Business Resources</h1>

  <input type="text">
  <br><br>

  <div class="flip-card">
    <div class="flip-card-inner">
      <a href="#" id="flip-card-inner">
        <div class="flip-card-front">
          <div>Card-front content</div>
        </div>
      </a>
      <div class="flip-card-back">
        <a href="https://www.google.com">Google</a>
        <div>Text</div>
      </div>
    </div>
  </div>

</div>
<!-- end #content -->
1 голос
/ 17 июня 2020

Пожалуйста, не используйте просто focus-within, как предлагается (*).

Он не имеет не поддерживается в Inte rnet Explorer , что является большой проблемой, поскольку этот вопрос отмечен как «доступность».

В то время как Inte rnet Explorer обычно не является проблемой, около 11% пользователей программ чтения с экрана используют IE 11, а еще 1,5% используют IE 9 и 10. .

Также имейте в виду, что около 25% пользователей программ чтения с экрана не слепые. , поэтому важно убедиться, что визуальное восприятие соответствует опыту чтения с экрана. (на случай, если вам интересно, почему это имеет значение, если карта вращается для пользователя программы чтения с экрана.)

Ниже приводится очень приблизительная идея обходного пути, который должен быть достаточно гибким, он полагается на родителя элемент, имеющий уникальный класс в его нынешнем виде, но это можно легко исправить, если у вас их много, это только пример для начала.

Приведенный ниже код должен быть полностью совместимым в IE9 (пожалуйста, ch (eck, возможно, я допустил небольшую ошибку), увеличив охват вашего браузера с 89% до примерно 97%, то есть на 10%.

CSS - также проверьте настройки CSS, я добавил два отдельных элемента, один - это селектор .flip-card.focus-within .flip-card-inner для класса, который мы добавляем к родительскому для выполнения поворота.

Другой - @media (prefers-reduced-motion) для переключения выключить анимацию вращения, если пользователь установил свои пользовательские настройки на «уменьшенную анимацию», это еще одно улучшение доступности.

Я не часто выступаю за решение JavaScript вместо CSS, но Боюсь, что в этом случае мы все еще ограничены старыми браузерами.

function addListeners(parentClass){
    var focusableItems = ['a[href]', 'area[href]', 'input:not([disabled])', 'select:not([disabled])', 'textarea:not([disabled])', 'button:not([disabled])', '[tabindex="0"]'];
    for (i = 0, leni = focusableItems.length; i < leni; i++) {
        var focusableElements = document.querySelectorAll("." + parentClass + " " + focusableItems[i]);
        for (j = 0, lenj = focusableElements.length; j < lenj; j++) {
            focusableElements[j].addEventListener("focus", function() {
              document.querySelector("." + parentClass).classList.add("focus-within");
            });
            focusableElements[j].addEventListener("blur", function() {
              document.querySelector("." + parentClass).classList.remove("focus-within");
            });
        }
    }
}
addListeners("flip-card");
/* The flip card container - set the width and height to whatever you want. We have added the border property to demonstrate that the flip itself goes out of the box on hover (remove perspective if you don't want the 3D effect */
.flip-card {
    background-color: transparent;
    width: 300px;
    height: 200px;
    // border: 1px solid #f1f1f1;
    // perspective: 1000px; /* Remove this if you don't want the 3D effect */
}

/* This container is needed to position the front and back side */
.flip-card-inner {
    position: relative;
    width: 100%;
    height: 100%;
    text-align: center;
    transition: transform 0.8s;
    transform-style: preserve-3d;
}

/* Do an horizontal flip when you move the mouse over the flip box container */
.flip-card:hover .flip-card-inner, .flip-card:active .flip-card-inner, .flip-card:focus .flip-card-inner{
    transform: rotateY(180deg);
}

/* Position the front and back side */
.flip-card-front, .flip-card-back {
    position: absolute;
    width: 100%;
    height: 100%;
    -webkit-backface-visibility: hidden; /* Safari */
    backface-visibility: hidden;
}

/* Style the front side (fallback if image is missing) */
.flip-card-front {
    background-color: #008CCC;
    background-color: azure;
    color: white;
    color: black;
}

/* Style the back side */
.flip-card-back {
    background-color: #99CC66;
    color: white;
    transform: rotateY(180deg);
}

/* New CSS selector */
.flip-card.focus-within .flip-card-inner{
    transform: rotateY(180deg);
}

@media (prefers-reduced-motion) {
    .flip-card-inner {
        transition: transform none;
    }

}
<div id="content">
        <h1>Small Business Resources</h1>

    <input type="text">
    <br><br>

        <div class="flip-card">
            <div class="flip-card-inner">
                <a href="#" id="flip-card-inner">
                    <div class="flip-card-front">
                        <div>Card-front content</div>
                    </div>
                </a>
                <div class="flip-card-back">
                    <a href="https://www.google.com">Google</a>
                    <div>Text</div>
                </div>
            </div>
        </div>

    </div><!-- end #content -->

(*) Альтернативный маршрут с полифилом

Я нашел focus-within полифилл , у меня нет Не проверял, будет ли он работать в IE9 и 10, но я считаю разумным компромиссом поддерживать только IE11 для большинства компаний, и, похоже, он работает в IE11.

Мы по-прежнему поддерживаем IE9, где можем, поэтому я включил приведенный выше фрагмент кода (плюс он меньше JS, поэтому лучше для производительности).

...