Строка на любом устройстве и в центре, используя canvas или html, css

#javascript #html #jquery #css #html5-canvas

#javascript #HTML #jquery #css #html5-canvas

Вопрос:

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

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

 const c = document.getElementById("LineCanvas");
const drw = c.getContext("2d");
drw.beginPath();
drw.moveTo(10,45);
drw.lineTo(180,47);
drw.lineWidth = 5;
drw.strokeStyle = '#006400';
drw.stroke();
 

Если телефон выровнен по прямой, линия будет зеленой, иначе красной

Ответ №1:

чтобы нарисовать линию, вы можете использовать псевдоэлемент из HTML или body или любого определенного тега, который вы хотите использовать на определенной странице или щелкнуть, затем обновить поворот с помощью transform:rotate() ; или rotate3D()

пример (без javascript значения поворота должны быть взяты с вашего устройства через ваше приложение):

 let level = document.querySelector("#level");
document.querySelector("#spirit").onclick = function() {
  level.classList.toggle('show');
} 
 #level {
  width: 100vw;
  height: 100vh;
  position: fixed;
  top: 0;
  left: 0;
  display: none;
  pointer-events: none;
}

#level.show {
  display: block;
}

#level::before {
  content: '';
  position: absolute;
  width: 200vmax;
  margin: 0 -50vmax;
  border-top: 1px solid;
  box-shadow: 0 0 1px 5px #bee;
  top: 50%;
  transform: rotate(0deg);
}

#level.show~#spirit::before {
  content: 'Hide';
}

#level:not(.show)~#spirit::before {
  content: 'Show';
}


/* animation to fake phone device moving */

#level::before {
  animation: rt 10s infinite;
}

@keyframes rt {
  20% {
    transform: rotate3d(1, -1, 1, -0.25turn);
  }
  40% {
    transform: rotate3d(1, 1, 1, 0.5turn);
  }
  60% {
    transform: rotate3d(1, -1, 1, -0.75turn);
  }
  80% {
    transform: rotate3d(1, 1, -1, -0.5turn);
  }
} 
 <div id="level">
  <!-- to show on a single page or via js on user request -->
</div>
<button id="spirit" type=button> that spirit level</button> 

Комментарии:

1. Спасибо. Я попробую это сейчас.

2. Это здорово, я только что попробовал. Но проблема в том, что теперь это отображается на каждой отдельной странице. У меня есть домашняя страница, прежде чем пользователь перейдет к части уровня, если это имеет смысл.

3. Я хочу, чтобы это отображалось только тогда, когда пользователь выбирает использование «уровня духа», который затем приведет их на другую страницу, где будет использоваться эта строка

4. @ChristianKasongo я превратил его в фиксированный контейнер, который вы можете вставить на одну страницу или переключить Показать / скрыть.

5. добавил кнопку переключения для примера 😉

Ответ №2:

Хотя рисование линии с помощью canvas может работать, вам может показаться более простым нарисовать ее с помощью простого элемента div. Когда вы почувствуете наклон, вы можете изменить его цвет на красный и обратно на зеленый, если он ровный.

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

Когда вы знаете угол, который вы хотите, чтобы линия была наклонной, вызовите slope (n), где n — количество градусов. Я также добавил простую кнопку, чтобы пользователь мог выбрать, показывать строку или нет, но я ожидаю, что у вас будет свой собственный код для этого.

На любой странице, где вы хотите, чтобы пользователь мог показывать строку, поместите это в заголовок:

 <style>
* {
  margin: 0;
  padding: 0;
  }
.linecontainer {
  position: absolute;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  z-index: 99999;
} 
#line {
  width: 200vmax;
  height: 5px;
  position: relative;
  top: 50%;
  left: calc(50vw - 100vmax);
  transform: rotate(45deg);
  background-color:red;
}

.hideline {
  display: none;
  }
  
#showbtn {
  font-size: 20px;
  background-color: blue;
  color: white;
  height: 2em;
  width: auto;
  padding: 2px;
}

</style>
 

и поместите это в основную часть страницы:

 <div class="linecontainer">
  <div id="showbtn" onclick="document.getElementById('line').classList.toggle('hideline');">
    Click me to show/hide the line
  </div>
  <div id="line"></div>
</div>

<script>
function slope(deg) {
    let line = document.getElementById('line');
    line.style.backgroundColor = ( deg%180 == 0 ) ? 'green' : 'red';
    line.style.transform = 'rotate('   deg   'deg)';
}
</script>
 

Вот фрагмент, где вы можете показать линию под разными углами.

 function slope(deg) {
    let line = document.getElementById('line');
    line.style.backgroundColor = ( deg%180 == 0 ) ? 'green' : 'red';
    line.style.transform = 'rotate('   deg   'deg)';
} 
 * {
  margin: 0;
  padding: 0;
  }
.linecontainer {
  position: absolute;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  z-index: 99999;
} 
#line {
  width: 200vmax;
  height: 5px;
  position: relative;
  top: 50%;
  left: calc(50vw - 100vmax);
  transform: rotate(45deg);
  background-color:red;
}

.hideline {
  display: none;
  }
  
#showbtn {
  font-size: 20px;
  background-color: blue;
  color: white;
  height: 2em;
  width: auto;
  padding: 2px;
} 
 <div class="linecontainer">
  <div id="showbtn" onclick="document.getElementById('line').classList.toggle('hideline');">
    Click me to show/hide the line
  </div>
  <div id="line"></div>
</div>

<!-- this is just for the demo -->
<div style="background-#eeeeee;font-size: 20px;position:fixed;z-index:100000;bottom:0;left:0;">How many degrees do you want me to rotate? <input style="font-size:20px;"value="45" onchange="slope(this.value);"/></div> 

Комментарии:

1. Большое вам спасибо за то, что нашли время и помогли мне! это здорово !.. Большое спасибо.