Budżet: 500 UAH Termin: 1 dzień
Сделаю
= -= =- =- =- =- =- =- =- =- = -= -= - =-= -=- = -= -= -= -= -= -=- =- =-
Не переходит по указанным ссылкам в слайдере, нужно чтобы при клике на ссылку переходили.
| <div class="container"> | |
| <div class="slider"> | |
| <div class="slider__wrapper"> | |
| <div class="slider__item"> | |
| <div class="slider__content"> | |
| <div class="slider__content_header"> | |
| <img class="slider__content_img" src="https://happy-travel.kz/upload/userfiles/images/osobennosti-otdykha-v-period-ramadan.jpg" title="Особенности отдыха в период Рамадана в ОАЭ, Турция, Египет, Тунис" alt="Особенности отдыха в период Рамадана" > | |
| </div> | |
| <p class="slider__content_title"><a class="sl" href="https://happy-travel.kz/article/osobennosti-otdykha-v-period-ramadan.php">Особенности отдыха в период Рамадана</a></p> | |
| </div> | |
| </div> | |
| <div class="slider__item"> | |
| <div class="slider__content"> | |
| <div class="slider__content_header"> | |
| <img class="slider__content_img" src="https://happy-travel.kz/i/dubai-food-uae.jpg" title="Сколько стоит покушать в Дубаи за пределами отеля" alt="Цены на еду в Дубае" > | |
| </div> | |
| <p class="slider__content_title"><a class="sl" href="/uae/skolko-stoit-pokushat-v-dubai-za-predelami-otelya.php">Сколько стоит поесть в ОАЭ вне отеля</a></p> | |
| </div> | |
| </div> | |
| <div class="slider__item"> | |
| <div class="slider__content"> | |
| <div class="slider__content_header"> | |
| <img class="slider__content_img" src="/i/festival-tyulpanov-stambul.jpg" Title="Стамбульский Фестиваль Тюльпанов" alt="Фестиваль Тюльпанов"> | |
| </div> | |
| <p class="slider__content_title"><a class="sl" href="https://happy-travel.kz/turkey/festival_tyulpanov.php">Фестиваль Тюльпанов</a></p> | |
| </div> | |
| </div> | |
| <div class="slider__item"> | |
| <div class="slider__content"> | |
| <div class="slider__content_header"> | |
| <img class="slider__content_img" src="https://happy-travel.kz/i/paris.jpg" Title="6 топ-мест к посещению во Франции" alt="Самые значимые места во Франции"> | |
| </div> | |
| <p class="slider__content_title"><a class="sl" href="https://happy-travel.kz/france/index.php">6 топ-мест к посещению во Франции </a></p> | |
| </div> | |
| </div> | |
| <div class="slider__item"> | |
| <div class="slider__content"> | |
| <div class="slider__content_header"> | |
| <img class="slider__content_img" src="https://happy-travel.kz/i/luchshie-semeynye-oteli-v-turtsii.jpg" Title="Лучшие отелей для семейного отдыха в Турции" alt="Топ-10 отелей для семейного отдыха в Турции"> | |
| </div> | |
| <p class="slider__content_title"><a class="sl" href="https://happy-travel.kz/turkey/top-10-family-hotels.php">Топ-10 семейных отелей Турции</a></p> | |
| </div> | |
| </div> | |
| <div class="slider__item"> | |
| <div class="slider__content"> | |
| <div class="slider__content_header"> | |
| <img class="slider__content_img" src="https://happy-travel.kz/i/top10-molodejnyh-otelei-turcii.jpg" Title="Топ-10 отели Турции для молодежи 2019" alt="Топ-10 молодежных отелей Турции"> | |
| </div> | |
| <p class="slider__content_title"><a class="sl" href="https://happy-travel.kz/turkey/top10hotels.php">Топ-10 молодежных отелей Турции</a></p> | |
| </div> | |
| </div> | |
| <div class="slider__item"> | |
| <div class="slider__content"> | |
| <div class="slider__content_header"> | |
| <img class="slider__content_img" src="https://happy-travel.kz/i/turkey-kappadokiya.jpg" Title="Туры в Каппадокию из Алматы" alt="Туры в Каппадокию"> | |
| </div> | |
| <p class="slider__content_title"><a class="sl" href="https://happy-travel.kz/turkey/%D0%BA%D0%B0%D0%BF%D0%BF%D0%B0%D0%B4%D0%BE%D0%BA%D0%B8%D1%8F.php">Туры в Каппадокию</a></p> | |
| </div> | |
| </div> | |
| <div class="slider__item"> | |
| <div class="slider__content"> | |
| <div class="slider__content_header"> | |
| <img class="slider__content_img" src="/i/10-poleznyh-prilozhenija-dlja-puteshestvij.jpg" Title="10 самых полезных приложений для путешественников" alt="10 полезных приложений для путешественников"> | |
| </div> | |
| <p class="slider__content_title"><a class="sl" href="/ru/sovety/apps.php">10 полезных приложений для путешественников</a></p> | |
| </div> | |
| </div> | |
| </div> | |
| <a class="slider__control slider__control_left" role="button"></a> | |
| <a class="slider__control slider__control_right" role="button"></a> | |
| </div> | |
| </div> | |
<script> 'use strict';
var multiItemSlider = (function () {
function _isElementVisible(element) {
var rect = element.getBoundingClientRect(),
vWidth = window.innerWidth || doc.documentElement.clientWidth,
vHeight = window.innerHeight || doc.documentElement.clientHeight,
elemFromPoint = function (x, y) { return document.elementFromPoint(x, y) };
if (rect.right < 0 || rect.bottom < 0
|| rect.left > vWidth || rect.top > vHeight)
return false;
return (
element.contains(elemFromPoint(rect.left, rect.top))
|| element.contains(elemFromPoint(rect.right, rect.top))
|| element.contains(elemFromPoint(rect.right, rect.bottom))
|| element.contains(elemFromPoint(rect.left, rect.bottom))
);
}
return function (selector, config) {
var
_mainElement = document.querySelector(selector),
_sliderWrapper = _mainElement.querySelector('.slider__wrapper'),
_sliderItems = _mainElement.querySelectorAll('.slider__item'),
_sliderControls = _mainElement.querySelectorAll('.slider__control'),
_sliderControlLeft = _mainElement.querySelector('.slider__control_left'),
_sliderControlRight = _mainElement.querySelector('.slider__control_right'),
_wrapperWidth = parseFloat(getComputedStyle(_sliderWrapper).width),
_itemWidth = parseFloat(getComputedStyle(_sliderItems[0]).width),
_html = _mainElement.innerHTML,
_positionLeftItem = 0,
_transform = 0,
_step = _itemWidth / _wrapperWidth * 100,
_items = [],
_interval = 0,
_states = [
{ active: false, minWidth: 0, count: 1 },
{ active: false, minWidth: 576, count: 2 },
{ active: false, minWidth: 992, count: 3 },
{ active: false, minWidth: 1200, count: 4 },
],
_config = {
isCycling: false,
direction: 'right',
interval: 5000,
pause: true
};
for (var key in config) {
if (key in _config) {
_config[key] = config[key];
}
}
_sliderItems.forEach(function (item, index) {
_items.push({ item: item, position: index, transform: 0 });
});
var _setActive = function () {
var _index = 0;
var width = parseFloat(document.body.clientWidth);
_states.forEach(function (item, index, arr) {
_states[index].active = false;
if (width >= _states[index].minWidth)
_index = index;
});
_states[_index].active = true;
}
var _getActive = function () {
var _index;
_states.forEach(function (item, index, arr) {
if (_states[index].active) {
_index = index;
}
});
return _index;
}
var position = {
getItemMin: function () {
var indexItem = 0;
_items.forEach(function (item, index) {
if (item.position < _items[indexItem].position) {
indexItem = index;
}
});
return indexItem;
},
getItemMax: function () {
var indexItem = 0;
_items.forEach(function (item, index) {
if (item.position > _items[indexItem].position) {
indexItem = index;
}
});
return indexItem;
},
getMin: function () {
return _items[position.getItemMin()].position;
},
getMax: function () {
return _items[position.getItemMax()].position;
}
}
var _transformItem = function (direction) {
var nextItem;
if (!_isElementVisible(_mainElement)) {
return;
}
if (direction === 'right') {
_positionLeftItem++;
if ((_positionLeftItem + _wrapperWidth / _itemWidth - 1) > position.getMax()) {
nextItem = position.getItemMin();
_items[nextItem].position = position.getMax() + 1;
_items[nextItem].transform += _items.length * 100;
_items[nextItem].item.style.transform = 'translateX(' + _items[nextItem].transform + '%)';
}
_transform -= _step;
}
if (direction === 'left') {
_positionLeftItem--;
if (_positionLeftItem < position.getMin()) {
nextItem = position.getItemMax();
_items[nextItem].position = position.getMin() - 1;
_items[nextItem].transform -= _items.length * 100;
_items[nextItem].item.style.transform = 'translateX(' + _items[nextItem].transform + '%)';
}
_transform += _step;
}
_sliderWrapper.style.transform = 'translateX(' + _transform + '%)';
}
var _cycle = function (direction) {
if (!_config.isCycling) {
return;
}
_interval = setInterval(function () {
_transformItem(direction);
}, _config.interval);
}
var _controlClick = function (e) {
e.preventDefault();
if (e.target.classList.contains('slider__control')) {
var direction = e.target.classList.contains('slider__control_right') ? 'right' : 'left';
_transformItem(direction);
clearInterval(_interval);
_cycle(_config.direction);
}
};
var _handleVisibilityChange = function () {
if (document.visibilityState === "hidden") {
clearInterval(_interval);
} else {
clearInterval(_interval);
_cycle(_config.direction);
}
}
var _refresh = function () {
clearInterval(_interval);
_mainElement.innerHTML = _html;
_sliderWrapper = _mainElement.querySelector('.slider__wrapper');
_sliderItems = _mainElement.querySelectorAll('.slider__item');
_sliderControls = _mainElement.querySelectorAll('.slider__control');
_sliderControlLeft = _mainElement.querySelector('.slider__control_left');
_sliderControlRight = _mainElement.querySelector('.slider__control_right');
_wrapperWidth = parseFloat(getComputedStyle(_sliderWrapper).width);
_itemWidth = parseFloat(getComputedStyle(_sliderItems[0]).width);
_positionLeftItem = 0;
_transform = 0;
_step = _itemWidth / _wrapperWidth * 100;
_items = [];
_sliderItems.forEach(function (item, index) {
_items.push({ item: item, position: index, transform: 0 });
});
}
var _setUpListeners = function () {
_mainElement.addEventListener('click', _controlClick);
if (_config.pause && _config.isCycling) {
_mainElement.addEventListener('mouseenter', function () {
clearInterval(_interval);
});
_mainElement.addEventListener('mouseleave', function () {
clearInterval(_interval);
_cycle(_config.direction);
});
}
document.addEventListener('visibilitychange', _handleVisibilityChange, false);
window.addEventListener('resize', function () {
var
_index = 0,
width = parseFloat(document.body.clientWidth);
_states.forEach(function (item, index, arr) {
if (width >= _states[index].minWidth)
_index = index;
});
if (_index !== _getActive()) {
_setActive();
_refresh();
}
});
}
// инициализация
_setUpListeners();
if (document.visibilityState === "visible") {
_cycle(_config.direction);
}
_setActive();
return {
right: function () {
_transformItem('right');
},
left: function () {
_transformItem('left');
},
stop: function () {
_config.isCycling = false;
clearInterval(_interval);
},
cycle: function () {
_config.isCycling = true;
clearInterval(_interval);
_cycle();
}
}
}
}());
var slider = multiItemSlider('.slider', {
isCycling: true
})</script><style> /*! * chiefSlider (https://itchief.ru/lessons/php/feedback-form-for-website) * Copyright 2018 Alexander Maltsev * Licensed under MIT (https://github.com/itchief/feedback-form/blob/master/LICENSE) */ *, *::before, *::after { box-sizing: border-box; } body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; color: #fff; } .slider { position: relative; overflow: hidden; max-width: 1600px; margin: 0 auto; padding-left: 40px; padding-right: 40px; } .slider__wrapper { display: flex; transition: transform 0.6s ease; } .slider__item { flex: 0 0 100%; max-width: 100%; padding-left: 10px; padding-right: 10px; } @media (min-width: 576px) { .slider__item { flex: 0 0 50%; max-width: 50%; } } @media (min-width: 992px) { .slider__item { flex: 0 0 33.333333%; max-width: 33.333333%; } } @media (min-width: 1200px) { .slider__item { flex: 0 0 25%; max-width: 25%; } } .slider__control { position: absolute; top: 0; display: flex; align-items: center; justify-content: center; width: 50px; color: #fff; text-align: center; bottom: 0; background: #fff; } .slider__control:hover, .slider__control:focus { color: #fff; text-decoration: none; outline: 0; } .slider__control_left { left: 0; } .slider__control_right { right: 0; } .slider__control::before { content: ''; display: inline-block; width: 20px; height: 20px; background: transparent no-repeat center center; background-size: 100% 100%; } .slider__control_left::before { background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23424242' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"); } .slider__control_right::before { background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23424242' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"); } .slider__content_header { position: relative; } .slider__content_img { display: block; height: auto; max-width: 100%; } .slider__content_section { position: absolute; bottom: 0; left: 0; background: #009688; color: #fff; padding: 4px 8px; } .slider__content_title { background: #f5f5f5; color: #424242; white-space: normal; font-weight: 700; font-size: 20px; line-height: 1.3; padding: 10px 15px; margin: 0; height: 52px; } .slider__content_footer { background: #f5f5f5; display: flex; padding: 20px 15px; color: #616161; } .slider__content_avatar { flex: 0 0 40px; max-width: 40px; } .slider__content_photo { display: block; height: auto; max-width: 100%; border-radius: 50%; } .slider__content_author { margin-left: 8px; line-height: 40px; } .slider__content_icon { height: 18px; margin-top: 12px; margin-left: auto; } .slider__content_views { margin-left: 4px; line-height: 40px; } </style> |
Budżet: 500 UAH Termin: 1 dzień
Сделаю
= -= =- =- =- =- =- =- =- =- = -= -= - =-= -=- = -= -= -= -= -= -=- =- =-
Budżet: 200 UAH Termin: 1 dzień
Привет выполню сейчас
понял в чем проблема
@HacerTo118
c ув.Данил
Witam wszystkich, potrzebujemy stworzyć stronę internetową do organizacji wydarzeń i sprzedaży biletów. Możliwe opcje na gotowym szablonie, frameworku lub wasza propozycja. Preferowane, abyście mieli doświadczenie w tworzeniu stron internetowych do sprzedaży biletów. Przykłady stron prześlemy w prywatnych wiadomościach. W razie potrzeby stworzymy prototyp. Jeśli wcześniej pracowaliście nad tworzeniem podobnych stron, proszę o przesłanie przykładów w prywatnych wiadomościach. Szczegóły omówimy w prywatnych wiadomościach. Dziękuję i miłego dnia!
Co liczymy w projekcie: Zrealizowany PnL, ROI i Wskaźnik Wygranych dla portfeli kryptowalutowych - jak rentowny był portfel w handlu danym tokenem w wybranym okresie. Na jakich danych: historia transakcji on-chain portfela (swapy, przelewy tokenów) + cena rynkowa tokena w momencie każdej transakcji. Główne źródło danych - Moralis: dwa wywołania podczas początkowego załadowania portfela - natywne przelewy ETH i wszystkie przelewy tokenów ERC-20. Z czym porównujemy: Nansen.io - bierzemy jako wzorzec, porównujemy nasze obliczone metryki z tym, co pokazuje Nansen dla tych samych portfeli w tym samym okresie. Problem: nasze liczby znacznie różnią się od Nansen, i nie do końca rozumiemy, według jakich zasad część działań portfela powinna być klasyfikowana dla celów PnL. Należy poprawić obliczenia Zrealizowanego PnL, ROI i Wskaźnika Wygranych, aby zgadzały się z Nansenem. W zgłoszeniu proszę napisać: - doświadczenie w podobnych zadaniach - doświadczenie z Nansen - doświadczenie z Moralis - doświadczenie z DeFiLlama - doświadczenie z artykułami na temat operacji kryptowalutowych - przybliżony koszt i terminy poprawek
Strona działa na frameworku Next.js (opartym na React). Trzeba zrealizować wszystkie punkty zgodnie z TŻ. TŻ jest dołączone w pliku. Oczekuję na propozycje.
Strona do oceny: https://copy.eurobrands-shop.de/ Zadanie: naprawić błędy frontendowe na poziomie motywu Magento 2 / motyw Amasty: CSS/LESS/JS, mobilny, RTL, minicart, rozwijane menu językowe, przesunięcie układu/CLS. Format pracy: - bez lokalnego uruchamiania Magento; - praca przez DevTools + źródła motywu; - poprawki w plikach CSS/LESS/JS/template motywu; - wynik: diff / commit / archiwum zmienionych plików; - wdrożenie i budowa po naszej stronie; - praca przez bezpieczną transakcję; - NDA do przekazania źródeł/dostępów. Co należy sprawdzić i ocenić: 1. RTL / wersja arabska: - telefon w nagłówku wyświetla się niepoprawnie; - przesunięcia elementów w nagłówku, minicart, wishlist/konto, strona produktu; - marginesy, kierunek, unicode-bidi, pozycjonowanie. 2. Nagłówek: - rozwijane menu językowe; - koszyk/wishlist; - obszar kliknięcia ikon. 3. Minicart: - niestabilnie otwiera się na niektórych stronach; - sprawdzić Konsolę / Sieć / Nasłuchiwacze zdarzeń / dane klienta / z-index / nakładkę. 4. Mobilny: - etykiety koszyka/wishlist są zbyt duże; - blok Kategorii jest ściśnięty/obcięty; - mobilne menu / Menu-Konto. 5. Strona produktu: - przesunięcie układu / CLS obrazów; - Dodaj do koszyka / Ilość / BOX / PALLET w RTL. 6. Wishlist/konto: - /wishlist/ - /mwishlist/ - zakładki, przycisk Wstecz, przepełnienie liczników. Problemowe URL: - https://copy.eurobrands-shop.de/alpro - https://copy.eurobrands-shop.de/producers - https://copy.eurobrands-shop.de/wishlist/ - https://copy.eurobrands-shop.de/mwishlist/ W odpowiedzi napisz: 1. Czy masz doświadczenie z frontendem Magento 2? 2. Czy masz doświadczenie z RTL? 3. Ile godzin potrzebujesz na pierwszy etap? 4. Jaka jest cena? 5. Kiedy możesz zacząć? 6. Jakie dostępności są potrzebne? 7. Czy jesteś gotów pracować przez bezpieczną transakcję i podpisać NDA? Ważne: potrzebny jest konkretny wynik — poprawki lub techniczne wyjaśnienie dla każdego punktu: naprawione / nie reprodukuje się / nie jest problemem frontendowym.
Opis zamówienia: Poszukujemy doświadczonego frontend-dewelopera/specjalisty od OpenCart do optymalizacji szybkości ładowania strony (kategorie i karty produktów) zgodnie z wymaganiami Google Core Web Vitals. O projekcie: * CMS: OpenCart. * Specyfika: Strona działa w trybie katalogu (brak koszyka i składania zamówienia). * Zakres: 2900 pozycji. * Część serwerowa: Już zoptymalizowana (działa na OpenLiteSpeed). * Stos: Prace prowadzone są wyłącznie z kodem szablonu, modyfikatorami i frontendem. Bez pracy z bazą danych. Co należy zrobić (Zadanie techniczne): 1. Opóźnione ładowanie skryptów (Delay JS): * Problem: Zewnętrzne skrypty analityczne (GTM, Google Tag) blokują główny strumień na urządzeniach mobilnych przez około 4,3 sekundy. * Zadanie: Skonfigurować opóźnione uruchamianie tych skryptów. Skrypty powinny aktywować się ściśle po pierwszej akcji użytkownika (pierwsze przewinięcie, dotknięcie ekranu lub ruch myszą). * Ważne: Zbieranie statystyk, analityka i działanie reklamy muszą pozostać w pełnym zakresie. 2. Poprawa metryki CLS (Stabilność układu): * Problem: Strona "skacze" i przesuwa się podczas ładowania obrazków. * Zadanie: W plikach stylów lub szablonu motywu sztywno wpisać atrybuty HTML width i height dla wszystkich obrazów produktów w katalogu (listach) oraz kartach produktów. * Cel: Zarezerwować miejsce pod obrazki w drzewie DOM do ich faktycznego załadowania, aby uniemożliwić przesunięcie treści. Sprawdzić, aby responsywność (CSS) nie została uszkodzona. 3. Optymalizacja krytycznej ścieżki (LCP): * Zadanie: Wpisać dla głównego (najważniejszego) obrazu produktu na pierwszym ekranie tag fetchpriority="high". To da przeglądarce polecenie ładowania głównego zdjęcia produktu w priorytetowy sposób. Wymagania wobec wykonawcy i warunki przyjęcia: 1. Bez zbędnych modułów: Praca wykonywana jest czystym kodem/modyfikatorami, bez instalowania dodatkowych zewnętrznych lub płatnych wtyczek optymalizacyjnych. 2. Bezpieczeństwo i układ: Ponosisz pełną odpowiedzialność za układ. Po wprowadzeniu poprawek wizualne wyświetlanie strony na urządzeniach mobilnych i PC, a także funkcjonalność (filtry, przełączanie zdjęć w galerii, menu) muszą pozostać bez zmian. 3. Kryterium oddania pracy (DoD): Przedstawienie zrzutu ekranu oraz linku do żywego testu raportu Google PageSpeed Insights (dla wersji mobilnej). Wskaźnik wydajności nie może być niższy niż 75 punktów, a metryka CLS — nie więcej niż 0,1 (w zielonej strefie). Poprawki wprowadzać należy wyłącznie przez modyfikatory (OCMOD) lub kopię motywu, aby nie nadpisać aktualizacji jądra. W odpowiedzi proszę podać: 1. Czy miałeś doświadczenie w konfiguracji Delay JS właśnie dla GTM na OpenCart? 2. Termin realizacji zadania. 3. Koszt pracy.