CSS transformX и dir rtl

У меня есть контейнер с полями, который перемещается слева направо в пределах границ (например, прокрутка миниатюр) с помощью transformX при нажатии кнопки. Контейнер начинается с transform: translateX (0px) ;. Я использую значения px для translateX, и моя математика основана на этом. Проблема в том, что когда я тестирую сайт dir = rtl, контейнер переворачивается. Каким будет самый простой способ управлять направлением RTL? Я почти уверен, что даже не хочу знать каталог в javascript.

Это грубая презентация, это не слайд или что-то в этом роде, просто для пояснения.

.wrap {
  position: absolute;
  left: 0;
  top: 0;
  width: 500px;
  height: 100px;
  overflow: hidden;
}

.container {
  position: absolute;
  width: 1450px;
  transform: translateX(0px);
}

.box {
  position: relative;
  float: left;
  width: 100px;
  height: 100px;
  margin-right: 1px;
  background: red;
}
<html dir = "rtl">

<div class = "wrap">
  <div class = "container">
    <div class = "box">1</div>
    <div class = "box">2</div>
    <div class = "box">3</div>
    <div class = "box">4</div>
    <div class = "box">5</div>
    <div class = "box">6</div>
    <div class = "box">7</div>
    <div class = "box">8</div>
    <div class = "box">9</div>
    <div class = "box">10</div>
    <div class = "box">11</div>
    <div class = "box">12</div>
    <div class = "box">13</div>
    <div class = "box">14</div>
  </div>
</div>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 477
3

Ответы 3

Используйте CSS для определения RTL и переопределения необходимых значений:

[dir = "rtl"] .wrap {
    ...
}

[dir = "rtl"] .container {
    ...
}

[dir = "rtl"] .box {
    ...
}

В зависимости от того, чего вы хотите достичь, вы можете просто использовать отрицательные значения тех же размеров пикселей для translateX. Вам также может потребоваться переопределить любые стили с фокусом влево или вправо (left, margin-right, float и т. д.)

Откуда мне вообще знать, что dir - это rtl в javascript?

Toniq 25.10.2018 02:21

Один из способов определить значение атрибута dir в теге <html>: document.documentElement.getAttribute("dir");

Dave 25.10.2018 15:32

Я думаю, проблема в том, что вы используете float:left, я модифицировал ваш css for box, чтобы использовать display:inline-block, посмотрите, подходит ли это вам.

.wrap {
  position: absolute;
  width: 400px;
  height: 100px;
  overflow: hidden;
}

.container {
  position: absolute;
  width: 1450px;
  transform: translateX(500px);

}

.box {
  position: relative;
  display:inline-block;
  width: 100px;
  height: 100px;
  margin-right: 1px;
  background: red;
}
<html dir = "rtl">

<div class = "wrap">
  <div class = "container">
    <div class = "box">1</div>
    <div class = "box">2</div>
    <div class = "box">3</div>
    <div class = "box">4</div>
    <div class = "box">5</div>
    <div class = "box">6</div>
    <div class = "box">7</div>
    <div class = "box">8</div>
    <div class = "box">9</div>
    <div class = "box">10</div>
    <div class = "box">11</div>
    <div class = "box">12</div>
    <div class = "box">13</div>
    <div class = "box">14</div>
  </div>
</div>

Я действительно добавил left: 0; на контейнере и его работа теперь без каких-либо других изменений.

Toniq 25.10.2018 18:50

Вам не нужен float:left для .box css. Вместо этого добавьте display:inline-block;, он начнет работать в обоих направлениях.

См. Фрагмент ниже.

.wrap {
  position: absolute;
  left: 0;
  top: 0;
  width: 500px;
  height: 100px;
  overflow:hidden;
}

.container {
  position: absolute;
  width: 1450px;
  transform: translateX(0px);
}

.box {
  position: relative;
  width: 100px;
  height: 100px;
  margin-right: 1px;
  background: red;
  display:inline-block;
}
<html dir = "rtl">

<div class = "wrap">
  <div class = "container">
    <div class = "box">1</div>
    <div class = "box">2</div>
    <div class = "box">3</div>
    <div class = "box">4</div>
    <div class = "box">5</div>
    <div class = "box">6</div>
    <div class = "box">7</div>
    <div class = "box">8</div>
    <div class = "box">9</div>
    <div class = "box">10</div>
    <div class = "box">11</div>
    <div class = "box">12</div>
    <div class = "box">13</div>
    <div class = "box">14</div>
  </div>
</div>

Другие вопросы по теме